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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 22:30:52