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 暴露到全局,因此只会在低版本出现该问题。 建议参照上面的排查指引进行排查直至修复解决问题。