跨端实践之造轮子

        最近随着使用ReactNative、公众号以及H5项目越来越多,为了统一开发技术及标准、提升逻辑模块的复用性、提升开发效率,于是开始设计一套解决上述问题的开发框架,目标就是一次开发,可以在ReactNative及WebBrowser中运行(未来的目标会支持在更多的容器上运行)。

一、找轮子

        大家看到这里可能会有个疑问,这种框架在世界上最大的男性交友网站上应该有一大堆,为什么还要造轮子?个人觉得技术框架,有能力自己打造还是要自己打造,我们可以去学习别人的思路,最好不要直接使用,即使做出来的轮子可能会有性能不好或者不好用等问题,但是自己打造的轮子是最可控的,正所谓知己知彼、可进可退。在经过一段时间的摸索了解,目前业界主流四种解决方案大致如下。

1. 由React.js转换到ReactNative。

        这个方案比较适合优先考虑H5的开发团队,由于ReactNative的样式是CSS3中的子集,这样子的转换是有损转换,可能会影响布局和功能。目前业界比较少使用这种方案,没找到有相关的资料,但是理论上应该是可以的。

2.封装一套抽象框架。

        这个方案就是在ReactNative及React.js的上层再抽象出一套开发框架,用于抹平两者之间的差异。类似于微软发布的ReactXP。这种方案适合于想要追求三端有较高的用户体验,但相关开发人员较少的团队。但是这个方案有不好的地方,就是增加了开发人员的学习成本,同时很多功能的实现也受限于抽象框架的完善程度,目前ReactXP对ReactNative组件的支持还是比较有限。

3.由ReactNative转换到React.js

        这种方案与第一种相反,它是优先在ReactNative中进行界面开发,优先保证App端的体验及完整性,然后再考虑Web端的可用性。正如上面所说的,由于ReactNative样式是CSS3中的子集,至少在转成H5的时候,不会丢失功能及属性,在可行性及可用性方案都会比较有保障,目前业界较多使用这个解决方案,GitHub上面也有很多开源的框架,例如淘宝的react-web,国外的react-native-web等,特别是react-native-web使用的用户也很多。但是这个方案也有缺点,就是依赖开源框架目前支持转换的组件,有些基础组件或者第三方转换的组件未必能及时跟进。再者,生成的Web页面的样式类名及样式可维护性较差。

4.用JSX语法(VUE也有),通过编译器编译对应的多平台

        这种方案就是利用JSX语法或者VUE的语法,这样子减少开发人员的学习成本,平台间的差异由编译器抹平解决,这个方案从兼容性、体验性来讲都会比较均衡,类似的框架有阿里的Weex和近期京东开源的Taro,这两个框架还没试用过暂时无法评论,但是从网友的一些反馈来讲,Weex坑多,且得靠自己消化,从Taro的宣传资料来看,Taro是基于京东的Nerv框架(类React.js,据说近期在申请专利,我有一个差不多的框架也在申请专利),对于掌握了React.js的开发技术的人员来讲基本可以无缝对接,但是与第三方组件对接上还未实现支持。

二、造轮子

        通过上面4种轮子的比对分析,结合目前团队需要业务组件及团队的技术结构 ,我想到了另外一种思路,就是接受移动端及Web端的平台间的差异,基于JSX语法(降低学习成本),重点关注复用业务组件层(代码多端复用),按照ReactNative目前已支持的组件及API进行抽象,封装成对应的Web组件、RN组件及API。同时为了保证Web端的体验,Web的样式与RN的样式分离,实现同一源码的页面可以在ReactNative上运行,也可以在WebBrowser上运行,以后如果业务需求需要引入小程序,那么可以通过基础组件库增加小程序组件进行兼容即可。此方案的难点在于如何解决样式问题,这个我将在后面单独写一篇我的踩坑心得来分享。基础架构图如下。

image

1.基础组件库封装

        通过抽象组件,以ReactNative组件为主,统一接口及属性。第三方组件也需要包装成为抽象组件,所有的业务组件都使用基础组件库,保证业务组件层可复用及可跨端。

2.封装基础组件样式

        Web端的样式与ReactNative端的样式是独立两套样式,主要是考虑到Web端的兼容性,RN的样式虽然是CSS3的子集,但是在Web端去应用的话就会有较多的兼容性问题,所以才考虑设计为独立的两套样式,在保证各端的体验性,又不增加过多的工作量。

3.封装API

        为了业务组件层的实现复用,还有一层API层需要处理,主要是像ReactNative中提供了很多Web端没有的API,例如导航、设备调用等,同样的H5中也有一些API是ReactNative中没有的,例如localStorage、sessionStorage等。这里采取与组件类似的处理方式即可,封装一层API抽象层,用于统一API接口调用。

4.封装路由及其他基础插件

        由于路由组件Web及ReactNative的版本的导出对象都不一样,所以也需要通过抽象接口实现统一。Ajax库直接复用我自己写的库,也可以使用第三方的库(ReactNative对这一块的设计比较周全,web的http请求可以平移,所以才可以复用Web上的Ajax库)。

三、结语

        目前这个方案已开始在项目中实施,在造轮子的过程中也总结到了很多有趣的东西,后续将陆续分享出来。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353

推荐阅读更多精彩内容