跨端框架
JS驱动类型跨平台框架
现在所有用JS驱动的跨平台框架原理都相似,核心思想是Native在JavaScript的执行上下文暴露其全局方法,同样的JS脚本(JS Framework)里也暴露一些全局方法,通过这些全局API进行双向交互。
taro3 remax kbone
通过在小程序端模拟实现 DOM、BOM API 来让前端框架直接运行在小程序环境中,可以完整复用web技术栈,如(react context API,redux etc)。具体就是小程序层用固定模板去渲染web框架的vnode tree
uni-app
uni-app 在非H5端运行时,从架构上分为逻辑层和视图层两个部分。逻辑层负责执行业务逻辑,也就是运行js代码,视图层负责页面渲染。 在app-nvue里,逻辑层和视图层的折损一样存在。包括react native也有这个问题。所以也千万别以为原生渲染就多么高级。
weex提供了一套bindingx (opens new window)机制,可以在js里一次性传一个表达式给原生层,由原生层解析后根据指令操作原生的视图层,避免反复跨层通信。这个技术在uni-app里也可以使用。
bindingx作为一种表达式,它的功能不及js强大,但手势监听、动画还是可以实现的,比如uni ui的swiperAction组件在app-nvue下运行时会自动启用bindingx,以实现流畅跟手
RN
- 虚拟机:在早期的架构上虚拟机使用的是 JSC (Javascript Core) 执行运算,这样它可以充分复用 JS 生态,吸引大量前端开发者参与。而且由于 JS 天生跨平台的特点,跨端移值 App 也顺理成章。
- 渲染引擎: RN 没有直接使用 WebKit 或其它 Web 引擎,因为之前 Web 在构建复杂页面时带来的计算消耗,远比不上纯原生引擎的渲染。所以它直接复用了原生的渲染通道,这样就可以带来与原生近乎一致的体验。通过写 Reactjs 代码配置页面布局,然后 React Native 最终会解析渲染成原生控件,如
<View>
标签对应 ViewGroup/UIView ,<ScrollView>
标签对应 ScrollView/UIScrollView ,<Image>
标签对应 ImageView/UIImageView 等
Flutter
- 虚拟机: 使用了 Dart VM,Dart 支持 JIT 与 AOT 两种编译模式,也就是我们所说的动态编译与静态编译。在开发阶段使用 JIT 编译,实现热更新预览,动态加载等,而在发布阶段使用 AOT 模式编译为机器码,保证启动速度和跨端信息的传递效率。
- 渲染引擎:Flutter 使用了 Skia 渲染引擎进行视图绘制,避开了不同平台上控件渲染差异。而且,少了这一层的交互,使得效率也得到提升。
- 原生交互:因为 Dart 本身跨平台的特性,底层 C++ 可以直接访问到原生的 API,加上信息使用机器码进行传递 (BinaryMessage),所以与原生交互的效率非常高。