微信小程序的运行环境

微信小程序运行在多种平台上:iOS/iPadOS 微信客户端、Android 微信客户端、Windows PC 微信客户端、Mac 微信客户端、微信小程序硬件框架和用于调试的微信开发者工具等。

不同运行环境下,脚本执行环境以及用于组件渲染的环境是不同的,性能表现也存在差异:

  • 在 iOS、iPadOS 和 Mac OS 上,微信小程序逻辑层的 JavaScript 代码运行在 JavaScriptCore 中,视图层是由 WKWebView 来渲染的,环境有 iOS 14、iPad OS 14、Mac OS 11.4 等;
  • 在 Android 上,微信小程序逻辑层的 JavaScript 代码运行在 V8 中,视图层是由基于 Mobile Chromium 内核的微信自研 XWeb 引擎来渲染的;
  • 在 Windows 上,微信小程序逻辑层 JavaScript 和视图层都是用 Chromium 内核;
  • 在 开发工具上,微信小程序逻辑层的 JavaScript 代码是运行在 NW.js 中,视图层是由 Chromium Webview 来渲染的。

JavaScriptCore 无法开启 JIT 编译 (Just-In-Time Compiler),同等条件下的运行性能要明显低于其他平台。

平台差异

尽管各运行环境是十分相似的,但是还是有些许区别:

  • JavaScript 语法和 API 支持不一致:语法上开发者可以通过开启 ES6ES5 的功能来规避(详情);此外,微信小程序基础库内置了必要的Polyfill,来弥补API的差异(详情)。

  • WXSS 渲染表现不一致:尽管可以通过开启样式补全来规避大部分的问题,还是建议开发者需要在各端分别检查微信小程序的真实表现。

开发者工具仅供调试使用,最终的表现以客户端为准。

微信小程序运行机制

1. 微信小程序的生命周期

微信小程序从启动到最终被销毁,会经历很多不同的状态,微信小程序在不同状态下会有不同的表现。

小程序生命周期

1.1 微信小程序启动

从用户认知的角度看,广义的微信小程序启动可以分为两种情况,一种是冷启动,一种是热启动

  • 冷启动:如果用户首次打开,或微信小程序销毁后被用户再次打开,此时微信小程序需要重新加载启动,即冷启动。
  • 热启动:如果用户已经打开过某微信小程序,然后在一定时间内再次打开该微信小程序,此时微信小程序并未被销毁,只是从后台状态进入前台状态,这个过程就是热启动。

从微信小程序生命周期的角度来看,我们一般讲的「启动」专指冷启动,热启动一般被称为后台切前台。

1.2 前台与后台

微信小程序启动后,界面被展示给用户,此时微信小程序处于「前台」状态。

当用户「关闭」微信小程序时,微信小程序并没有真正被关闭,而是进入了「后台」状态,此时微信小程序还可以短暂运行一小段时间,但部分 API 的使用会受到限制。切后台的方式包括但不限于以下几种:

  • 点击右上角胶囊按钮离开微信小程序
  • iOS 从屏幕左侧右滑离开微信小程序
  • 安卓点击返回键离开微信小程序
  • 微信小程序前台运行时直接把微信切后台(手势或 Home 键)
  • 微信小程序前台运行时直接锁屏

当用户再次进入微信并打开微信小程序,微信小程序又会重新进入「前台」状态。

1.3 挂起

微信小程序进入「后台」状态一段时间后(目前是 5 秒),微信会停止微信小程序 JS 线程的执行,微信小程序进入「挂起」状态。此时微信小程序的内存状态会被保留,但开发者代码执行会停止,事件和接口回调会在微信小程序再次进入「前台」时触发。

当开发者使用了后台音乐播放、后台地理位置等能力时,微信小程序可以在「后台」持续运行,不会进入到「挂起」状态

1.4 微信小程序销毁

