选型RN理由?

目前各大公司技术栈都是native端(android,iOS)以及H5端,然而这两大传统的开发方式都各有优缺点,下面表格简单汇总一下。

- native端 web端 RN
开发效率
性能
灵活性
接入成本

从上面表格中可以看出native端高性能的代价是低开发效,低灵活性以及接入的高成本,主要归咎于需要同时开发android和iOS两套代码,而且上线成本高。H5的开发方式,受限于webView容器的瓶颈,在页面体验上和native有较大的差距。而RN就是整合native和H5的优点诞生的幸运儿。

RN的痛点

  1. 稳定版本是0.53,嗯,大版本还没有到1。RN发版频率基本5天一个小版本,所以如果线上环境跟随RN一起升级版本,只会疲于奔命,现在RN做的时间相对长一些的公司,比如去哪儿网,58,腾讯的RN版本基本都是在0.50以下,选择一个版本深度定制化。转转做RN是从17年4月份开始的,我们刚开始做RN选择0.44.0版本,后来因为android系统8的出现,RN0.50才开始支持android8,所以我们果断升级为RN0.50.3。

  2. RN框架不支持web端。转转结合社区定制化了自己的转转三端同步方案。

  3. RN原生不支持热更新,虽然有一些比较成熟的比如微软的CodePush。

  4. RN原生的API不足,比如视频上传,播放,文件上传等功能不支持。

如上痛点决定了想要像开发H5一样,顺手的开发RN项目,提前还需要做一番准备,工欲善其事,必先利其器。

拆分打包以及加载顺序

在RN0.50.3基础上,把base部分拆分出来,每个业务线有自己对应的bundle。加载过程是,刚启动App的时候,预加载base部分,同时开始进行热更新逻辑,但进入具体RN业务线的时候,开始加载业务线自己对应的bundle。

热更新 + 集成开发

如果没有热更新,感觉RN就失去了至少50%的价值,所以我们做了热更新管理系统,这个系统负责打包上线,管理bundle等功能。 热更新是通过native端调用接口,从cdn上得到下发的各业务线bundle,然后加载。

三端同步

我们三端同步实现方式是,通过webpack把RN开发项目,通过三端框架打包成H5项目,把诸如View,Text等native标签渲染为div,span等html规范标签。

实践中摸索

对RN的实践,目前我们主要经历两个阶段,第一个阶段我称作“大而全时代”,代表项目是转转内部的“客服中心”。第二个阶段我称作“删繁就简时代”,代表项目是“有好货”,下面从技术栈,路由,导航栏,是否拆包和RN版本等几个维度进行比较。

- 客服中心 有好货
技术栈 RN + redux + react-navigation RN
是否拆包
是否利用路由 是,利用react-navigation提供的路由 否,利用native跳转
RN版本 0.44.0 0.50.3
是否利用native导航栏 否,利用react-navigation提供的导航栏

客服中心:

有好货:

具体介绍:

客服中心是我们将RN应用到工程中的一次试点项目,从上图中可以看出页面之间跳转是非常频繁的,因此我们选择了react-navigation作为路由框架(单页面做多了,习惯了路由),同时利用redux管理全局的数据。后来, 因为跳转定位到指定页面的需求,我们放弃了前端路由的方案,统一利用native提供的跳转实现页面跳转,同时每个页面对应一个moduleName。

无限列表如何设计:

具体到项目里,有好货项目从截图中看出,页面整体滚动,当滚动过头图的时候,下拉组件部分吸顶,继续滚动的话,商品列表开始滚动。那么这种双层滚动的页面该如何设计呢?最开始我们通过在最外层用ScrollView包裹,然后商品列表是另一个ScrollView。

  1. // 外层滚动组件

  2. <ScrollView>

  3.  <Image />

  4.  <View />

  5.  // 商品列表滚动组件

  6.  <ScrollView>

  7.  </ScrollView>

  8. </ScrollView>

上面这种设计如果通过native端解决嵌套滚动的问题的话,貌似可以实现效果,但是如果内部的商品列表滚动组件我们用FlatList实现呢?

  1. // 外层滚动组件

  2. <ScrollView>

  3.  <Image />

  4.  <View />

  5.  // 商品列表滚动组件

  6.  <FlatList>

  7.  </FlatList>

  8. </ScrollView>

基本功能是可以实现的,但是滚动列表的时候通过AndroidStudio查看内存消耗情况,会发现内存一直在上涨,没有利用到FlatList的回收机制,原因是外层的ScrollView的OnScroll事件屏蔽了FlatList的OnScroll事件,导致FlatList的内存回收失效。所以我们舍弃了ScrollView嵌套FlatList的方式,丢掉ScrollView,只用FlatList来包裹,同时,把之前FlatList的兄弟组件作为FlatList组件的renderItem方式引入。

这样的做法就让滚动直接触发FlatList的事件, 利用FlatList的性能优势, 来解决这个问题, 释放了多屏滚动所消耗的内存, 使浏览页面如丝般顺滑, 具体就像下面这样:

  1. // 商品列表滚动组件,Image组件和View组件都包含在FlatList组件中

  2. <FlatList>

  3. </FlatList>

具体实现方式是通过在renderItem函数中,通过data的type类型决定渲染不同的item组件。

  1. renderItem ({item, index}) {

  2.    const {isLoading} = this.state;

  3.    switch (item.type){

  4.        case "Picbanner":

  5.            const {banners} = item;

  6.            return (

  7.                <PicBanner data={item.banners} callback={(height) => (this._picBannerHeight = height)} />

  8.            );

  9.        case "tabMenus":

  10.            const {selectMenu, tabs} = item;

  11.            return (

  12.                <View>

  13.                    <SelectMenu

  14.                        menu={selectMenu}

  15.                        changeMenu={(clickOpts) => this.handleClick(clickOpts)}

  16.                        handleSortCall={(sortPart) => this.handleSortCall(sortPart)}

  17.                        handleBackupPress={() => this.handleBackupPress()}

  18.                    />

  19.                </View>

  20.            );

  21.        default:

  22.            return (

  23.                <Item key={index} item={item} onPressItem={this._onPressItem}></Item>

  24.            )

  25.    }

  26. }

