一、什么是跨平台:
跨平台指的是跨操作系统,由于计算机底层cpu的指令和架构不同,上层的操作系统不同,导致一个平台的可执行文件在另一个平台上不可运行。
有哪些平台
安卓、mac、ios、windows、linux、harmonyOS
引起的问题:
- 多平台开发如何保证功能完全一致
- 多平台开发需要耗费多出的人力,成本增大
一些跨平台方案:
- 浏览器
- docker
- node、deno
- jvm
- electron
跨平台方案的缺点
- 中间都隔了一个容器层,相比调用系统api性能下降
- 多平台一致性
- 各个平台原生 api 命名、设计不同,如何设计出一套合理的api
- 原生 api 提供的能力各不相同,如何兼容不同平台的 api
- 如果容器没有提供相应能力,想要扩展能力时有难度,需要 js 引擎的 bridge、 jvm 的 jni、node 的 c++ addon 等为这个容器扩展能力的方式
二、什么是跨端
跨端是指跨客户端,跨端的概念更侧重于让前端代码能够在不同类型的终端设备上运行。
客户端有逻辑、有界面,跨端主要分为逻辑跨端和渲染跨端。
有哪些端
桌面浏览器、移动浏览器、原生移动应用(iOS 和 Android)以及其他智能设备(如智能手表等)
一些跨端方案:
- react native
- weex
- flutter
- kraken
- 各家自研的跨端引擎等
1. react native
react native 的逻辑跨端基于 js 引擎 通过 bridge 来与原生 api 通信。
渲染跨端是通过分别实现 ios 和安卓组件的方式来实现,样式采用了 yoga 实现多端布局。
2. weex
一次编写,可在web、安卓、ios 运行。(已停止维护)
与 react native 架构类似,不过上层对接的框架为 Vue。
3. flutter
可以通过一套代码,支持iOS、Android、Windows/MAC/Linux等多个平台。它最大的特点是渲染不是基于操作系统的组件,而是直接基于绘图库(skia)来绘制的,更像是 canvas 绘制,将 UI 直接绘制出来,flutter 是在状态变更时重新构建 Widget Tree,Flutter 的渲染引擎在将 Widget Tree 转化成渲染的 Render Tree,最后交给操作系统调用 GPU 去渲染。
逻辑的跨端也不是基于 js 引擎,而是自研的 dart vm 来跨端,Dart 和 native 之间仍然存在一个接口,可以进行数据编码和解码,这可能比 JavaScript bridge 快好几个数量级。
4. uniapp
- web模式,由于uniapp采用vue语法作为DSL编译到web基本没有任何难度
- html plus模式,就是先走的web模式然后放在一个特殊的app里面,变成套壳app
- 小程序模式,这个部分是uniapp自研的,由一个静态编译器把vue模板翻译成小程序的模板,有点技术含量
- weex模式,weex本身支持用vue开发跨端应用,这个模式就是套壳weex
知识点
js bridge
- js 调用 native:
- 请求拦截
- 弹窗拦截
- 注入 js 方法
- native 调用 js:
- 直接执行 js 代码