一 说说微信⼩程序的实现原理?

1.1 背景

⽹⻚开发,渲染线程和脚本是互斥的,这也是为什么⻓时间的脚本运⾏可能会导致⻚⾯失去响应的原因,本质就是我们常说的 JS 是单线程的

⽽在⼩程序中,选择了 Hybrid 的渲染⽅式,将视图层和逻辑层是分开的,双线程同时运⾏,视图层的界⾯使⽤ WebView 进⾏渲染,逻辑层运⾏在 JSCore 中

  • 渲染层:界⾯渲染相关的任务全都在 WebView 线程⾥执⾏。⼀个⼩程序存在多个界⾯,所以渲染层存在多个 WebView 线程
  • 逻辑层:采⽤ JsCore 线程运⾏ JS 脚本,在这个环境下执⾏的都是有关⼩程序业务逻辑的代码

1.2 通信

⼩程序在渲染层,宿主环境会把 wxml 转化成对应的 JS 对象

在逻辑层发⽣数据变更的时候,通过宿主环境提供的 setData ⽅法把数据从逻辑层传递到渲染层,再经过对⽐前后差异,把差异应⽤在原来的 Dom 树上,渲染出正确的视图

当视图存在交互的时候,例如⽤⼾点击你界⾯上某个按钮,这类反馈应该通知给开发者的逻辑层,需要将对应的处理状态呈现给⽤⼾

对于事件的分发处理,微信进⾏了特殊的处理,将所有的事件拦截后,丢到逻辑层交给JavaScript 进⾏处理

由于⼩程序是基于双线程的,也就是任何在视图层和逻辑层之间的数据传递都是线程间的通信,会有⼀定的延时,因此在⼩程序中,⻚⾯更新成了异步操作

异步会使得各部分的运⾏时序变得复杂⼀些,⽐如在渲染⾸屏的时候,逻辑层与渲染层会同时开始初始化⼯作,但是渲染层需要有逻辑层的数据才能把界⾯渲染出来

如果渲染层初始化⼯作较快完成,就要等逻辑层的指令才能进⾏下⼀步⼯作

因此逻辑层与渲染层需要有⼀定的机制保证时序正确,在每个⼩程序⻚⾯的⽣命周期中,存在着若⼲次⻚⾯数据通信

1.3 运⾏机制

⼩程序启动运⾏两种情况:

  • 冷启动(重新开始):⽤⼾⾸次打开或者⼩程序被微信主动销毁后再次打开的情况,此时⼩程序需要重新加载启动,即为冷启动
  • 热启动:⽤⼾已经打开过⼩程序,然后在⼀定时间内再次打开该⼩程序,此时⽆需重新启动,只需要将后台态的⼩程序切换到前台,这个过程就是热启动

1.3.1 需要注意

  1. ⼩程序没有重启的概念
  2. 当⼩程序进⼊后台,客⼾端会维持⼀段时间的运⾏状态,超过⼀定时间后会被微信主动销毁
  3. 短时间内收到系统两次以上内存警告,也会对⼩程序进⾏销毁,这也就为什么⼀旦⻚⾯内存溢出,⻚⾯会奔溃的本质原因了

开发者在后台发布新版本之后,⽆法⽴刻影响到所有现⽹⽤⼾,但最差情况下,也在发布之后 24 ⼩时之内下发新版本信息到⽤⼾

每次冷启动时,都会检查是否有更新版本,如果发现有新版本,将会异步下载新版本的代码包,并同时⽤客⼾端本地的包进⾏启动,即新版本的⼩程序需要等下⼀次冷启动才会应⽤上