微信小程序运行机制和更新机制

您所在的位置:网站首页 小程序的更新机制 微信小程序运行机制和更新机制

微信小程序运行机制和更新机制

2024-02-05 03:09| 来源: 网络整理| 查看: 265

小程序的运行环境 小程序运行平台逻辑层运行环境视图层运行环境iOSJavaScriptCore由 WKWebView 来渲染AndroidV8由自研 XWeb 引擎基于 Mobile Chrome 内核来渲染的开发工具NW.jsChromium Webview 来渲染PCChrome 内核Chrome 内核MacJavaScriptCore由 WKWebView 来渲染的

平台差异

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

JavaScript 语法和 API 支持不一致:语法上开发者可以通过开启 ES6 转 ES5 的功能来规避(详情);此外,小程序基础库内置了必要的Polyfill,来弥补API的差异(详情)。WXSS 渲染表现不一致:尽管可以通过开启样式补全来规避大部分的问题,还是建议开发者需要在 iOS 和 Android 上分别检查小程序的真实表现。

运行限制

基于安全考虑,小程序中不支持动态执行 JS 代码,即:

不支持使用 eval 执行 JS 代码不支持使用 new Function 创建函数 小程序运行机制 前后台状态切换小程序启动小程序销毁

1、前台/后台状态

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

当用户点击右上角胶囊按钮关闭小程序,或者按了设备 Home 键离开微信时,小程序并没有完全终止运行,而是进入了后台状态,小程序还可以运行一小段时间。

当用户再次进入微信或再次打开小程序,小程序又会从后台进入前台。但如果用户很久没有再进入小程序,或者系统资源紧张,小程序可能被销毁,即完全终止运行。

可在 app.js 中注册前台 / 后台切换的回调函数。当小程序从后台进入前台显示时会触发 onShow,当小程序从前台到后台时会触发 onHide。

2、小程序启动

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

3、小程序销毁时机

小程序进入后台一定时间系统资源占用过高

(1) 当小程序进入后台,可以维持一小段时间的运行状态,如果这段时间内都未进入前台,小程序会被销毁。 (2) 当小程序占用系统资源过高,可能会被系统销毁或被微信客户端主动回收。

在 iOS 上,当微信客户端在一定时间间隔内连续收到系统内存告警时,会根据一定的策略,主动销毁小程序,并提示用户 「运行内存不足,请重新打开该小程序」。具体策略会持续进行调整优化。建议小程序在必要时使用 wx.onMemoryWarning 监听内存告警事件,进行必要的内存清理。

4、启动场景及重新启动策略

用户打开小程序时,场景可分为以下 A、B 两类:

A. 保留上次的浏览状态。比如下面的两种场景值:

1104 聊天主界面下拉,从我的小程序,打开小程序 1023 系统桌面小图标打开小程序 若进入的场景中带有 path,则每次打开小程序时都进入对应的 path 页面 若进入的场景中不带 path:

若小程序是热启动,则保留原来状态若小程序是冷启动,则遵循下一节的重启策略,可能是首页或上次退出的页面

B. relaunch 到指定页或首页

包括除 A 类外的其他场景

若进入的场景中带有 path,则每次点击时都进入对应的 path 页面若进入的场景中不带 path,则每次进入都打开首页

重新启动策略

冷启动重新打开小程序时:

属于 B 类场景,会根据是否带有path路径,将会进入特定的页面或者首页。属于 A 类场景,默认情况下将会进入小程序的首页。

属于 A 类场景,默认情况下将会进入小程序的首页。在页面对应的 json 文件中(也可以全局配置在 app.json 的 window 段中),指定 restartStrategy 配置项可以改变这个默认的行为,使得从某个页面退出后,下次 A 类场景的冷启动可以回到这个页面。 在这里插入图片描述

小程序退出状态 小程序在被销毁之前,如果想要保存页面的一些状态(比如:输入框中的文本内容,单选框勾选状态等)可以使用小程序的退出状态(页面回调函数onSaveExitState)来保留这些状态,下次启动时可以通过 exitState 获得这些已保存数据。 问题:这些状态的保存使用缓存和使用退出状态的区别?

{ "restartStrategy": "homePageAndLatestPage" } Page({ onLoad: function() { var prevExitState = this.exitState // 尝试获得上一次退出前 onSaveExitState 保存的数据 if (prevExitState !== undefined) { // 如果是根据 restartStrategy 配置进行的冷启动,就可以获取到 prevExitState.myDataField === 'myData' } }, onSaveExitState: function() { var exitState = { myDataField: 'myData' } // 需要保存的数据 return { data: exitState, expireTimeStamp: Date.now() + 24 * 60 * 60 * 1000 // 超时时刻 } } })

在这里插入图片描述

小程序更新机制 未启动时更新

(1) 开发者在管理后台发布新版本的小程序之后,如果某个用户本地有小程序的历史版本,此时打开的可能还是旧版本。 (2)微信客户端会有若干个时机去检查本地缓存的小程序有没有更新版本,如果有则会静默更新到新版本。 (3) 总的来说,开发者在后台发布新版本之后,无法立刻影响到所有现网用户,但最差情况下,也在发布之后 24 小时之内下发新版本信息到用户。用户下次打开时会先更新最新版本再打开。

启动时更新

小程序每次冷启动时,都会检查是否有更新版本,如果发现有新版本,将会异步下载新版本的代码包,并同时用客户端本地的包进行启动,即新版本的小程序需要等下一次冷启动才会应用上。 如果需要马上应用最新版本,可以使用 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 () { // 新版本下载失败 })

开发一定要了解小程序的更新机制,因为在工作中有以下几种情况会出现:

(1)QA发布之后,打开小程序来验证效果,发现还是老版本的内容? 这是因为新版本的拉取是异步的,杀掉进程,重新打开小程序即可。(2)产品询问发布上线之后的小程序对用户什么时候进行全部更新? 发布新版本之后,无法立刻影响到所有现网用户,但最差情况下,也在发布之后 24 小时之内下发新版本信息到用户。用户下次打开时会先更新最新版本再打开。

官方文档一键达

缓存

开启本地缓存数据,进行存储、获取和删除等控制。 单个小程序的缓存总上限为 10 MB。 同步方法会阻塞当前任务,直到同步方法处理返回。异步方法不会阻塞当前任务。 Q:小程序是否支持 cookie 和 session? A:小程序不建议使用 cookie,不支持 session。推荐使用小程序缓存。 Q:使用了缓存 API 后,小程序的缓存什么时候会被清掉? A:使用了缓存 API 必须使用清除 API,否则缓存不会被清除掉。

微信原生的 wx.request 网络请求接口并不支持传统的 Cookie,但有时候我们现有的后端接口确于依赖 Cookie(比如服务器用户登录态), 这个库(npm install weapp-cookie --save)可用一行代码为你的小程序实现 Cookie 机制,以保证基于 cookie 的服务会话不会失效,与 web 端共用会话机制



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3