使用Mocha+node-fetch+TypeScript测试时出现未知.ts扩展名错误
问题原因
你遇到的报错根源是node-fetch@3.x及以上版本为纯ESM包,仅支持ESModule加载模式。当代码中存在对该包的引入语句时,Node.js会自动切换到ESM加载流程,但你当前Mocha默认配置的是CommonJS模式的ts-node加载器,两种加载模式不兼容导致ts-node无法正常识别.ts后缀文件,哪怕你没有实际调用fetch相关代码,只要存在引入语句触发了ESM加载流程就会触发报错。
可行解决方案
方案1:降级node-fetch到v2版本(最简单,适配性最高)
node-fetch@2.x是兼容CommonJS的版本,不需要修改现有Mocha配置即可正常运行,执行以下命令安装即可:
npm install node-fetch@2 npm install @types/node-fetch@2 -D
方案2:调整配置适配ESM加载模式(需要保留node-fetch v3+时使用)
- 确认package.json中已设置
"type": "module" - 调整tsconfig.json配置,添加以下字段:
{ "compilerOptions": { "module": "NodeNext", "moduleResolution": "NodeNext", // 其余原有配置保持不变 }, "ts-node": { "esm": true } }
- 修改package.json中的test脚本,更换Mocha的加载器:
{ "scripts": { "test": "mocha --loader=ts-node/esm test/**/*.spec.ts" } }
方案3:使用内置fetch替代(Node.js 18+适用)
Node.js 18及以上版本已经内置了全局fetch API,不需要额外安装node-fetch包,直接删除node-fetch依赖、移除对应的import语句即可直接使用全局fetch,不会触发该兼容性问题。
内容的提问来源于stack exchange,提问作者Jeremy Hughes
相关产品推荐
相关产品推荐

