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

TypeScript下Jest引入node-fetch报模块外使用import语句错误

问题根因

你安装的node-fetch v3及以上版本为纯ESM格式包,Jest默认运行在CommonJS模式下,且默认不会转译node_modules目录下的依赖,因此解析到node-fetch内部的ESMimport语句时会抛出语法错误。
express发布的是CommonJS格式产物,因此导入时不会触发同类错误。

解决方案

按优先级从高到低选择一种即可:

方案1:使用Node.js原生内置fetch(最省事,推荐)

Node.js 18.0.0及以上版本已经原生内置Fetch API,完全不需要额外安装node-fetch依赖,直接删掉代码里的import fetch from 'node-fetch'语句即可直接调用全局fetch。
如果需要类型支持,确保安装的@types/node版本>=18,且在tsconfig.json中添加"compilerOptions.types": ["node"]配置即可。

方案2:降级node-fetch到v2版本(零配置兼容)

node-fetch v2.x版本是CommonJS格式产物,和当前Jest的默认运行模式完全兼容,不需要修改任何Jest配置:

  1. 卸载当前版本的依赖:
npm uninstall node-fetch @types/node-fetch
  1. 安装v2版本的对应依赖:
npm install --save-dev node-fetch@2 @types/node-fetch@2

安装完成后直接运行测试即可正常执行。

方案3:修改Jest配置兼容node-fetch v3+

如果你必须使用v3及以上版本的node-fetch,需要修改Jest配置,让ts-jest转译node-fetch及其依赖的ESM包,不要忽略这些文件:
修改项目根目录下的jest.config.js为如下内容:

/** @type {import('ts-jest/dist/types').InitialOptionsTsJest} */
module.exports = {
  preset: 'ts-jest',
  testEnvironment: 'node',
  transform: {
    '^.+\\.tsx?$': 'ts-jest',
    '^.+\\.jsx?$': 'ts-jest',
  },
  transformIgnorePatterns: [
    'node_modules/(?!(node-fetch|data-uri-to-buffer|fetch-blob|formdata-polyfill)/)',
  ],
};

配置说明:

  • 新增js文件转译规则,让ts-jest处理js格式的依赖文件
  • transformIgnorePatterns调整默认忽略规则,把node-fetch和它依赖的几个纯ESM子包从忽略列表排除,让Jest将这些文件的ESM语法转译为CommonJS格式

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 18:09:27