转译使用require引入node-fetch的代码出现报错的正确解决方法是什么?
node-fetch v3+ ESM兼容问题解决方案
node-fetch 从v3版本开始全面转为纯ESM包,package.json中自带"type": "module"配置,不支持直接在CommonJS项目中用require语法导入,以下是可选用的长期解决方案:
对应错误提示:
...firebase_datasource.js is an ES module file as it is a .js file whose nearest parent package.json contains "type": "module" which defines all .js files in that package scope as ES modules.
方案1:保持自身项目为CommonJS规范(继续使用require)
- 使用
import()动态导入语法加载node-fetch,该语法原生支持在CommonJS文件中异步加载ESM模块,示例用法如下:
async function yourBusinessLogic() { // 解构获取default导出的fetch方法以及相关工具类 const { default: fetch, Headers, Request, Response } = await import('node-fetch'); // 后续正常使用fetch相关能力 const response = await fetch('你的目标请求地址'); const result = await response.json(); }
- 注意动态导入为异步逻辑,需要放在async函数内或者用
.then()链式调用处理。
方案2:升级自身项目为ESM规范
- 在你自己项目根目录的package.json中添加配置:
"type": "module",此时项目内所有.js后缀文件会默认被识别为ESM模块,可直接用import fetch from 'node-fetch'语法导入依赖,不需要再转译为require语法。 - 若项目中仍有需要保留的CommonJS格式文件,只需将对应文件后缀改为
.cjs,Node.js会自动按CommonJS规范解析。
可选方案:使用社区兼容的CommonJS发行版
如果不想调整现有代码的异步逻辑,可以安装社区预转译的CommonJS版本node-fetch-cjs,该版本和官方原版API完全一致,安装后可直接用require导入:
- 安装命令:
npm install node-fetch-cjs - 导入示例:
const fetch = require('node-fetch-cjs')
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

