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

如何通过设置transform: {}禁用代码转换以适配Node项目中ESM的Jest配置?

如何通过设置transform: {}禁用代码转换以适配Node项目中ESM的Jest配置?

我完全懂你现在的困扰——在Node项目里用ESM(import语法)搭配Jest时,总遇到解析失败的问题,刚上手Jest确实容易在配置上踩坑。我来一步步帮你理清楚怎么解决:

首先,Jest文档里说的“禁用代码转换”,意思是让Jest不要去转译你的JS文件,直接用Node的原生ESM支持来处理,这需要把transform设为空对象,而且这个配置必须放在Jest的专属配置块里,不是package.json的顶级项(你之前直接把transform放在package.json根目录是不对的哦)。


方法一:在package.json里直接配置Jest

修改你的package.json,把transform放在jest配置块内,同时保留正确的test脚本:

{
  "scripts": {
    "test": "node --experimental-vm-modules node_modules/jest/bin/jest.js"
  },
  "jest": {
    "transform": {}
  },
  // 重要:告诉Node把项目里的.js文件当作ESM处理
  "type": "module"
}

方法二:用单独的Jest配置文件(更清晰)

如果不想在package.json里堆太多配置,可以创建jest.config.mjs(因为用ESM,所以用.mjs后缀),内容如下:

export default {
  transform: {}
};

这时候package.json里的test脚本保持不变,同时确保项目已经添加了"type": "module"配置。


关于你之前尝试的babel-jest

如果你想用Babel来转译ESM而不是禁用转换,需要先安装必要的依赖:

npm install --save-dev @babel/core babel-jest @babel/preset-env

然后添加Babel配置,可以在package.json里加:

"babel": {
  "presets": [
    ["@babel/preset-env", { "targets": { "node": "current" } }]
  ]
}

再把Jest的transform配置改成:

"jest": {
  "transform": {
    "^.+\\.js$": "babel-jest"
  }
}

不过这种方式是把ESM转成CommonJS给Jest处理,如果你项目本身就是纯ESM,更推荐前面的“禁用转换”方案,更直接贴合你的需求。


最后注意运行方式

你之前直接跑npx jest是不行的,因为这个命令不会用到你package.json里配置的--experimental-vm-modules参数。正确的运行方式是:

npm run test

另外,你的.test.js里的导入是完全正确的:

import { exec } from "child_process";
import { jest } from "@jest/globals";

在ESM模式下,必须从@jest/globals导入jest对象,不能用全局的jest,这部分你没出错。

如果还是遇到解析错误,先检查项目根目录有没有"type": "module"——这是Node识别ESM项目的关键配置,没加的话Node会把.js文件默认当成CommonJS处理,和你的import语法直接冲突。

备注:内容来源于stack exchange,提问作者Andi G

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 09:38:02