如何从metro-react-native-babel-preset中排除@babel/plugin-transform-regenerator
解决方案
你之前配置的exclude参数不生效,是因为metro-react-native-babel-preset的exclude可过滤列表未包含@babel/plugin-transform-regenerator,该插件是单独做了Hermes判断引入的,不走exclude逻辑,可通过以下方案解决:
- 方案1:利用预设内置的Hermes开关(最推荐,无侵入)
你贴出的源码已经做了兼容逻辑:当isHermes为true时会自动跳过@babel/plugin-transform-regenerator的引入,你只需要在预设参数里新增hermes: true配置即可,修改后的配置如下:
const babelOptions = { presets: [ [ 'module:metro-react-native-babel-preset', { // 开启Hermes开关,自动跳过regenerator插件引入 hermes: true, exclude: ['regenerator-transform'] } ] ] } module.exports = require('babel-jest').createTransformer(babelOptions);
如果你的项目本身没有开启Hermes、不想改动运行时引擎,可参考下面的其他方案。
- 方案2:Babel原生禁用预设内置插件
Babel 7及以上版本支持直接在全局plugins配置中,将需要禁用的插件配置为false,优先级高于预设内的插件引入,直接添加到你的配置中即可:
const babelOptions = { presets: [['module:metro-react-native-babel-preset']], plugins: [ // 禁用预设中引入的regenerator插件 ["@babel/plugin-transform-regenerator", false] ] } module.exports = require('babel-jest').createTransformer(babelOptions);
- 方案3:兜底方案,用patch-package修改预设源码
如果上面两种方案都不生效,可以通过补丁修改node_modules内的预设源码,操作步骤如下:
- 安装patch-package:
npm i patch-package --save-dev - 打开
node_modules/metro-react-native-babel-preset/src/configs/main.js,将regenerator插件对应的引入行修改为:
isHermes ? null : null, // 直接禁用regenerator插件引入
- 执行命令生成补丁:
npx patch-package metro-react-native-babel-preset - 在package.json的scripts中新增postinstall钩子,后续安装依赖会自动应用补丁:
{ "scripts": { "postinstall": "patch-package" } }
内容的提问来源于stack exchange,提问作者niryo
相关产品推荐
相关产品推荐

