一、背景
"Write once, run anywhere" 一直以来就是开发者的梦想。在移动客户端领域,主流的跨平台开发框架大体经历了三个阶段。
第一阶段,主要通过 WebView 绘制界面,并通过 JavaScript Bridge 将系统的一部分能力暴露给 JS 调用。 PhoneGap、Cordova 都可以归属于这一类。
第二阶段,大家发现用 WebView 承载界面有性能等各种问题。于是将绘制交回给原生,通过 JS 来调用原生控件,编写业务代码。Weex、RN 就是其中的佼佼者,这也是现在绝大部分跨平台框架的思路。
第三阶段,虽然使用原生控件承载 UI 解决不少渲染的问题。但是处理平台差异性仍然需要耗费极大精力,效果也不尽如人意。这个时候,Flutter 提出的解决方案,就是连绘制引擎也自研,尽可能减少不同平台之间的差异性, 同时保持和原生开发一样的高性能。因此目前业界对 Flutter 的关注度也是最高的。
二、现存问题
跨平台意味着需要花费很多时间来解决平台差异性问题,同时要面临第三方库不够原生平台丰富健壮的现状。2018 年,Airbnb 放弃使用 React Native,回归使用原生技术,究其原因主要是:项目庞大后,维护困难;第三方库良莠不齐;兼容上需要耗费更多精力。这是跨平台框架存在的通病。
三、如何抉择
Flutter 可能相对来说在兼容上会做得好一点,通过自底向上自研框架来尽可能减少平台差异,但是可靠性仍需进一步检验,引入 Flutter 需要大家对自己公司业务有非常清晰的认知,并权衡好利弊。
四、行业动向
1、微信-WX+Flutter/C++
微信小程序-WX+Flutter
最开始是采用Webview渲染的方案,后面又采用了React-Native-Like的方案,再后来微信提出了一个很大胆的想法:上层依然使用WXML+WXSS来表示,但是底层使用Flutter引擎来渲染,而且他们觉得Platform Channel通信效率低,自己整了一个dart2cpp的模块来负责通信。
微信支付-C++
支付作为微信重要且复杂的一个模块,随着业务迭代,暴露出了很多问题:分平台导致的用户体验和逻辑不一致问题、扩展性差无法快速响应业务需求、质量保障体系不完善等。为了解决分平台实现这个核心问题,并解决以往的技术债务,统一体系管理,微信建立起了一整套基于 C++ 的跨平台框架,并对核心支付流程进行了重构。
2、闲鱼-Flutter/Weex
闲鱼
基于让工程师去从事更多创造性的工作的目标。闲鱼迅速拥抱和实践了flutter,19年在20+页面使用了flutter,覆盖音视频、富文本、键盘等复杂场景。在项目实践过程中和Google开发团队合作之下,在flutter基础之上,发现暴露了一些问题和缺陷,在Native与Flutter混合开发是项目的独立性和无缝衔接性,实践出了一套自己的构架,帮助和完善Flutter体系的建设。
3、美团-MTFlutter/MRN
出于合规、性能、安全的考虑,Flutter官方不支持动态化,业界的一大方向是:基于JS技术栈的动态解析DSL。不同于微信和闲鱼的Flutter跨平台,美团探索和实践了Flutter的动态性。在Flutter容器化生态建设中,MTFlutter完成了这些:"美团版"的Flutter标准工作流、MTFlutter脚手架、SDK定制、混合容器、CI/CD、Dart代码托管、二进制产物托管、集成插件、UI代码自动生成、动态化等
4、今日头条-Flutterw
出于性能体验、开发效率、高度一致性、高可控性考虑,字节跳动在今日头条、西瓜视频、皮皮虾、Helo等20+app对Flutter进行了业务落地。又由于配置环境复杂、环境差异大、链路长等原因自研了Flutterw研发套件,标准化了工程环境、落实了自动化工程方案、优化状态管理方案等。
5、蚂蚁财富-Flutter
蚂蚁财富的Flutter实践第一个遇到的问题是:传统应用中flutter的位置,也就是在传统应用中flutter能做什么?业务还是页面?哪些业务?哪些页面?之后落实的业务和页面:社区Tab、我的关注、我的讨论、资产-设置、资产-个人中心。然后总结了自己的Flutter建设路线图(如下)。
1.首先把app分为:上层应用(也就是页面)、平台基础能力(容器、存储、通知、路由、安全等)
2.分期建设:能力建设(容器能力对齐、混编脚本、混合栈、工程化)、生态与运维(UI组件、工作流)、开放赋能(路由重构、业务组件)
6、百度贴吧-Flutter
主要是:工程体系接入(FlutterBox)、技术全景(分层、工具链)、业务框架升级(tieba_redux)
落地情况:一键签到、吧详情、粉丝列表。个人中心、垂类吧等。
贴吧内部版:纯Flutter(11个月前停止更新)
7、贝壳-Flutter
贝壳基本按照Flutter官方方案,并做了些修改:gradle脚本修改、flutter_tools修改
应用场景:租赁收房测算、二手业务
8、腾讯在线教育-RN+Flutter
腾讯课堂-RN
腾讯课堂HD-Flutter
企鹅辅导-RN
企鹅辅导HD-Flutter
ABCMouse-Cocos
出于多项目App重复代码和代码体量变大、不发版解决问题、双端公用代码,开始动态化跨框架探索。
9、京东-RN
JD4iPhone
Swift
react.bundle
global_JS.bundle
10、淘宝-weex+flutter
Taobao4iPhone
swift
Flutter.framework
weex-main-jsfm.js
rax.js
DinamicXPreset_mytaobao(动态预置)
DinamicXPreset_tlhomepage
11、饿了么-weex
rax.js
weex-main-jsfm.js
weex-polyfill.js
windmill.worker.vue.js
应用页面:饿了么-我的-企业版
12、爱奇艺-RN
有Swift
IntegralRN.zip(积分)
acgAppRN.7z(动漫Animation Comic Game)
RN_imall.7z(商城)
rnpaopao.7z(泡泡)
rnpgc.7z
rnirc.7z
rnplane.7z(星球)
rnorder.7z(订单)
rniqyh.7z
13、陌陌-H5
MomoChat
H5.bundle
native-bundle-main.js
14、百度网盘-Flutter
netdisk_iPhone
swift
App.framework
Flutter.framework
15、抖音-RN?
Aweme
AgoraRtcEngineKit.framework
ByteRtcEngineKit.framework
AWERNKit.bundle
16、微信
WeChat
swift
WAWebview.js
WAService.js
vconsole.min.js
websearch(搜一搜)
webrecommend(看一看)
五、总结
1、Flutter的定位:
Flutter 是 Google 开源的 UI 工具包,帮助开发者通过一套代码库高效构建多平台精美应用,支持移动、Web、桌面和嵌入式平台。--百度百科
2、Flutter的问题:
Flutter并未考虑过Native&Flutter混合开发的场景,导致混合开发有非常多的问题。 这些问题包括混合转场、Flutter容器的复用、手势的分发、Native UI组件的参与渲染等;同时还有CI/CD工程化方案的缺失,闲鱼做了大量的改造和定制,才使得Flutter能够胜任混合开发。
尽管有些大厂在用Flutter了,但是很多和跟当年用RN一样,大部分是在一些详情页、个人页、社区模块在用,这样保证了可进可退,而且大厂的自研能力很强,一言不合就定制了,这对中小型公司来说就成本比较高了,相对来看小公司更依赖于生态完善性上了,所以在这里也提醒不要盲目追大厂的风。大厂分享,全是针对Flutter的私人定制以及填坑指南,相对来说RN好歹填了几年的坑了。
虽然 Flutter 的成长曲线和未来前景看起来都很好,但不可否认的是,目前 Flutter 仍处在发展阶段,很多大型互联网企业都无法毫无顾虑地让全线 App 接入,而其中最主要的顾虑是包大小
与动态化
。对中小公司而言,还要加上技术成熟度
、生态完整性
、标准工作流搭建
等。
3、Flutter的核心点:
1、性能:直逼原生。原理如下图1,性能对比如下图2。
2、效率和成本
开发效率:
由于生态和工作流不太完善,初始效率较低。双端差异性代码占比小,基本能实现代码复用,节省一端人力成本。
热重载:
热重载帮助你快捷方便的试验、重构UI、添加特性和修复bug,体验亚秒级的重载,而不会丢失状态。
双端一致性:
UI和业务能保持高度一致性。避免出现以下问题:
1.同一业务两套代码,部分业务处理逻辑不一样,易出bug
2.数据上报,自动化测试等质量保证体系造成阻碍
3.用户体验不一致
3、动态化
Android:将flutter业务做成单独插件,动态下发。
iOS:flutter for web方案(官方不建议生产使用,问题较多)
美团动态化:在动态化引擎部分预置了一个JSC模块,也就是JsCore,通过JSC来执行JavaScript从而实现逻辑层的动态化,而渲染层动态化则通过xml+css来展示,然后解析生成布局树并最终通过Flutter来渲染,可见Flutter渲染方案确实牛逼,不管是微信小程序还是美团,他们都通过Flutter来做渲染。
阿里/bugly:付费版热更新
4、包体积
Flutter编译产物分为两部分:App.framework、Flutter.framework。前者是dart代码和图片资源等,后者一般是固定大小14M(今日头条比较猛给弄到了3M)
综上所述,Flutter在性能和效率上优点突出。RN技术成熟,并且支持动态化。
注:SwiftUI未做考虑,主要他只是Apple平台的统一
,还有他是新的语法并且最低支持iOS13。
参考文章:
微信跨平台开发的思考与逻辑
为什么 Airbnb 放弃了 React Native?
国内大厂在移动端跨平台的框架接入分析
基于小程序技术栈的微信跨平台实践
微信支付基于C++ 跨平台开发框架
2019闲鱼-基于Flutter的架构演进与创新
2020闲鱼Flutter一体化演进之路
RN在美团外卖客户端的实践
美团外卖Flutter容器化生态建设实践
Flutter在字节跳动的现状与工程实践
蚂蚁财富Flutter工程化实践
Flutter、Native、RN,谁才是性能王中王?
IOS 2020 热更新