在了解React Native与小程序前,我们先来了解一下Hybrid App。
Hybrid App(混合模式移动应用)是指介于web-app、native-app这两者之间的app,兼具“Native App良好用户交互体验的优势”和“Web App跨平台开发的优势”。
Native App是一种基于智能手机本地操作系统如iOS、Android、WP并使用原生程式编写运行的第三方应用程序,也叫本地app。一般使用的开发语言为JAVA、C++、Objective-C。
Web App就是运行于网络和标准浏览器上,基于网页技术开发实现特定功能的应用。
以下是与Web App和Native App的对比:
Web App | Hybrid App | Native App | |
---|---|---|---|
开发成本 | 低 | 中 | 高 |
维护更新 | 简单 | 简单 | 复杂 |
体验 | 差 | 优 | 优 |
安装 | 不需要 | 需要 | 需要 |
跨平台 | 优 | 优 | 差 |
Hybrid App的本质,其实是在原生的 App 中,使用 WebView 作为容器直接承载 Web页面,也有人说成是“套壳”。
其中,最核心的点就是 Native端 与 H5端 之间的双向通讯层,也可以理解为我们需要一套跨语言通讯方案,来完成 Native(Java/Objective-c/…) 与 JavaScript 的通讯。这个方案就是 JSBridge,而实现的关键便是作为容器的 WebView,一切的原理都是基于 WebView 的机制。
WebView是一个基于webkit引擎、展现web页面的控件。
现在比较流行的混合方案主要有三种,主要是在UI渲染机制上的不同:
以上的三种方案,其实同样都是基于 JSBridge 完成的通讯层,第二三种方案,其实可以看做是在方案一的基础上,继续通过不同的新技术进一步提高了应用的混合程度。
接下来,我们先看一下React Native的方案。
因为React Native的底层为React框架,同样地也体现了虚拟DOM的思想
虚拟DOM具体实现思路:
- 用JS对象模拟DOM(虚拟DOM)
- 把此虚拟DOM转成真实DOM并插入页面中(render)
- 如果有事件发生修改了虚拟DOM,比较两棵虚拟DOM树的差异,得到差异对象(补丁数组)(diff)
- 把差异对象(补丁数组)应用到真正的DOM树上(patch)
优点是能高效的改动DOM,避免了重新绘制DOM。
主要是使用JSCore实现JS和Object C/Java交互。
大致步骤如下:
JSCore,即JavaScriptCore,JS引擎的核心部分。
iOS使用的是内置的JavaScriptCore,Android使用的是 https://webkit.org 家的jsc.so。
RN既有Native的体验,又能使用前端开发者熟悉的React框架,并具有hybrid技术的优点,能跨平台开发,能远程更新代码,提高迭代频率和效率。
但还有以下不足:
接下来,我们来看一下小程序的双线程的模式。
如下图,小程序的运行环境分成渲染层和逻辑层,WXML 模板和 WXSS 样式工作在渲染层,JS 脚本工作在逻辑层。小程序的渲染层和逻辑层分别由2个线程管理:渲染层的界面使用了WebView 进行渲染;逻辑层采用JsCore线程运行JS脚本。
一个小程序存在多个界面,所以渲染层存在多个WebView线程。这使得小程序更贴近原生体验,也避免了单个WebView的任务过于繁重。
这两个线程的通信会经由微信客户端(Native)做中转,逻辑层发送网络请求也经由Native转发。
小程序的渲染层和逻辑层分离主要有两个原因:
与RN一样,小程序在页面渲染上也体现了虚拟DOM的思想。
在组件系统方面,小程序的大部分组件由Exparser组件框架实现,小部分原生组件由客户端参与组件的渲染,以提供更好的性能。
比如原生组件map
在实际运行时,
详细看原生组件。
那么,渲染层与逻辑层是怎么与Native通信的呢?
在视图层与客户端的交互通信(基本上只是原生组件会用到)方面,
在逻辑层与客户端原生通信机制方面,
上面有提到渲染层和逻辑层的分离也给在不同的环境下运行提供了可能性。在开发者工具中,逻辑层实际上是使用一个隐藏着的标签来模拟JSCore的。并通过将JSCore中不支持的BOM对象局部变量化,使得开发者无法在小程序代码中正常使用BOM,从而避免不必要的错误。
在通讯机制方面,开发者工具底层维护着一个WebSocket服务器,用于在WebView与开发者工具之间建立可靠的消息通讯链路,使得接口调用,事件通知,数据交换能够正常进行,从而使小程序模拟器成为一个统一的整体。
详细可看官网上的微信开发者工具
小程序双线程模型中,渲染层和逻辑层分离,具有渲染快、加载快的优点;
但任何数据传递都是线程间的通信,也就是都会有一定的延时。这会使得各部分的运行时序变得复杂一些。详细可以看官网上的天生的延时
RN与小程序都具有hybrid技术的优点,兼具“Native App良好用户交互体验的优势”和“Web App跨平台开发的优势”。
从框架来说,都使用Web 相关技术来编写业务代码;都实现了一套跨语言通讯方案,来完成 Native(Java/Objective-c/…)端 与 JavaScript (小程序中分为渲染层和逻辑层)的通讯。
从渲染底层来看,小程序使用浏览器内核来渲染界面(小部分原生组件由客户端参与渲染),即界面主要由成熟的 Web 技术渲染,辅之以大量的接口提供丰富的客户端原生能力;而 RN 则是用客户端原生渲染的。