微信小程序启动原理

957 阅读4分钟

注1:小程序启动的各流程不是串行完成的,会尽可能的并行进行。

注2:小程序启动的各个流程不是每次启动都完整进行的,会尽可能的利用缓存。

1 小程序运行环境

运行环境逻辑层渲染层
IOS / MacJavaScriptCoreWKWebView
AndroidV8自研 XWeb 引擎基于 Mobile Chrome 内核
PCChrome 内核Chrome 内核
小程序开发工具NWJSChrome WebView

2 启动流程

小程序启动阶段是指从用户点击访问小程序到小程序首屏渲染完成(首页页面 Page.onReady 事件触发)

2.1 资源准备

1 小程序相关信息准备

  • 小程序的头像、昵称、配置、版本、权限等,以及对小程序进行必要的版本管理、权限控制和校验等。
  • 信息获取和更新机制:
    • 同步请求:会阻塞小程序的启动流程,影响小程序的启动耗时
      • 首次请求:用户首次访问该小程序时,同步请求相关信息。
      • 同步更新:微信会定期检查最近最常使用的小程序的最新版本。如果启动时已知小程序有新版本,会同步更新信息。
      • 强制更新:用户长时间未使用小程序时,为保障信息的实时性,会强制同步更新信息。
    • 异步请求:与启动流程并行,不影响启动耗时
      • 异步更新:对于已使用过的小程序,定时检查未发现小程序有新版本,或不在定时检查的小程序列表内时,使用本地缓存的信息,并异步进行更新。
  • 对启动耗时的影响:
    • 主要在用户首次访问小程序或长期未使用小程序时,同步获取信息。

2. 小程序运行环境准备

  • 包括小程序进程、客户端原生部分的系统组件和UI元素(如导航栏、tabbar等)、渲染页使用的 WebView 容器、运行开发者JS代码的JS引擎、小程序基础库等等。
  • 信息获取和更新机制:
    • 预加载
  • 对启动耗时的影响:
    • 由于受到设备资源和操作系统调度的影响,当没有命中预加载时,会影响启动耗时。

3. 代码包准备

  • 从服务器获取代码包地址、下载代码包,并对代码包进行校验。
  • 信息获取和更新机制:
    • 缓存。
    • 代码包压缩:采用 ZSTD 算法对小程序代码包进行压缩,以尽可能降低下载过程中传输的数据量。
    • 增量更新:当代码包发生更新,不需要重新下载完整的代码包,只需要下载根据算法生成的体积很小的增量包进行更新。
    • 更高效的网络协议:下载代码包优先使用 QUIC 和 HTTP/2。
  • 对启动耗时的影响:
    • 代码包的大小

2.2 开发者代码注入

注:渲染层和逻辑层的开发者代码注入是并行进行的。

2.2.1 逻辑层代码

  • 从代码包读取小程序的配置和代码,并注入到 JS 引擎中。
  • 信息获取和更新机制:
    • Code Caching:在部分平台上,微信客户端会使用 V8 引擎的 Code Caching 技术对代码编译结果进行缓存,降低二次注入时的编译耗时。
    • 懒注入:通过按需注入代码降低启动时需要注入的代码量。需要开发者手动启用。
  • 对启动耗时的影响:
    • 代码量、同步接口调用和一些复杂的计算
    • 接口请求的耗时

2.2.2 渲染层代码

  • 页面渲染需要的页面结构和样式信息。
  • 对启动耗时的影响:
    • 页面结构复杂度
    • 使用的自定义组件数量

2.3 落地页首次渲染

  • 在开发者代码注入完成后,结合逻辑层得到的数据和渲染层得到的页面结构和样式信息,小程序框架会进行小程序首页的渲染,展示小程序首屏,并触发首页的 Page.onReady 事件。
  • Page.onReady 事件触发标志小程序启动过程完成。

3 小程序性能优化

点击此处查看详情