- 小程序发布新版本后,线上始终有部分人使用的旧版本(老版本)
小程序具体更新机制请参考 https://developers.weixin.qq.com/miniprogram/dev/framework/runtime/update-mechanism.html 但有开发者咨询为什么小程序加了强制更新的机制后线上还始终有部分有旧版? 当用户网络较差时,更新新版本失败时用户会打开旧版本,不然他们就会打开失败微信客户端版本较低的版本也会存在更新不及时的情况之前有打开小程序的用户才可能打开旧版本,如果是新用户一定会打开最新版本对这部分用户官方暂时没有提供让他们强制更新的能力,官方在丰富能力让开发者选择是否打开失败还是打开旧版本
2023-11-13 - regeneratorRuntime 相关报错排查指引
regeneratorRuntime is not defined Can't find variable: regeneratorRuntime 该问题是由于 babel 编译时未能正确注入 regeneratorRuntime 导致的。 babel 会将高版本js语法,转换为低版本兼容的语法。regeneratorRuntime 是 babel 在对 js 中 async/await 语法进行转换时,会使用的 runtime 依赖。开发者工具的【将 JS 编译成 ES5】即是使用 babel 进行编译。 可以先尝试更新开发者工具和 miniprogram-ci 到最新版后,开启开发者工具的【将 JS 编译成 ES5】编译选项。miniprogram-ci 需要开启 es7: true (增强编译)选项。注意若使用第三方框架已经进行了 babel 编译;或者自行使用了 babel 编译,则不需要开启工具和 miniprogram-ci 的编译选项。 若使用了第三方框架,或者自行配置的 babel 配置,则需要检查是否正确注入 regeneratorRuntime。常见的解决方案是为 babel 配置添加插件 @babel/plugin-transform-runtime。 Function("r", "regeneratorRuntime = r") is not a function 该问题通常是正确引入了 regeneratorRuntime,但是误将 regeneratorRuntime 编译至了严格模式(即含有 'use strict' )。 regeneratorRuntime 由于会尝试通过不使用 var 关键字直接赋值的方式,来声明全局 regeneratorRuntime 变量。这种方式在严格模式下会报错,因而尝试使用 new Function 的形式从严格模式跳入非严格模式,再次进行全局变量声明。然而小程序环境下不允许使用 new Function,因而初始化失败。 该问题通常是由于重复打包/编译导致的,即第一次编译时将 regeneratorRuntime 识别为非严格模式,而第二次编译时由于失去原始信息,识别为严格模式。 需要排查打包路径是否重复经过了 babel 或 webpack 等编译或打包。若使用第三方框架已经进行了 babel 编译;或者自行使用了babel编译,则需要关闭开发者工具的【将 JS 编译成 ES5】编译选项和 miniprogram-ci 的 es7: true (增强编译)选项。 我的小程序并没有使用 async/await 语法,但也报错 如果你的小程序引入了插件,而有插件没有正确配置编译模式,同样会出现上述问题。建议排查是否是插件导致。如果确认是插件导致,则需要插件提供方参考本指引解决问题。 另外的,npm 模块、第三方框架等同样可能引入 regeneratorRuntime 依赖。 我的小程序在正式版没有以上问题,但开发者工具/开发版预览/体验版会有上面的报错 该问题是由于基础库 bug,在 2.21.3 版本之前误将 regeneratorRuntime 暴露到了全局,因而导致小程序即使没有正确注入 regeneratorRuntime,但也能够正常运行。 基础库 2.21.3 版本已将 regeneratorRuntime 从工具、开发版、预览版小程序&小游戏上移除,因此会看到报错。你可以参照上面的排查指引进行排查直至解决问题。 基础库暂时没有移除正式版小程序的 regeneratorRuntime,因此你不用担心线上正式版小程序,也可以不用紧急修复该问题。 我的小程序只在某些低版本微信上出现上面的报错 低版本的基础库如 2.10.4 还没有误将 regeneratorRuntime 暴露到全局,因此只会在低版本出现该问题。 建议参照上面的排查指引进行排查直至修复解决问题。
2022-01-17