如何通过设置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

