Jest与Babel配置为ESM时运行报错问题求助
错误原因
当你在package.json中设置"type": "module"后,所有.js文件会被Node.js默认识别为ECMAScript模块(ESM)。而Jest默认通过同步方式调用Babel API加载配置文件,但ESM模块的加载逻辑本身是异步的,Babel的同步API无法兼容ESM格式的配置文件,因此触发该错误——核心矛盾就是Jest的同步加载逻辑和ESM配置的异步要求不匹配。
可行解决办法
不用把babel.config.js转为CommonJS或JSON,试试这几个方案:
方案1:让babel-jest启用异步配置加载
在你的Jest配置文件(比如jest.config.mjs,因为package.json设了type: module,所以用ESM格式)中,给babel-jest添加asyncConfig: true配置,明确告诉它异步加载Babel配置:
export default { transform: { '^.+\\.(js|jsx)$': [ 'babel-jest', { configFile: './babel.config.js', asyncConfig: true } ] } };
方案2:将babel.config.js改为异步导出函数
Babel本身支持异步配置函数,把你的ESM配置改成异步导出的函数形式,就能适配Jest的异步加载需求:
export default async () => { return { presets: ['@babel/preset-env'], // 你的其他Babel配置项 }; };
方案3:使用Jest的实验性ESM支持flag
运行Jest时加上--experimental-vm-modules参数,开启Jest对ESM模块的实验性支持,这个参数能让Jest更好地处理ESM格式的配置文件:
jest --experimental-vm-modules
如果不想每次手动加参数,可以把这个命令写到package.json的scripts里:
{ "scripts": { "test": "jest --experimental-vm-modules" } }
内容的提问来源于stack exchange,提问作者Mr.
相关产品推荐
相关产品推荐

