使用Jest测试JS ES Modules工具时遇导入语法错误求助
解决Jest测试ESM模块时的
SyntaxError: Cannot use import statement outside a module错误 以下是几个针对性的修复方案,按优先级尝试:
方案1:启用Node.js的ESM实验性支持
当项目通过package.json的"type": "module"声明为ESM模块时,Jest需要依赖Node.js的实验性ESM支持才能正常运行。修改package.json的测试脚本:
"scripts": { "test": "node --experimental-vm-modules node_modules/jest/bin/jest.js" }
方案2:调整Jest与Babel的适配配置
若需要保留Babel转译,修改package.json中的Jest配置,让babel-jest兼容ESM:
"jest": { "transform": { "^.+\\.js$": ["babel-jest", { "useESM": true }] }, "extensionsToTreatAsEsm": [".js"], "moduleNameMapper": { "^(\\.{1,2}/.*)\\.js$": "$1" } }
useESM: true:告知babel-jest以ESM模式处理转译extensionsToTreatAsEsm:明确将.js文件视为ESM模块moduleNameMapper:处理ESM导入时必须添加的.js扩展名问题,避免测试中导入路径报错
方案3:移除Babel依赖(使用Jest原生ESM支持)
如果你的Node.js版本在v16及以上,可以直接使用Jest的原生ESM支持,无需Babel:
- 卸载Babel相关依赖:
npm uninstall --save-dev @babel/core @babel/preset-env babel-jest
删除
babel.config.cjs文件修改
package.json的Jest配置:
"jest": { "transform": {}, "extensionsToTreatAsEsm": [".js"], "moduleNameMapper": { "^(\\.{1,2}/.*)\\.js$": "$1" } }
- 确保测试脚本添加了
--experimental-vm-modules参数(同方案1)
额外检查点
- 测试文件中的导入语句必须添加
.js扩展名,ESM规范要求使用完整扩展名 - 确认Jest版本在28.0.0以上,更早版本对ESM支持不完善
内容的提问来源于stack exchange,提问作者am3005
相关产品推荐
相关产品推荐

