双线程
小程序由两大线程组成:负责界面的线程(view thread)和服务线程(appservice thread),各司其职由互相配合。两个线程分别用于渲染层和逻辑层,渲染层的界面使用了 WebView 进行渲染,通过逻辑层代码去控制渲染哪些界面,如果一个小程序存在多个界面,则渲染层存在多个 WebView 线程;逻辑层采用一个单独的 JsCore 线程运行 JS 脚本,在这个环境下执行的都是有关小程序业务逻辑的代码。套用一张官方的图来解释。
小程序双线程间的通信
把开发者的 JS 逻辑代码放到单独的线程去运行,但在 Webview 线程里,开发者就没法直接操作 DOM。那要怎么去实现动态更改界面呢?
如图:
1、在渲染层把 WXML 转化成对应的 JS 对象。
2、在逻辑层发生数据变更的时候,通过宿主环境提供的 setData 方法把数据从逻辑层传递到 Native,再转发到渲染层。
3、经过对比前后差异,把差异应用在原来的 DOM 树上,更新界面。