如何配置Jest使其支持ES6 Modules运行?
错误根因
你遇到的报错核心是package.json中配置了"type": "module",Node.js默认将所有.js后缀文件识别为ES模块,但Jest默认运行逻辑依赖CommonJS模块语法(如module、require),两套规范混用触发了报错。你已配置的Babel仅对开发环境生效,未适配Jest运行环境,因此出现开发正常、测试报错的情况。
可行解决方案
提供两种常用的适配方案,可根据你的项目情况选择:
方案一:使用Jest原生ESM支持(Jest 27及以上版本适用)
Jest 27+已提供实验性的原生ES模块支持,不需要额外转译,配置步骤如下:
- 修改
package.json中的test执行脚本,根据你的运行环境选择对应配置:- Linux/Mac环境:
"test": "NODE_OPTIONS=--experimental-vm-modules jest" - Windows CMD环境:
"test": "set NODE_OPTIONS=--experimental-vm-modules && jest" - Windows PowerShell环境:
"test": "$env:NODE_OPTIONS=\"--experimental-vm-modules\"; jest"
- Linux/Mac环境:
- 新增/修改Jest配置文件,因为
"type": "module"的项目中Jest默认会把.js配置文件识别为ES模块,建议将配置文件命名为jest.config.cjs,内容如下:
module.exports = { testEnvironment: "node", // 关闭默认转译,直接使用原生ESM transform: {} }
方案二:通过Babel转译ESM为CommonJS(兼容性更好)
如果不想使用实验性特性,可以通过Babel将测试环境的ES模块转译为CommonJS供Jest使用,配置步骤如下:
- 修改Babel配置文件(
.babelrc.json/babel.config.json),新增test环境的适配规则:
{ "env": { "test": { "presets": [ ["@babel/preset-env", { "targets": { "node": "current" }, // 强制将ESM转译为CommonJS "modules": "commonjs" }] ] } } }
- 新增/修改
jest.config.cjs配置文件,指定转译规则:
module.exports = { testEnvironment: "node", transform: { "^.+\\.js$": "babel-jest" } }
注意事项
- 不要在代码中混用ES模块语法(
import/export)和CommonJS语法(require/module.exports),统一使用ES模块语法即可 - 若当前使用的Jest版本低于27,建议先升级到最新稳定版本,旧版本对ESM的支持存在较多已知问题
内容的提问来源于stack exchange,提问作者Carlos Aguilar Duarte
相关产品推荐
相关产品推荐

