背景
当前我们公司客户端开发,包含三种常用技术,iOS native、Android native、React-Native,在长时间的使用中发现,React-Native的 UI 统一性不够,深度开发严重依赖native,性能需要做大量的优化工作,所以考察 Flutter 当做备选替换方案。
Flutter 是什么
Flutter 是 Google推出并开源的移动应用开发框架,主打跨平台、高保真、高性能。开发者可以通过 Dart语言开发 App,一套代码同时运行在 iOS 和 Android平台。 Flutter提供了丰富的组件、接口,开发者可以很快地为 Flutter添加 native扩展。同时 Flutter还使用 Native引擎渲染视图。
跨平台自绘引擎
Flutter既不使用WebView,也不使用操作系统的原生控件,而是使用Skia作为其2D渲染引擎。
Skia是Google的一个2D图形处理函数库,包含字型、坐标转换,以及点阵图都有高效能且简洁的表现,Skia是跨平台的,并提供了非常友好的API,目前Google Chrome浏览器和Android均采用Skia作为其绘图引擎。
高性能
- Flutter APP采用Dart语言开发。Dart在 JIT 模式下,速度与 JavaScript基本持平。但是 Dart支持 AOT,当以 AOT模式运行时,JavaScript便远远追不上了
- Flutter使用自己的渲染引擎来绘制UI,布局数据等由Dart语言直接控制,所以在布局过程中不需要像RN那样要在JavaScript和Native之间通信
JIT(Just In Time) 动态编译:解释执行,边翻译边执行。
AOT(Ahead Of Time)静态编译:程序在执行前全部被翻译为机器码
采用Dart语言开发
开发效率高
Flutter在开发阶段采用,采用JIT模式,这样就避免了每次改动都要进行编译,极大的节省了开发时间。
在发布时可以通过AOT静态编译生成代码,不需要解释执行,性能高。
高性能
类型安全
由于Dart是类型安全的语言,支持静态类型检测,所以可以在编译前发现一些类型的错误,并排除潜在问题
调研问题
能否绝大部分脱离原生开发
在 React-Native 深入开发的工程中我们发现,其实还是需要大量的原生开发人员配合,或者开发者本身具有原生开发经验,如果Flutter 开发需要过多的原生开发,则没有必要采用。因为在高速迭代的过程中,如果需要原生开发介入,沟通成本过高,而如果开发人员本身具有原生开发经验,则招聘成本会比较高。
Flutter 通过引入和使用Skia 渲染 UI,比 RN 的跨平台更彻底一些,但是如果涉及其它系统能力调用,依然要涉及原生开发。初步评估,还是需要不少的原生开发任务,比 React-Native 少一些,但是也不能绝大部分脱离原生开发。
性能是否媲美原生
目前 React-Native 的性能基本接近原生,Flutter 是否能达到同样性能。
Flutter 使用 Skia 渲染 UI,而且代码通过静态编译生成,在执行前不需要解释,性能要比 React-Native 优秀,应该基本等同于 native 代码,而且,咸鱼团队验证过,部分场景,甚至要优于 native。性能是很完美的
开发成本
学习成本
开发语言使用 dart,dart 借鉴了不少语言的特性,有很多地方跟 JavaScript 很像,基本使用的入门门槛不高。开发的IDE 官方推荐 Android Studio 或者VS Code。学习成本与 React-Native 基本一致。
迁移成本
暂时不考虑
是否支持热更新
不支持热更新
由于 Flutter 在发布时使用的时 AOT 的模式生成机器码,与native 一样,所以不支持热更新。官方解释了不支持的几个原因。总结起来,应该是如果要实现热更新,很可能需要废除 AOT 这个模式,这就让 Flutter 跟 React-Native 差不多,性能会变慢。
配套社区是否完善
Flutter 团队近两年的更新频繁,社区也再不断壮大,基本使用应该是没有问题的,但是跟强大的前端开发社区比,还是要差一些的。
与 React-Native 对比
对比 | Flutter | React-Native |
---|---|---|
开发成本 | √ | |
社区完善 | √ | |
App 性能 | √ | |
UI 一致性 | √ |
结论
Flutter 目前来看,性能是最好的,UI 的一致性好,社区也已经基本完善,但是与 React-Native 一样,深度开发还是离不开 native 开发人员。可以看成是跨平台的原生开发,如果不追求热更新,是个很好的选择。