微信小程序 JavaScript支持情况+运行机制

xiamaocheng / 2023-08-01 / 原文

JavaScript 支持情况

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

  • 不支持使用 eval 执行 JS 代码
  • 不支持使用 new Function 创建函数
  • 客户端 ES6 API 支持情况

     

    前台/后台状态

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

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

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

    小程序启动

    这样,小程序启动可以分为两种情况,一种是冷启动,一种是热启动。

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

     

    小程序销毁时机:

    通常,只有当小程序进入后台一定时间,或者系统资源占用过高,才会被销毁。具体而言包括以下几种情形:

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

    启动场景分类

     

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

    A. 保留上次的浏览状态。场景值有以下几项:

    场景值ID说明
    1001 发现栏小程序主入口,「最近使用」列表(基础库2.2.4版本起包含「我的小程序」列表)
    1003 星标小程序列表
    1023 系统桌面小图标打开小程序

     

     

    1038 从其他小程序返回小程序
    1056 聊天顶部音乐播放器右上角菜单,打开小程序
    1080 客服会话菜单小程序入口,打开小程序
    1083 公众号会话菜单小程序入口 ,打开小程序(只有腾讯客服小程序有)
    1089 聊天主界面下拉,打开小程序/微信聊天主界面下拉,「最近使用」栏(基础库2.2.4版本起包含「我的小程序」栏)
    1090 长按小程序右上角菜单,打开小程序
    1103 发现-小程序主入口我的小程序,打开小程序
    1104 聊天主界面下拉,从我的小程序,打开小程序
    1113 安卓手机负一屏,打开小程序
    1114 安卓手机侧边栏,打开小程序
    1117 后台运行小程序的管理页中,打开小程序

     

     

     

    B. relaunch 到指定页或首页

    包括除 A 类外的其他场景

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

     

     

    A 类场景的重新启动策略

     小程序被销毁后,下次冷启动如果属于 B 类场景,将会进入特定的页面。
     

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

    代码示例:

    { "restartStrategy": "homePage" }

    restartStrategy 可选值:

     
    可选值含义
    homePage (默认值)如果从这个页面退出小程序,下次将从首页冷启动
    homePageAndLatestPage 如果从这个页面退出小程序,下次冷启动后立刻加载这个页面,页面的参数保持不变(不可用于 tab 页)

     

     

    退出状态

    每当小程序可能被销毁之前,页面回调函数 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 // 超时时刻 } } })

     

    onSaveExitState 返回值可以包含两项:

    • 如果超过 expireTimeStamp ,保存的数据将被丢弃,且冷启动时不遵循 restartStrategy 的配置,而是直接从首页冷启动。
    • expireTimeStamp 有可能被自动提前,如微信客户端需要清理数据的时候。
    • 在小程序存活期间, onSaveExitState 可能会被多次调用,此时以最后一次的调用结果作为最终结果。
    • 在某些特殊情况下(如微信客户端直接被系统杀死),这个方法将不会被调用,下次冷启动也不遵循 restartStrategy 的配置,而是直接从首页冷启动。