Jest测试Node.js组件报错:node_modules中import语句无法使用求助
解决Jest测试中node-fetch的ES模块语法错误问题
问题根源
你遇到的错误是因为node-fetch(v3+版本)本身是ES模块,使用了import语法,但Jest默认会忽略对node_modules目录下文件的转译,导致无法识别ES模块语法。你之前配置的transformIgnorePatterns目标错误——node:http是Node.js内置模块,根本不在node_modules里,所以这个规则对解决问题毫无作用。
解决方案
1. 修正Jest的transformIgnorePatterns配置
需要让Jest不对node-fetch进行转译忽略,也就是把它从默认的node_modules忽略列表中排除,让babel-jest去转译它的ES模块语法。修改package.json中的Jest配置:
"jest": { "transform": { "^.+\\.[t|j]sx?$": "babel-jest" }, "transformIgnorePatterns": [ "/node_modules/(?!node-fetch)" ] }
2. 确保Babel配置支持ES模块转译
检查你的Babel配置文件(比如babel.config.json或.babelrc),确保包含@babel/preset-env,并配置为针对你的Node.js版本转译:
{ "presets": [ ["@babel/preset-env", { "targets": { "node": "current" } }] ] }
如果还没安装相关依赖,执行以下命令安装:
npm install --save-dev @babel/core @babel/preset-env babel-jest
3. 可选:切换Jest到ESM模式(适合Node.js 16+)
如果你的项目本身已经使用ES模块(package.json中设置了"type": "module"),可以直接让Jest启用ESM模式,无需转译:
- 在package.json中添加:
"jest": { "moduleFileExtensions": ["js", "mjs"], "transform": {}, "extensionsToTreatAsEsm": [".js"] }, "type": "module"
验证
修改完成后,重新执行npm test,应该就能正常识别node-fetch的ES模块语法,不再抛出SyntaxError。
内容的提问来源于stack exchange,提问作者chygo
相关产品推荐
相关产品推荐

