跨平台应用开发选 React Native 还是 Flutter?

445 阅读5分钟

不论是 React Native 还是 Flutter 都可以用于开发跨平台应用,选哪个看你自身需求,但首先得了解清楚两者都是什么。

React Native 能够跨平台是因为它允许你使用 React / JavaScript / JSX 的写法写原生应用,而在底层他会替你调用相应的 iOS 原生组件或者 Android 原生组件,又或者直接生成适用于 Web 的 DOM 树。所以他做的事情是,用 JavaScript 调用对应系统渲染器进行渲染展示。

那么,Flutter 又是怎么跨平台的呢——Skia。当你使用 Flutter 框架(Dart)开发应用时,其底层渲染由 Skia 接管,没有什么 Android runtime、Chromium 或者其他中间层了,是的,Skia 的下层便是 CPU/GPU 了,一个受控的画布,基本上意味着你想画什么就画什么了,不再需要调用原生 Widgets,而这便是 Flutter 能够跨平台的原因。

除此外,还可以提供一些有用信息供你参考。

  1. 谁更快:React Native 这种从使用 JavaScript 到解析调用 Native 的过程中间显然要经过多个环节,而 Flutter 里将 Dart 代码 AOT 编译为本地代码,所以 Flutter 应用是直接使用本机指令集运行,这就不涉及解释器这一层。关于 Flutter 为什么这么快 Google 的工程师在 Google I/O、GDD 以及刚结束的 D2 上都有介绍,这里贴一张图可以简要说明「Flutter 相比 Android 与 其他跨平台框架相比为何那么快」的原因,见 [注1]。

  2. 支持平台:React Native 支持 iOS / Android / Web 是毋庸置疑的,但 Flutter 现在还只能「成熟」的支撑 iOS / Android,即便上个月 Flutter Live 1.0 说到 Flutter for Desktop 以及 HummingBird,但这些都还处于初期,至少在明年 Google I/O 前还不能报有希望。

  3. 渲染控制:React Native 做的时候是利用 JavaScript「调用」原生 Widgets,那么不同平台 Widgets 的差异势必使得 React Native 只能取两者的公共子集,「Write once, run everywhere」不假,但「Control every pixel on the screen」是做不到的;Flutter 不调用原生组件,相反,有一组自己的Widgets,而他们都由 Flutter 的 Framework 和 Engine 管理和渲染,按 Google 的话来说就是Control every pixel on the screen」,你不再需要因为不同端的差异而在实现上进行妥协 [注2]。

  4. 成熟:Dart 生态相比移动端/前端生态远小的多,看看 Flutter Live 上那些截图就知道 Flutter (+Dart) 的开发人员也远不及 Android / iOS / Chromium 等平台的开发人员,是的,是远远不及,即便加上 Dart 相关开发人员。往外扩再想想社区,React Native 经过多年发展,其现在的社区规模或者是生态完善性都是 Flutter 近期根本无法追赶上的,虽然 React Native 依旧有不少「坑」。

  5. 上手:是个前端开发就一定知道 HTML / CSS / JavaScript,但是用 Flutter 你需要学习一门新语言 Dart,而如果你的编程习惯不好或者不善于抽象,你的 Flutter 代码很容易一层套一层,like callback hell,所以你说哪个更容易上手呢?

Flutter 风光很足,且官方回应非常迅速(GitHub Issues),但生态远没到成熟的地步,且现在在开发调试上还是有些痛苦的,比如无法准确定位错误堆栈等;但 React Native 为了达到跨平台而对 UI 上的一妥协与牺牲也是被人们所熟知的。

但如果说两边现在最让人期待的事情,Flutter 无疑是 Flutter for desktop 与 HummingBird,React Native 则无疑是 Facebook 正在进行的重构。

React Native 大家熟悉多一些,所以最后多安利一下 Flutter。Flutter 整体架构主要分三层[注3]:Framework,Engine 与 Embedder,前两层结构见下图。

  1. Framework 是应用开发者需要直接面对的,包含文本/图片/按钮等基础 Widgets、渲染、动画、手势等。如果你写 Flutter 应用,那么大致可以理解为调用这些 package 然后再用 Dart 「拼装」些自己的代码。

  2. Engine 使用 C++ 实现,这一层包含 Skia,Dart 和 Text。后两个不太熟,说说 Skia。这是一个二维图形库,提供了适用于多种软/硬件平台的通用 API,既是 Chrome,Chrome OS,Android,Firefox,Firefox OS 等产品的图形引擎,也支持 Windows 7+,macOS 10.10.5+,iOS8+,Android4.1+,Ubuntu14.04+ 等平台;Dart 可能包含 Dart Runtime 等,Text 则负责文字渲染部分。

  3. Embedder 是一个嵌入层,做的事情是 Flutter to Platforms。比如渲染 Surface,线程设置,插件等。Flutter 的平台层很低,比如 iOS 只是提供一个画布,剩余的所有渲染相关的逻辑都在 Flutter 内部,而这就是 Flutter 所宣传的可以精准控制每一个像素的原因;但不可否认,对于插件部分,还是需要特定操作系统底层的建设(比如支付、地图等),而在 React Native 上(开发应用)则不需要相关背景。

你的观点是什么,欢迎在下方留言告诉我。


注1 (from What makes Flutter fast, Yuqian Li on D2)

注2:Google 的原话是「Flutter lets you control every pixel on the screen, and its powerful compositing capabilities let you overlay and animate graphics, video, text and controls without limitation.」

注3:Flutter 系统架构详情可见

https://docs.google.com/presentation/d/1cw7A4HbvM_Abv320rVgPVGiUP2msVs7tfGbkgdrTy0I/edit#slide=id.gbb3c3233b_0_162

点击下方 阅读原文 为我点赞吧。