Native

简述

原生APP开发的架构设计,一般一个 App,会分为两大块,分别是 UI 渲染和系统服务调用,我们常说的跨平台开发,其实就是跨的这两块。

原生 App 的 UI ,会通过平台提供的原生 OEM 控件实现。

系统服务调用,如相机,蓝牙等传感器的使用,也会通过平台系统提供的 API 来实现。

示意图

技术选型 - 图1

评价

由于不同平台的 OEM 控件和 系统服务调用规范,以及编程语言不统一(Android 使用 Java / Kotlin,而 iOS 使用 Objective-C / Swift)这就产生了平台差异性。
一个 app 要开发几套代码,UI 效果还不一定能保持一致,费时费力。

Webview

简述

最常见的跨平台方案,是直接用 webview ,这其实就是我们常说的 hybrid app 了。
虽说不同平台的 webview 内核不一定一样,但是总归会遵循 w3c 规范, 那么我们的前端的代码可以运行在平台的 Webview 上,实现 UI 上的跨平台开发。
而系统服务调用这一块呢,就通过 bridge 来通过协议来调用原生的方法。

示意图

技术选型 - 图2

评价

hybrid app 的方案缺点也是很明显的, webview 性能比不上原生。

React Native / Weex

简述

React native ,Weex 等框架,是用前端语言描述系统 OEM 之类 实现跨平台,简单的来说,是通过写 js 配置页面布局,然后通过 react native 解析成原生的控件。

示意图

技术选型 - 图3

评价

这样的做法,就明显提高了性能,因为实质上渲染出来的,还是原生的控件。
**
但是,即便性能提高了,但是依然达不到原生的层次,因为 RN 是通过 Jscore 解析 jsbunder 文件布局,和原生直接布局还是有那么一丁点差距的。

另外,使用 react native 并不能避免写原生的代码,如果遇到一些平台相关的复杂问题,还是不得不深入到原生库中进行必要的调整。

去年 Airbnb 就因为类似的原因放弃了 rn。

Flutter

简述

flutter 的 UI 渲染是基于 Skia 图像引擎完成的,不依赖任何一个系统平台,平台仅仅提供一个画布,让 图像渲染在画布上。

示意图

技术选型 - 图4

评价

直接越过原生的渲染机制,从自身的渲染引擎去渲染视图,这就和原生一模一样,没有了中间商赚差价,性能是除了原生开发以外最好的