微信小程序中的渲染层和逻辑层是怎样运行的?

小程序的运行环境分成渲染层和逻辑层, WXML 模板和 WXSS 样式工作在渲染层,JS 脚本工作在逻辑层。小程序的渲染层和逻辑层分离是经过很多考虑得出来的模型.我们会先介绍这个模型的基本工作方式。


1 渲染“Hello World”页面

我们看看小程序是如何把脚本里边的数据渲染在界面上的。
WXML模板使用 view 标签,其子节点用 { { }} 的语法绑定一个 msg 的变量,如代码清单3-1所示。
代码清单3-1 渲染“Hello World”WXML代码

<view>{
   
   { msg }}</view>

在 JS 脚本使用 this.setData 方法把 msg 字段设置成 “Hello World” ,如代码清单3-2所示。
代码清单3-2 渲染“Hello World”JS脚本

Page({
  onLoad: function () {
    this.setData({ msg: 'Hello World' })
  }
})

从这个例子我们可以看到3个点:

  1. 渲染层和数据相关。
  2. 逻辑层负责产生、处理数据。
  3. 逻辑层通过 Page 实例的 setData 方法传递数据到渲染层。

关于第1点,涉及了“数据驱动”的概念,我们会在3节详细讨论,我们现在先看看第3点涉及的“通信模型”。


2 通信模型

小程序的渲染层和逻辑层分别由2个线程管理:渲染层的界面使用了WebView 进行渲染;逻辑层采用JsCore线程运行JS脚本。一个小程序存在多个界面,所以渲染层存在多个WebView线程,这两个线程的通信会经由微信客户端(下文中也会采用Native来代指微信客户端)做中转,逻辑层发送网络请求也经由Native转发,小程序的通信模型如图3-1所示。

图3-1 渲染层和逻辑层通信模型


3 数据驱动

在开发UI界面过程中,程序需要维护很多变量状态,同时要操作对应的UI元素。随着界面越来越复杂,我们需要维护很多变量状态,同时要处理很多界面上的交互事件,整个程序变得越来越复杂。通常界面视图和变量状态是相关联的,如果有某种“方法”可以让状态和视图绑定在一起(状态变更时,视图也能自动变更),那我们就可以省去手动修改视图的工作。这个方法就是“数据驱动”,下边我们来介绍一下小程序的数据驱动基本原理。
WXML结构实际上等价于一棵Dom树,通过一个JS对象也可以来表达Dom树的结构,如图3-2所示。

图3-2 WXML结构和JS对象均可以表示一棵Dom树

WXML可以先转成JS对象,然后再渲染出真正的Dom树,回到“Hello World”那个例子,我们可以看到转换的过程如图3-3所示。

图3-3 WXML结构转JS对象,再转Dom树

通过setData把msg数据从“Hello World”变成“Goodbye”,产生的JS对象对应的节点就会发生变化,此时可以对比前后两个JS对象得到变化的部分,然后把这个差异应用到原来的Dom树上,从而达到更新UI的目的,这就是“数据驱动”的原理,如图3-4所示。

图3-4 状态更新的时候,通过对比前后JS对象变化,进而改变视图层的Dom树

4 双线程下的界面渲染

小程序的逻辑层和渲染层是分开的两个线程。在渲染层,宿主环境会把WXML转化成对应的JS对象,在逻辑层发生数据变更的时候,我们需要通过宿主环境提供的setData方法把数据从逻辑层传递到渲染层,再经过对比前后差异,把差异应用在原来的Dom树上,渲染出正确的UI界面,如图3-5所示。

图3-5 逻辑层传递数据到渲染层

猜你喜欢

转载自blog.csdn.net/m0_58859743/article/details/125752582
今日推荐