作者:xXxHolicxXx900 | 来源:互联网 | 2023-07-14 15:43
从HybridApp到RN,再到Flutter,跨平台技术的发展十分火热,在平时的业务开发中,跨平台也往往由于其动态性,开发速度,节省人力而占据越来越大的比重。以下简单对比一下跨平台技术
为什么纯原生开发不占优势了
原生开发的优势
- 速度快,性能好。在进行一些复杂的动画绘制时,体验更好。
- 一些硬件的访问,像摄像头、GPS都可以直接访问,省去了通过跨平台框架协议兼容的中间件。
它的劣势
- 仅支持特定平台,开发成本高(Android、iOS)
- 动态化差,改bug基本上只能发版。
但是目前面临的问题是
- 动态化需求变多了,发版更加频繁,但是发版审核都需要时间,而且过于频繁的版本更新也会影响用户使用,有点跟不上互联网的高度发展
- 需要Android和iOS两端开发,两个技术团队,人力成本高
所以这些跨平台技术越来越流行,大幅度压缩了原生开发的比重。常见的跨平台技术主要有三种
- H5+原生:Hybrid
- JS+原生渲染:RN
- 自绘UI+原生:Flutter
针对原生开发的劣势,其实也有一些解决方案
- 布局动态化,服务器下发布局,客户端解析加载
- 热修复,如腾讯的thinker等,但是对Android新版本的支持好像不是很好
Hybrid
简单理解为网页,webview执行h5代码,本质上是个浏览器内核,js运行在权限受限的沙箱中,想访问原生的一些功能,如蓝牙,只能通过调起原生的代码实现。基本上主要是JS通过JsBridge调用原生的一些功能。
他的优势在于web技术栈已经很成熟了,资源都很丰富。
劣势也很明显,慢,性能差。复杂的业务界面及动画,卡。
这里也有一些解决方案
- 提前将页面的公共资源html,css,js模板化,动态下发到app,在shouldInterceptRequest拦截webview的资源加载,判断本地模板的资源就直接加载本地的,没有则再去加载线上资源
- 数据请求由app代理,让数据加载和模板代理并行执行
- webivew复用,构建一个webview池,每次进入h5页,从webview池中取出webview
- 图片优化,通过shouldInterceptRequest拦截图片资源并下载
RN
RN实际上可以理解为js+映射原生空间绘制。
以下简单理解一下DOM树,文档对象模型是表示和处理一个html和xml文档的标准接口,DOM树就是文档树,与用户界面的控件树相对应,也可以与Android的xml布局文件的控件树相对应
React框架运用的是典型的响应式编程,状态改变则UI随之改变,它是响应用户状态改变的事件而构建用户界面。它的好处是
- 开发者只需要关心状态(数据),状态改变了,UI自然会改变
- 当接收到用户状态改变的通知时,根据当前渲染树,通过diff算法,算出树中变化的部分,然后只更新改变的部分,避免整个树重构,提高性能
此处,React框架也不会立即就刷新界面,而是抽象出一个虚拟DOM层,改动先同步到虚拟DOM层上,然后再批量同步到真实DOM上,因为浏览器的每次DOM操作都可能引起浏览器的重绘或回流。
RN中的虚拟DOM树最终会通过JavascriptCore映射为原生控件树。JSCore是一个JS解释器,作用跟JSBridge差不多
- 为JS提供运行环境
- 是JS与原生通信的桥梁
RN中虚拟DOM树映射为原生控件有两步
- 布局消息传递:将虚拟DOM布局信息传递给原生
- 原生根据布局信息通过对应的原生控件渲染控件树
它的优势在于
- web技术栈,社区大,上手快,成本低
- 原生渲染,比H5好很多
- 动态化好,支持热更新
它的劣势在于
- 渲染时需要和JS通信,某些场景下可能造成卡顿,如拖动
- JS为脚本语言,执行时需要JIT,效率比AOT慢
- 渲染依赖原生控件,不同的平台的控件需要单独维护,并且系统更新,社区控件可能延时,并且收到原生控件的影响,比如存在手势冲突问题
Flutter
Flutter是自绘引擎加原生,在不用的平台实现一个统一的渲染引擎接口来绘制UI
它的优势
- 性能高
- 灵活,组件库容易维护,UI保真度和一致性高
它的劣势
- 动态性不足,Flutter是AOT模式编译的aar包,不能像JIT那样动态下发代码
- 开发效率低
Flutter相对一般的自绘引擎的优势在于
- 生态原来越丰富了,Flutter社区、Github资源原来越多
- Google也在推广Flutter
- 开发效率上来讲,Flutter的热重载可以更快的构建UI,添加功能,修复问题
Flutter采用自己的高性能引擎绘制widget,可以保证一致性,也可以避免对原生控件的依赖。在开发时,Flutter是JIT模式,开发效率比较高,在打成release包的产物时,它是AOT模式,它的运行效率比较高。而且因为它是自己的渲染引擎,在滑动和滚动场景下具有明显的优势。
总结
平台 | 优势 | 劣势 |
原生 | 1.能访问平台的全部功能 2.速度快,性能高 | 1.平台特定,开发成本高 2.不支持动态化 |
Hybrid | web技术栈,社区资源丰富 | 性能差,复杂的界面和动画,难以支持 |
RN | 1.web技术栈,社区资源丰富,上手成本低 2.原生渲染,性能比h5高 3.支持动态化,热更新 | 1.渲染时需要JS和原生通信,拖动时可能因为通信频繁卡顿 2.执行时时JIT,执行效率低 3.渲染依赖原生控件,当系统更新时,RN的更新可能不及时 |
Flutter | 1.Flutter社区生态越来越丰富 2.性能高,支持AOT 3.自绘UI引擎,不同平台展示效果一致 4.开发JIT,编译AOT | 1.不支持动态化 2.开发效率低 |
参考
《Flutter实战》
Android WebView H5 秒开方案总结 - 掘金