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配置:
- 卸载当前版本的依赖:
npm uninstall node-fetch @types/node-fetch
- 安装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
相关产品推荐
相关产品推荐

