本文从技术决策讲起,聊聊我们为什么要使用 React Native、如何使用、以及其他维度的思考。
文中将用 「RN」 代表 「React Native」。

技术选型是一个复杂的过程,必须谨慎并保持敬畏,需要根据项目的实际情况而定。这关系到项目的命运。
简单介绍一下 RN。大家都知道 Android 和 iOS 两大移动操作系统,他们各自为营,互不相通。Android 的开发语言是 Java 和 Kotlin,iOS 的开发语言是 OC 和 Swift 。开发一款应用需要两支开发队伍。然后就有人思考,能否通过一种技术手段将 Android 和 iOS 统一起来?先后有多种解决方案诞生,最终 RN 以绝对优势脱颖而出。它是一个由 Facebook 于 2015 年 9 月发布的一款开源的 JavaScript 框架,它可以让开发者使用 JavaScript 和 React 来开发跨平台的移动应用。它既保留了 React 的开发效率,又同时拥有 Native 应用的良好体验,加上 Virtual DOM 跨平台的优势,实现了真正意义上的:Learn Once,Write Anywhere. React Native · Learn once, write anywhere
我在2017年第一次接触 RN,那时候还是 0.41 的版本。前前后后用它构建过四五个项目,和它打交道也三四年了。现在的最新版本已经是0.67了,亲眼见证它越来越完善的过程。
RN 的优势很明显,跨平台、热更新、调试方便等等,这里就不展开了。
但也有一些劣势值得注意,比如功能相比原生不够完善,文档相对粗略,用户体验略输原生等。
大多数情况下,对于中小型项目和创业公司来说,RN 会带来很好的收益。
更多分析请看这里。
我们现在有两款应用,好比打车软件的司机端和乘客端,支持Android 和 iOS 两个平台,所以线上总共有 4 个 App。这四个 App 属于中型偏小规模,但已经有 6 岁了,期间经历过很多届开发者,现在已经变得不太好维护了。而且团队中 Android 开发人数长期不足,导致两个平台的进度和质量都存在巨大差异。
如果引入 RN,会给项目带来几点明显的收益:
这些收益点,是建立在一个核心出上的:我们的 app 适合用 RN 吗?
首先我们知道,我们的 app 规模属于中小型,没那么复杂。
其次,app 类型以数据展示为主,加上有 IM 功能的一个订单平台,它没有巨额的性能消耗和复杂的交互逻辑。
而且,app 没有和外设交互。
最后的结论,我们的工程是适合用 RN 的。
做技术选型时,风险是架构师或者技术决策者的必须仔细考虑的事情。
技术角度的风险:
公司角度的风险:
经过对上面提到的风险的分析,以及和公司高层的沟通。所有的顾虑一一被消灭,并得到了公司层面的大力支持。
关于 RN 和 Flutter 的讨论非常多,这里有一篇比较全面的对比 这里
对于我们来说,有四点足以让我们选择 RN:

我们现有的项目已经持续了六年了,现在要引入 RN。我们应该如何引入?有两个选择:
技术视角
从开发者视角来看,绿地模式开发体验更好,没有历史负担,更高效。
如果采用棕地模式,会增加很多额外工作和困难。
公司视角
如果采用绿地模式,那么在对齐现有功能之前,团队没有直观的阶段性输出。并且这个周期很长。如果失败,造成的损失很大。风险和短期成本较高。
如果采用宗地模式,团队容易产生阶段性成果,在尝试中前进,整体风险小。
项目现状
项目经历了六年的迭代,开发人员以及产品经历轮换了好几拨,很多功能细节没有详细记录,测试代码不全。一个 app 包含了多个产品团队。
如果采用绿地模式,不确定因素太多,沟通成本大,开发周期很难预估。
经过上面的分析,最终我们选用了相对安全保守的方案,采用棕地模式。
先从 app 的登录流程做起,毕竟它是相对独立的模块,且复杂度低。
本文基于真实项目案例,讲述了在选择使用 RN 框架之前的选型抉择过程。其中包括技术选型分析和项目实践方案分析过程,从不同角度分析其中的利弊。
本项目中在做技术选型分析的时候,省略了很多细节因素分析,例如, 社区活跃度、商业应用案例、成熟度分析、技术原理分析等。那是因为 RN 已经家喻户晓,并且结合我们现有的 RN 经验,可以省略部分繁琐的分析过程。
文末寄语:
所有的技术选型和框架选择,都应该基于项目的实际情况,从多方面去权衡利弊,而不仅仅是看哪个框架或语言更火、更酷炫。 -- 我说的。