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

升级node-fetch@3.0.0后Jest运行报Cannot use import statement outside a module错误

node-fetch 3.x Jest测试报错解决方案

核心问题原因

node-fetch 3.0及以上版本为纯ESM模块,而Jest默认仅处理项目源码的转译,会跳过node_modules下的ESM模块解析,同时CJS格式的jest.requireActual无法正确读取ESM模块的导出内容,就会出现你遇到的两类报错。

可选解决方案

方案1:降级兼容(改动最小,优先推荐)

如果没有强制使用node-fetch 3.x新特性的需求,直接降级到2.x版本即可,2.x版本同时兼容CJS和ESM,原有代码无需修改:

npm install node-fetch@2
# 若使用TypeScript,同步安装对应类型包
npm install @types/node-fetch@2 -D

原有jest.requireActual("node-fetch")的写法可直接正常运行。

方案2:保留node-fetch 3.x,调整Jest配置适配ESM

步骤1:修改项目基础配置

在package.json中新增配置,声明项目为ESM模块:

{
  "type": "module"
}

调整tsconfig.json编译配置,适配ESM规范:

{
  "compilerOptions": {
    "module": "ESNext",
    "moduleResolution": "NodeNext"
  }
}

步骤2:修改Jest配置

保留ts-jest转译规则,新增ESM兼容配置,同时放开对node-fetch及其依赖的转译忽略:

// jest.config.js
export default {
  transform: {
    "^.+\\.ts?$": ["ts-jest", { useESM: true }]
  },
  // 放开对node-fetch及其依赖包的转译限制
  transformIgnorePatterns: [
    "node_modules/(?!(node-fetch|data-uri-to-buffer|fetch-blob|formdata-polyfill)/)"
  ],
  moduleFileExtensions: ["ts", "js", "mjs", "cjs", "json", "node"],
  // 声明.ts文件按ESM处理
  extensionsToTreatAsEsm: [".ts"]
}

步骤3:保持已修改的test脚本

你之前调整的test脚本无需改动:

{
  "scripts": {
    "test": "node --experimental-vm-modules node_modules/jest/bin/jest.js"
  }
}

原有导入Response的import { Response } from "node-fetch"写法可正常运行。

方案3:使用兼容封装包替代

无需修改现有配置,直接替换依赖为兼容CJS/ESM的cross-fetch即可,API和node-fetch完全一致:

npm install cross-fetch

导入代码调整为:

import { Response } from "cross-fetch";

内容的提问来源于stack exchange,提问作者avenmia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 13:06:04