项目背景
我们做的是一款IM软件,嵌入在一个手机游戏平台的工程内部。之所以要采用react-native(后文简称RN)框架重构它,是因为现在游戏大厅上的所有游戏都是热更新的,为了也能让这个IM软件实现实时更新,减少IPA升级的次数,RN当然是不错的选择。
经过一个同事将近一年的预研以后,今年我们全面开启项目重构。奔着热更新和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的支撑,相信会发展的很好。
- 社区强大。看看github上的star数量,和开发成员数量,还是值得信赖的。
RN的不完善
容我吐槽一下,不完善的地方实在太多了,和原生开发体验来比,堪称天壤之别。RN现在的最新版本是0.46,我们工程中用的是0.42,毕竟还没上1.0呢。
去掉主观情感,下面列举一下部分不完善的点:
- 开发体验一般。
虽然js语法很灵活,但毕竟是脚本语言,调试起来还是不方便,不好查错。我们用的表现较好的vscode编辑器,就这都感觉各种跳转很不方便,动不动就得全局搜索,可能是xcode用习惯了吧。脚本语言的编写也会慢慢习惯吧。 - 文档很粗略
官网上的文档,就只是简单介绍用法和各个控件的属性,对细节的描述很少。当你遇到难解决的问题或者踩到坑了,上面基本找不到答案。 - 两个平台还没有完全统一
很多控件都是iOS专属,或者安卓专属。还有同一些控件,在不同平台上表现差异很大。 - 控件不完善
这个其实挺多的,最基本的ListView,功能缺失,坑很多。Text不支持富文本,动画,手势,ScrollView等等等等。不能一一列举。作为聊天软件,富文本功能必须实现啊,用于emoji表情和文字的混合显示。被迫自己搞了一套实现方案,现在还有点小bug。具体实现方案参考http://www.jb51.cc/article/p-xfwpkcuj-ys.html - 升级RN版本需要大动干戈。
- 要做出优质app需要花费大量人力和时间去打磨
跨平台,其实并没有减少开发成本,原来我们安卓和iOS各三个人,每次迭代都是有序进行。然而换了RN之后,6个人全上,做的累的啊,迭代慢,bug多。
总结
FaceBook也是想为开发者带去一套跨平台、动态更新的 Javascript 框架,口号是:Learn once,write anywhere:Build mobile apps with React。我觉得这是一个伟大的梦想。
2015年刚发布的时候,充满了期待和争议。发展到现在,RN也是逐渐在完善。前一段时间苹果发警告邮件的事情引起了大家的恐慌,不过以我看,RN还是安全的。从苹果的审核政策来看,允许运行于JavascriptCore的动态加载代码,并且没有去使用人家的私有方法。而且,现在使用RN的大公司挺多,尽管苹果高傲,但是要禁止RN的话,还是得掂量一下这些大企业的意见吧。
RN目前确实还不够成熟稳定,所以,想入坑的开发人员和决策者在入坑前得多权衡。
RN适合什么人或公司
- 迫切需要热更新功能
- 愿意投入人力和财力给RN
其他普通的应用,没那么迫切需要热更新的,就好好使用原生开发,毕竟原生的成熟度和稳定性要比RN好很多。