React Native与Flutter对比

6,457 阅读5分钟

React Native 与 Flutter 对比

热更新支持

热更新一直以来都是 RN 框架的卖点之一,无论是微软提供的 CodePush 服务还是各个大厂自己搭建的热更新平台,例如国内京东、携程都有非常成熟 RN 更新平台。而 Google 则完全没有计划支持 Flutter。 热更新功能,从目前了解的信息来看,京东 JDFlutter 在 Android 平台已经实现了热更新,但是实际效果和灵活程度还是远远不及 RN

这可能也是大多数公司选择使用RN的主要原因。频繁的app升级会让用户很烦,而且苹果的审核真是很麻烦。现在很多大型app都使用了RN,毕竟繁多的业务迭代,每次都通过APP审核,也算是噩梦啊。

JS VS Dart

  • RN 采用 JS 开发
  • Flutter 采用 Dart 开发

开发调试环境

  • 从工具链来说,两者都非常成熟、调试都非常方便
  • 从开发环境的搭建来看,尤其是集成到已有 APP 项目,RN相比Flutter要容易的多

原生混合开发支持

由于 RN 的组件原本就是通过原生 UI 系统进行渲染,所以可以非常容易的实现在原生页面中嵌入 RN 的 RootView 或者在 RN 页面中嵌入原生 UI 组件,对已有 APP 上进行混合开发支持非常友好。而 Flutter 因为无论是在原生页面中嵌入 FlutterView 或者在 Flutter 页面中嵌入原生 UI 组件,都会有内存或者性能等不少问题。目前国内实践比较多的是闲鱼团队,也开源了 FlutterBoost 项目尝试解决这个问题,但是官方始终还没有非常完美的解决方案。所以 Flutter 更适合在全新 APP 上使用。

框架稳定性

从团队实际使用 RN 和 Flutter 框架情况来看,RN 经过 4 年的发展和不断迭代,目前的稳定性和兼容性已经有了很大的改善。Github 上 open issue 只有 500 多,而且国内不少大厂例如京东、携程等也在大规模使用中,整体上稳定性已经到达生产环境的要求。但是由于 RN 整体架构设计的限制,还比较依赖原生组件,所以随着 Android、iOS 的系统迭代,未来还是需要持续的完善稳定性和兼容性。所以我们也建议大厂在应用 RN 框架的时候,能有专门的原生团队维护和优化 RN 引擎,可以带来最大的收益。Flutter 的版本号已经快速迭代到了 1.7,不过实际使用中遇到的问题还是比较多的,性能和稳定性方面还有很长的路要走,更让人担忧的是 Github 上有 7000 多的 open issue。而且 Flutter 引擎部分大量 C 代码,比较晦涩难懂,一般团队很难去优化进行稳定性加固。

开发者生态支持

RN 的 Github Star 已经达到了 80K,而且借助于 React 生态,有大量的第三方插件可以使用。微软、airbnb 等公司也贡献了大量高质量的插件,整个开发者生态非常完善和活跃。相比之下,Flutter 的生态刚刚处于早期阶段,虽然 Github Star 也已经有 72K,但是整体可用的第三方库的数量不如 RN。当然,我们也看到 Flutter 生态最近发展很快,Dart Pubs 上的公开库数量也日趋上升,基本可以满足一般业务的开发。

全平台支持

其实无论 RN 还是 Flutter 都有相当大的野心实现全平台制霸。除了 Android、iOS 平台之外,RN 已经可以通过第三方工具支持 Windows UMP、Web、Desktop、macOS,甚至近期京东开源的 Alita 项目 已经实现 RN 到微信小程序的打通。而 Flutter 目前还不完善,虽然以已经官方支持了 Android、iOS、Desktop、Web,但是实际测试下来成熟度还不够,特别是 Hummingbird 还处于早期阶段,转换后 Web 的性能还达不到生产环境的要求。

原生支持: 需要原生先打通原生与rn的连接。就是原生有容器能支持rn在里面运行。需要原生支持的才能完美结合

Flutter 真的不如 RN 吗?

技术层面其实 RN 和 Flutter 没有孰优孰劣的对立关系,都是非常出色的跨端框架。虽然上面列了不少 Flutter 的问题,但是这些都不是不能解决的问题,而是处于早期阶段任何框架都可能遇到的问题。相反从整体架构设计和整体规划上来说,我认为 Flutter 比 RN 更加出色,属于下一代的跨端框架。我们可以预见到在几年后 Google Fuchsia 系统正式发布的时候,这才是 Flutter 可以大显身手的时刻。

RN 使用案例:

1. 京东,携程使用较多

比如,京东app首页中的排行榜就是通过rn来搞的,维护成本,比较高。

2. Airbnb 放弃使用 React Native 的主要原因

React Native未能实现完全的跨平台抽象,有时候仍然需要针对特定平台单独编写代码来解决问题。这就间接要求他们的工程师必须熟悉三个平台才能真正用好 React Native,然而绝大多数开发者只熟悉一两个平台,久而久之便引发了一系列的问题。

摘自: mp.weixin.qq.com/s/DlzY6qxFC…

总结:

  1. 不管是rn 还是flutter都是需要原生投入的少不了,而且总投入还可能更多。
  2. 我们在技术选型的时候,重点考虑的几个方面,我们在回顾一下
  • 热更新支持
  • 开发语言 JS VS Dart (团队技术栈、 招聘方面)
  • 开发调试环境(开发体验)
  • 原生支持
  • 框架稳定性
  • 生态
  • 全平台支持(跨平台)