使用Jest测试JavaScript时遭遇import语句模块错误求助
解决Jest集成测试中
SyntaxError: Cannot use import statement outside a module错误 问题根源
你遇到的错误来自node-fetch@3.x——这个版本是纯ESM模块,而你的Jest配置和项目环境默认处理CommonJS模块,再加上以下配置冲突:
- Jest版本(28.1.3)与babel-jest版本(29.0.2)不匹配,导致转译逻辑异常
package.json中test命令的testRegex路径与实际项目结构不符- 未正确配置Jest或Babel以处理ESM格式的依赖包
分步解决方案
1. 统一Jest相关依赖版本
版本不兼容会导致Babel转译失效,将babel-jest降级到与jest一致的28.x版本:
npm install --save-dev babel-jest@28.1.3
同步修改package.json的devDependencies对应项:
{ "devDependencies": { "jest": "^28.1.3", "babel-jest": "^28.1.3", // 其他依赖保持不变 } }
2. 修正测试文件路径匹配规则
项目中测试文件位于static/integration-tests,但原命令的testRegex路径错误且正则存在语法问题,修正后:
{ "scripts": { "test": "jest --testRegex='static/integration-tests/.*\\.int\\.test\\.js?$'" } }
3. 处理node-fetch的ESM模块问题
有两种可选方案:
方案A:降级node-fetch到v2(CommonJS兼容版本)
v2版本支持双模块格式,无需额外配置:
npm uninstall node-fetch npm install --save-dev node-fetch@2.6.7
可同步修改validator.js的导入方式为CommonJS(或保留ESM让Babel转译):
const fetch = require('node-fetch');
方案B:配置Jest支持ESM模块
若要保留node-fetch@3.x,需调整项目和Jest配置:
- 在
package.json中添加"type": "module",声明项目使用ESM - 创建
jest.config.js文件:
module.exports = { transform: { "^.+\\.jsx?$": "babel-jest", }, transformIgnorePatterns: [ // 不对node-fetch跳过转译,让Babel处理它 "node_modules/(?!node-fetch)" ], testEnvironment: 'node', };
- 修改测试文件的导入方式为ESM:
import { validate } from '../scripts/validator.js';
4. 优化Babel配置(可选)
为转译添加目标环境配置,提升精准度:
module.exports = { presets: [ ['@babel/preset-env', { targets: { node: 'current' } }] ], plugins: [ "@babel/plugin-transform-modules-commonjs", "@babel/plugin-transform-runtime", ] };
验证测试
执行命令确认错误是否解决:
npm run test
内容的提问来源于stack exchange,提问作者Pratap Charithra
相关产品推荐
相关产品推荐

