这是我参与「第五届青训营」笔记创作活动的第 10 天
了解跨端开发
跨端方案的目标
- 研发效率高:学习成本低,多端一致性高
- 用户体验好:稳定性高,性能体验好
- 动态化:支持动态化下发,满足日益增长的业务需求
原生开发的痛点
- 各端功能几乎一致,但需要单独配置研发人员
- 开发、维护成本较高
- 安卓、IOS发版周期长
跨端技术方案
Hybrid
基于 WebView 渲染,通过 JavaScript Bridge 将一部分系统能力开放给 JavaScript 进行调用。相当于在原生层上独立运行一个Web层。
优势:对前端开发者比较友好,可以低成本实现跨端,同时保留部分原生的能力。 缺点:浏览器内核渲染独立于系统组件,原生体验糟糕,性能不好。
原生渲染方案
使用JS开发,通过中间层桥接后使用原生组件渲染UI界面。
React Native 的思路是最大化地复用前端的生态和 Native 的生态,和 WebView 容器的最大区别在于 View 的渲染体系。React Native 抛弃了低效的浏览器内核渲染,转而使用自己的DSL生成中间格式,然后映射到对应的平台,渲染成平台的组件。
自渲染方案
利用 Skia 重新实现渲染管线,不依赖原生组件
常用于自渲染方案的框架是 Flutter ,这是谷歌在世界移动大会公布的开源应用开发框架,通过一套代码库就可以构建原生平台编译的多平台应用
小程序方案
使用小程序 DSL + JS 开发,通过中间层桥接后调用原生能力,使用webview来渲染UI界面
一个小程序的运行环境会被分为两个部分,分别是:渲染层和逻辑层,一些HTML的模板会在渲染层中工作,而js代码会在逻辑层中工作,因此小程序的渲染层和逻辑层分别由2个线程管理:渲染层的界面使用了webview进行渲染,逻辑层使用JSC线程来运行JS脚本
总结
当前的跨端生态还没有出现一个既能照顾到性能,也能方便多端快捷开发的方案,所以当遇到跨端需求时,从四种方案中选择较能满足需求的方案实现即可。但是相信在不远的未来,肯定会有一个强大的跨端方案的产生。
| 技术方案 | 视图层 | 逻辑层 | 优点 | 缺点 |
|---|---|---|---|---|
| hybrid | webview | webview JS thread | 1. 开发成本低 2. CSS全集 3. 一致性好 | 性能中等 |
| 原生渲染 | 原生组件 | JS Engine | 1. 性能好 | 1. CSS子集 2. 一致性一般 |
| 自渲染 | Skia | Dart VM | 1. 性能最好 2. 一致性好 | 1. CSS子集 2. Dart生态一般 3. 开发成本较高 |
| 小程序 | webview+原生组件 | JS Engine | 1. 开发成本低 2. CSS全集 3. 一致性好 | 1. 性能较好 |