Node.js中使用Jest测试ESM模块报错的解决求助
解决Jest测试ESM模块时的"Cannot use import statement outside a module"错误
问题分析
你的项目在package.json中设置了"type": "module",所有.js文件默认被Node.js当作ES模块处理,但Jest默认以CommonJS模式解析文件,这就导致测试文件中的import语法被识别为非法,触发报错。
解决方案
按照以下步骤修改配置,让Jest正确支持ESM:
1. 更新Jest配置
在package.json的jest字段中添加以下配置项:
"jest": { "testMatch": ["**/*.test.js"], "transform": {}, "extensionsToTreatAsEsm": [".js"], "moduleNameMapper": { "^(\\.{1,2}/.*)\\.js$": "$1" } }
transform: {}:禁用Jest默认的CommonJS转换插件,避免ESM代码被错误转译extensionsToTreatAsEsm: [".js"]:明确告知Jest将.js文件当作ES模块处理moduleNameMapper:解决Jest在解析ESM导入时对.js扩展名的匹配问题
2. 修改测试命令
更新package.json中的scripts.test,添加Node.js支持ESM的实验性标志:
"scripts": { "test": "npx jest --experimental-vm-modules" }
或者使用完整路径写法:
"scripts": { "test": "node --experimental-vm-modules node_modules/jest/bin/jest.js" }
3. 恢复文件格式
将之前改为.cjs/.mjs的测试文件和源文件改回.js——你的项目已经通过"type": "module"统一设置为ESM模式,不需要单独指定扩展名。
验证测试
运行npm test,此时Jest应该能正确解析ESM代码,测试正常执行。
额外注意事项
- 确保所有导入路径都带有
.js扩展名(ESM规范强制要求,你的测试文件中import sum from '../sum.js'是正确写法) - 若使用Babel,需额外配置
@babel/preset-env支持ESM,但上述方案无需Babel即可解决基础问题
内容的提问来源于stack exchange,提问作者geeky01adarsh
相关产品推荐
相关产品推荐

