TypeScript引入node-fetch报require() of ES Module不支持错误问询
问题根源
- node-fetch v3及以上版本仅支持ESM模块规范,不再兼容CommonJS。你未添加
"type": "module"时,Node默认将所有.js文件按CommonJS处理,ts-node编译后生成的代码会用require引入node-fetch,就触发require() of ES Module is not supported报错。 - 添加
"type": "module"之后,Node默认将所有文件按ESM处理,原生ts-node默认配置不支持ESM模式下直接识别.ts后缀,所以会报扩展名未知错误。
解决方案
方案一(最省事,无需修改现有逻辑):降级node-fetch到v2版本
v2版本同时兼容CommonJS和ESM,完全适配你当前的项目配置,无需新增tsconfig也不用调整package.json的type字段:
- 卸载当前版本的node-fetch:
yarn remove node-fetch - 安装v2版本及对应类型声明:
yarn add node-fetch@2 @types/node-fetch@2 -D - 原有的
import fetch from 'node-fetch'写法无需修改,直接正常运行即可。
方案二(保留node-fetch v3):修改ts-node启动参数
如果你一定要使用v3版本的新特性,也不需要新增tsconfig.json,只要修改两处配置即可:
- 在package.json中保留
"type": "module"配置 - 修改package.json的scripts字段中的start命令为
"start": "ts-node --esm ."
修改后的scripts配置示例:
"scripts": { "dev": "nodemon --exec \"yarn start\" --watch src --ext ts,json --ignore *.test.ts", "start": "ts-node --esm ." }
修改完成后直接运行yarn dev或者yarn start就可以正常启动。
内容的提问来源于stack exchange,提问作者tzimom
相关产品推荐
相关产品推荐

