zoukankan      html  css  js  c++  java
  • 小程序运行时相关信息

    (1)运行环境:小程序的运行环境

    微信小程序运行在三端:iOS(iPhone/iPad)、Android 和 用于调试的开发者工具。

    三端的脚本执行环境以及用于渲染非原生组件的环境是各不相同的:

    • 在 iOS 上,小程序逻辑层的 javascript 代码运行在 JavaScriptCore 中,视图层是由 WKWebView 来渲染的,环境有 iOS8、iOS9、iOS10;

    • 在 Android 上,

      • 旧版本,小程序逻辑层的 javascript 代码运行中 X5 JSCore 中,视图层是由 X5 基于 Mobile Chrome 57 内核来渲染的;

      • 新版本,小程序逻辑层的 javascript 代码运行在 V8 中,视图层是由自研 XWeb 引擎基于 Mobile Chrome 67 内核来渲染的;

    • 在 开发工具上,小程序逻辑层的 javascript 代码是运行在 NW.js 中,视图层是由 Chromium 60 Webview 来渲染的。

    平台差异

    尽管三端的环境是十分相似的,但是还是有些许区别:

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

    • WXSShttps://developers.weixin.qq.com/miniprogram/dev/devtools/codecompile.html#样式补全),还是建议开发者需要在 iOS 和 Android 上分别检查小程序的真实表现。

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

    (2)JavaScript 支持情况

    运行限制

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

    • 不支持使用 eval 执行 JS 代码
    • 不支持使用 new Function 创建函数

    客户端 ES6 API 支持情况

    微信小程序已经支持了绝大部分的 ES6 API,已支持的 API 如下(部分API依赖系统版本):

    StringiOS8iOS9iOS10Android
    codePointAt        
    normalize    
    includes        
    startsWith        
    endsWith        
    repeat        
    String.fromCodePoint        
    ArrayiOS8iOS9iOS10Android
    copyWithin        
    find        
    findIndex        
    fill        
    entries        
    keys        
    values    
    includes      
    Array.from        
    Array.of        
    NumberiOS8iOS9iOS10Android
    isFinite        
    isNaN        
    parseInt        
    parseFloat        
    isInteger        
    EPSILON        
    isSafeInteger        
    MathiOS8iOS9iOS10Android
    trunc        
    sign        
    cbrt        
    clz32        
    imul        
    fround        
    hypot        
    expm1        
    log1p        
    log10        
    log2        
    sinh        
    cosh        
    tanh        
    asinh        
    acosh        
    atanh        
    ObjectiOS8iOS9iOS10Android
    is        
    assign        
    getOwnPropertyDescriptor        
    keys        
    getOwnPropertyNames        
    getOwnPropertySymbols        

    OtheriOS8iOS9iOS10Android
    Symbol        
    Set        
    Map        
    Proxy  
    Reflect        
    Promise    

    (3)小程序运行机制

    小程序启动

    小程序启动会有两种情况,一种是「冷启动」,一种是「热启动」。

    • 热启动:假如用户已经打开过某小程序,然后在一定时间内再次打开该小程序,此时无需重新启动,只需将后台态的小程序切换到前台,这个过程就是热启动;
    • 冷启动:用户首次打开或小程序被微信主动销毁后再次打开的情况,此时小程序需要重新加载启动,即冷启动。

    小程序没有重启的概念。

    前台/后台状态

    当用户点击右上角胶囊按钮关闭小程序,或者按了设备 Home 键离开微信时,小程序并没有直接销毁,而是进入了后台状态;

    当用户再次进入微信或再次打开小程序,小程序又会从后台进入前台

    小程序销毁

    需要注意的是:只有当小程序进入后台一定时间,或者系统资源占用过高,才会被真正的销毁。

    • 当小程序进入后台,客户端会维持一段时间的运行状态,超过一定时间后(目前是5分钟)小程序会被微信主动销毁。
    • 当小程序占用系统资源过高,可能会被系统销毁或被微信客户端主动回收。
      • 在 iOS 上,当微信客户端在一定时间间隔内(目前是 5 秒)连续收到两次及以上系统内存告警时,会主动进行小程序的销毁,并提示用户 「该小程序可能导致微信响应变慢被终止」。
      • 建议小程序在必要时使用 wx.onMemoryWarning 监听内存告警事件,进行必要的内存清理。

    基础库 1.1.0 及以上,1.4.0 以下版本: 当用户从扫一扫、转发等入口(场景值为1007, 1008, 1011, 1025)进入小程序,且没有置顶小程序的情况下退出,小程序会被销毁。

    再次打开逻辑

    基础库 1.4.0 开始支持,低版本需做兼容处理

    用户打开小程序的预期有以下两类场景:

    A. 打开首页: 场景值有以下几项:

    场景值ID说明
    1001 发现栏小程序主入口,「最近使用」列表
    1019 微信钱包
    1022 聊天顶部置顶小程序入口
    1023 安卓系统桌面图标
    1038 从另一个小程序返回
    1056 音乐播放器菜单

    B. 打开小程序指定的某个页面: 场景值为除 A 以外的其他

    当再次打开一个小程序逻辑如下:

    上一次的场景当前打开的场景效果
    A A 保留原来的状态
    B A 清空原来的页面栈,打开首页(相当于执行 wx.reLaunch 到首页)
    A 或 B B 清空原来的页面栈,打开指定页面(相当于执行 wx.reLaunch 到指定页)

    (4)小程序更新机制

    未启动时更新

    开发者在管理后台发布新版本的小程序之后,如果某个用户本地有小程序的历史版本,此时打开的可能还是旧版本。微信客户端会有若干个时机去检查本地缓存的小程序有没有更新版本,如果有则会静默更新到新版本。总的来说,开发者在后台发布新版本之后,无法立刻影响到所有现网用户,但最差情况下,也在发布之后 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 () {
      // 新版本下载失败
    })

    .

  • 相关阅读:
    Mac 或者 iMac 上传应用到appStore 提交失败
    iOS 上传AppStore 被拒汇总
    iOS 最新修改项目名称
    iOS 之 Cocoa框架
    iOS 之 UIKit框架
    iOS 之 Core Animation
    iOS之Block
    单例模式
    js 关于日期
    利用卷积神经网络对大规模可穿戴传感器数据进行运动分类
  • 原文地址:https://www.cnblogs.com/fightjianxian/p/11106683.html
Copyright © 2011-2022 走看看