You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 04:30:24