如果用户很久没有使用微信小程序,或者系统资源紧张,微信小程序会被「销毁」,即完全终止运行。具体而言包括以下几种情形:

  • 当微信小程序进入后台并被「挂起」后,如果很长时间(目前是 30 分钟)都未再次进入前台,微信小程序会被销毁。
  • 当微信小程序占用系统资源过高,可能会被系统销毁或被微信客户端主动回收。
    • 在 iOS 上,当微信客户端在一定时间间隔内连续收到系统内存告警时,会根据一定的策略,主动销毁微信小程序,并提示用户 「运行内存不足,请重新打开该微信小程序」。具体策略会持续进行调整优化。
    • 建议微信小程序在必要时使用 wx.onMemoryWarning 监听内存告警事件,进行必要的内存清理。

微信小程序更新机制

开发者在管理后台发布新版本的微信小程序之后,微信客户端会有若干个时机去检查本地缓存的微信小程序有没有新版本,并进行微信小程序的代码包更新。但如果用户本地有微信小程序的历史版本,此时打开的可能还是旧版本。

1. 启动时同步更新

在以下情况下,微信小程序启动时会同步更新代码包。同步更新会阻塞微信小程序的启动流程,影响微信小程序的启动耗时。

如果更新失败或超时,为了保障微信小程序的可用性,还是会使用本地版本打开。

定期检查发现版本更新

微信运行时,会定期检查最近使用的微信小程序是否有更新。如果有更新,下次微信小程序启动时会同步进行更新,更新到最新版本后再打开微信小程序,尽可能保证用户能够尽快使用微信小程序的最新版本。

用户长时间未使用微信小程序

用户长时间未使用微信小程序时,为保障微信小程序版本的实时性,会强制同步检查版本更新,更新到最新版本后再打开微信小程序。

若用户处于弱网环境、下载最新版本失败等情况下,仍会启动本地的较低版本。

2. 启动时异步更新

即使启动前未发现更新,微信小程序每次冷启动时,都会异步检查是否有更新版本。如果发现有新版本,将会异步下载新版本的代码包。但当次启动仍会使用客户端本地的旧版本代码,即新版本的微信小程序需要等下一次冷启动才会使用。

开发者手动触发更新

在启动时异步更新的情况下,如果开发者希望立刻进行版本更新,可以使用 wx.getUpdateManager API 进行处理。在有新版本时提示用户重启微信小程序更新新版本。

const updateManager = wx.getUpdateManager()

updateManager.onCheckForUpdate(function (res) {
  // 请求完新版本信息的回调
  console.log(res.hasUpdate)
})

updateManager.onUpdateReady(function () {
  wx.showModal({
    title: '更新提示',
    content: '新版本已经准备好,是否重启应用?',
    success(res) {
      if (res.confirm) {
        // 新的版本已经下载好,调用 applyUpdate 应用新版本并重启
        updateManager.applyUpdate()
      }
    }
  })
})

updateManager.onUpdateFailed(function () {
  // 新版本下载失败
})

3. 微信小程序管理后台的相关设置

微信小程序开发者可以通过在微信小程序管理后台进行设置,影响更新逻辑。

优先使用本地版本设置

若开发者判断某些较新的微信小程序版本无需强制用户同步更新到最新版本,可以在微信小程序管理后台「设置」-「版本设置」-「优先使用本地版本设置」中进行设置,设置后若同步更新时检查本地版本不低于该版本,则优先使用本地版本,同时将会异步下载最新版本的代码包。

微信小程序最低可用版本设置

若开发者判断某些较旧的微信小程序版本服务不再可用,可以在微信小程序管理后台「设置」-「版本设置」-「微信小程序最低可用版本设置」中进行设置。设置后若同步更新时检查本地版本低于该版本,则无法打开,并继续尝试下载最新版本、若异步更新,则会在检查到更新后提示用户重启微信小程序更新新版本。

注意

  1. 开发者在后台发布新版本之后,无法立刻影响到所有现网用户,正常情况下,在全量发布 24 小时之后,新版本可以覆盖 99% 以上的用户。
  2. 微信小程序管理后台的「优先使用本地版本设置」和「微信小程序最低可用版本设置」不会影响同步更新与异步更新的选择。