这样做的好处是既可以避免Native端提供嵌套滚动组件,也可以充分利用FlatList的内存回收功能。

说到这, 感觉告一段落了, 我们需要做的还有很多, 包括我们考虑RN应该最适用于什么场景, 或者说究竟我们没有遇到的坑到底有多少, 再换个角度说我们究竟解决什么问题和提高了多少效率, 这些都是我们后面要继续探索和思考的问题。也希望大家积极的给我们提一些意见和想法, 也欢迎大家加入我们的团队, 大家一起学习进步。

转转RN工程化历程的更多相关文章

  1. 【杂谈】RN的一点回顾与未来的展望

    从开始到现在,笔者接触RN已经接近半年,适逢各种变化的发生,于是,简单的遐想了一下RN的未来. Airbnb在今年早些时候,宣布了放弃继续使用RN,并且发布了一篇“React Native at Ai ...

  2. 【wp】2021MAR-DASCTF_逆向

    昨天打完的MAR DASCTF,来复个盘~ 不过就re做了3/4然后有事提前开溜了hhh,拿了drinkSomeTea和replace的三血心满意足(蜜汁三血执念. 感觉这回的出题人好喜欢TEA啊(正 ...

  3. 【react native】有关入坑3个月RN的心路历程

    由于一些原因,笔者最近变更到了RN的团队,回归到了hybrid app的开发的圈子中,固然是有蛮多新鲜感和新机遇的,不过遥想起以前在hybrid中各种view之前跳转的头疼等各种问题,笔者怀着忐忑的心 ...

  4. 自娱自乐RN版小说APP历程记录

    当前rn版本 "react": "16.6.3" "react-native": "0.58.5" 通过react-na ...

  5. 《Node.js在CLI下的工程化体系实践》成都OSC源创汇分享总结

    背景: 随着开发团队规模不断发展壮大,在人员增加的同时也带来了协作成本的增加,业务项目越来越多,类型也各不相同.常见的类型有组件类.活动类.基于React+redux的业务项目.RN项目.Node.j ...

  6. 腾讯IVWEB前端工程化工具feflow思考与实践

    本篇文章主要介绍腾讯IVWEB团队从0到1在工程化的思考和实践.feflow的全称是Front-end flow(前端工作流),致力于提升研发效率和规范的工程化解决方案.愿景是通过feflow,可以使 ...

  7. 《Node.js在CLI下的工程化体系实践》成都OSC源创会分享总结

    背景: 随着开发团队规模不断发展壮大,在人员增加的同时也带来了协作成本的增加,业务项目越来越多,类型也各不相同.常见的类型有组件类.活动类.基于React+redux的业务项目.RN项目.Node.j ...

  8. [转] open-falcon编写的整个脑洞历程

    [From] https://mp.weixin.qq.com/s?__biz=MjM5OTcxMzE0MQ==&mid=400225178&idx=1&sn=c98609a9 ...

  9. JS高级学习历程-6

    PHP菜鸟学习历程-6 [闭包案例] 1 闭包创建数组 <!DOCTYPE html> <html lang="en"> <head> < ...

随机推荐

  1. laravel-更换语言包

    第一步:找语言包 找到比较靠谱的语言包(根据下载量与收藏量综合判断),而且要是laravel的 扩展的链接:https://packagist.org/packages/caouecs/laravel ...

  2. 文件操作命令(replace)

    Replace 命令: // 描述: 替换文件. // 语法: REPLACE [drive1:][path1]filename [drive2:][path2] [/A] [/P] [/R] [/W ...

  3. SHELL脚本学习-练习写一个脚本3

    #通过ping命令测试192.168.1段的所有主机是否在线,如果在线就显示is up并显示蓝色,如果不在线就显示is down. #!/bin/bash #Program Description: ...

  4. 上传本地文件到github

    第一步:创建新的仓库 勾选Initialize this repository with a README选项,自动创建REAMDE.md文件. 第二步: $ git config --global ...

  5. python Strip函数和Split函数的用法总结 (python2.0,但用法与3.0是差不多的)

    strip函数原型 声明:s为字符串,rm为要删除的字符序列. 只能删除开头或是结尾的字符或是字符串.不能删除中间的字符或是字符串. s.strip(rm)        删除s字符串中开头.结尾处, ...

  6. 15. Life Cycle of the Products 产品的生命周期

    15. Life Cycle of the Products 产品的生命周期 (1) We can see how the product life cycle works by looking at ...

  7. go 函数类型

    在go中,函数也可以被当成数据类型 e.g:下面有两个函数,+.-,然后定义了一个函数类型FuncType1,然后对funcType1附于不同的函数,则funcType1就可以执行相应的函数 pack ...

  8. 关于n维和n-1维欧式空间

    我们从小就说,"点动成线,线动成面,面动成体",其中的空间的概念到底是啥?之前没有好好想过,在机器学习中多次遇到"空间"."超平面",&qu ...

  9. BP神经网络 详解模板

    %原始数据输入 P=[ - 6.142 - 27.5 5.068 - 31.7 5.196 - 34.1 6.362 - 31.54 6.472 - 30.17 6.578 - 29.53 6.351 ...

  10. 转:酷我音乐API

    酷我音乐API 本次分析的是酷我音乐API 歌曲搜索API:http://search.kuwo.cn/r.s?all={0}&ft=music&itemset=web_2013&am ...