Typescript项目导入node-fetch报ERR_REQUIRE_ESM错误如何解决
问题根因
你遇到的报错核心原因是:node-fetch@3.x 及以上版本仅支持ES Module模块规范,不再兼容CommonJS规范。你初始配置下TS编译输出CommonJS格式代码,运行时用require()加载ESM格式的node-fetch就会触发第一个报错;你切换到ESM规范后,默认配置的ts-node不支持在ESM模式下识别.ts扩展名,因此触发第二个报错。
方案1:降级使用node-fetch@2.x(改动最小,推荐)
node-fetch 2.x版本同时兼容CommonJS和ESM规范,不需要调整你的现有配置,直接安装对应版本即可:
执行安装命令:
npm install node-fetch@2 @types/node-fetch@2 --save
安装完成后原有导入写法import fetch from 'node-fetch'无需修改,直接就能正常运行。
方案2:适配ESM规范使用高版本node-fetch
如果需要使用node-fetch 3.x及以上的新特性,按以下步骤调整配置即可:
- 修正tsconfig.json中的拼写错误:你当前的tsconfig里有个配置名写错了,把
sModuleInterop改为esModuleInterop: true,否则会影响模块导入逻辑。 - 在package.json中添加配置:
{ "type": "module" }
- 修改tsconfig.json的编译配置:
{ "compilerOptions": { "module": "NodeNext", "moduleResolution": "NodeNext", // 其他原有配置保持不变即可 } }
- 修改nodemon配置的执行命令:
{ "execMap": { "ts": "NODE_ENV=development node --no-warnings --loader ts-node/esm -T" } }
调整完成后重新启动服务即可正常导入使用node-fetch。
内容的提问来源于stack exchange,提问作者th3g3ntl3man
相关产品推荐
相关产品推荐

