react-native技术的优劣(转)
前言
从2017年初开始到现在,使用React-Native做项目已经一年了。我们做的是一款IM软件,嵌入在一个手机游戏平台的工程内部。之所以要采用react-native(后文简称RN)框架重构它,是因为现在游戏大厅上的所有游戏都是热更新的,为了也能让这个IM软件实现实时更新,减少IPA升级的次数,RN当然是不错的选择。
经过一个同事将近一年的预研以后,2017年我们全面开启项目重构。奔着热更新和Write once, run everywhere,从此走上RN填坑之旅。
从ES6,css-layout,redux开始
我一直在从事iOS开发,用OC语言,接触到ES6还是挺新鲜的。语言风格和C系语言完全不是一个风格。参考阮一峰老师的教程http://es6.ruanyifeng.com/#docs/intro
RN采用标签式的界面布局,叫css-layout,和CSS基本一样。虽然是第一次使用这种方式布局界面,用熟之后觉得还是很方便的,代码量少,很直接。
聊天部分我们使用了redux架构,是JavaScript的一个状态机。参考http://www.redux.org.cn/index.html
RN的优势
-
调试方便
ipa安装好之后,就不需要频繁编译了,只需要reload一下,把js代码从云服务器下载下来就可以呈现改变代码后的效果。而且RN支持hotReload,在调试界面的时候非常方便,修改代码之后保存,界面就自动跟着变化,这一点在调试的时候实在很爽,不过有时候有点慢,需要reload。chrome在线调试也挺不错,可以打断点,看日志。虽然没有xcode或者Android Studio那么浑然一体,但是作为脚本语言的调试工具,也是很厉害了。 -
css-layout布局
这对于前端程序员来说,降低了不少学习成本,也大大减少了代码量。但是对于iOS或者安卓开发者来说,刚开始接触的时候,得接受一些思想上的转变。 -
跨平台
大多数代码,只需要写一套,安卓和iOS就都可以运行了,游戏逻辑和数据。界面上一部分有一些平台区分,毕竟是从react包装上来的。刚开始学iOS的时候,就想象着,要是有一种跨平台的开发形式就很6了,没想到过了几年就有了。跨平台理论上是可以减少开发成本的,减少开发人员数量,但是实际效果并不然,后面说。 -
热更新
这可能也是大多数公司选择使用RN的主要原因。频繁的app升级会让用户很烦,而且苹果的审核真是很麻烦。现在很多大型app都使用了RN,毕竟繁多的业务迭代,每次都通过APP审核,也算是噩梦啊。 -
有个好爹
有着Facebook的支撑,相信会发展的很好。
RN的不完善
容我吐槽一下,不完善的地方实在太多了,和原生开发体验来比,堪称天壤之别。RN现在的最新版本是0.46,我们工程中用的是0.42,毕竟还没上1.0呢。
去掉主观情感,下面列举一下部分不完善的点:
-
开发体验一般。
虽然js语法很灵活,但毕竟是脚本语言,调试起来还是不方便,不好查错。我们用的表现较好的vscode编辑器,就这都感觉各种跳转很不方便,动不动就得全局搜索,可能是xcode用习惯了吧。脚本语言的编写也会慢慢习惯吧。 -
文档很粗略
官网上的文档,就只是简单介绍用法和各个控件的属性,对细节的描述很少。当你遇到难解决的问题或者踩到坑了,上面基本找不到答案。 -
两个平台还没有完全统一
很多控件都是iOS专属,或者安卓专属。还有同一些控件,在不同平台上表现差异很大。 -
控件不完善
这个其实挺多的,最基本的ListView,功能缺失,坑很多。Text不支持富文本,动画,手势,ScrollView等等等等。不能一一列举。作为聊天软件,富文本功能必须实现啊,用于emoji表情和文字的混合显示。被迫自己搞了一套实现方案,现在还有点小bug。具体实现方案参考http://blog.csdn.net/gang544043963/article/details/70245850 -
升级RN版本需要大动干戈
近期我们做了一次RN版本升级,从原来的0.42升到最近的0.50。真的挺麻烦。新版把PropTyps从React中移了出来,那么之前的引用方式就得变,所有的文件挨个查。之前使用的第三方库,有和PropTyps相关的,都得一一更新。之前很多界面布局的时候,在image上放置了一些其他控件,升级后会报错,然后一一调整。 -
要做出优质app需要花费大量人力和时间去打磨
跨平台,其实并没有减少开发成本,原来我们安卓和iOS各三个人,每次迭代都是有序进行。然而换了RN之后,6个人全上,做的累的啊,迭代慢,bug多。
总结
FaceBook也是想为开发者带去一套跨平台、动态更新的 Javascript 框架,口号是:Learn once, write anywhere:Build mobile apps with React。我觉得这是一个伟大的梦想。
2015年刚发布的时候,充满了期待和争议。发展到现在,RN也是逐渐在完善。前一段时间苹果发警告邮件的事情引起了大家的恐慌,不过以我看,RN还是安全的。从苹果的审核政策来看,允许运行于JavascriptCore的动态加载代码,并且没有去使用人家的私有方法。而且,现在使用RN的大公司挺多,尽管苹果高傲,但是要禁止RN的话,还是得掂量一下这些大企业的意见吧。
RN目前确实还不够成熟稳定,所以,想入坑的开发人员和决策者在入坑前得多权衡。虽然作为技术开发者应该具备对新技术的敏锐嗅觉和快速学习能力,但是对于项目的技术更新,还得要根据实际情况,要慎重。用户体验,开发成本,是两个最重要的权衡指标。
毕竟,不管是react-native,JSPatch,还是其他人更新技术,从户用体验和开发体验来说,都是开倒车的。
RN适合什么人或公司
- 迫切需要热更新功能
- 愿意投入人力和财力给RN
其他普通的应用,没那么迫切需要热更新的,就好好使用原生开发,毕竟原生的成熟度和稳定性要比RN好很多。