Node.js 19.7.0中fetch为何需--experimental-network-imports才能正常运行?
问题场景
我有一个简单的.js文件,代码如下:
fetch('https://dummyjson.com/products') .then(res => res.json()) .then(console.log);
使用node ./filename.js执行该代码时,出现如下错误:
node:internal/errors:490 ErrorCaptureStackTrace(err); ^ Error [ERR_UNSUPPORTED_ESM_URL_SCHEME]: Only URLs with a scheme in: file and data are supported by the default ESM loader. Received protocol 'https:' at new NodeError (node:internal/errors:399:5) at throwIfUnsupportedURLScheme (node:internal/modules/esm/resolve:964:11) at defaultResolve (node:internal/modules/esm/resolve:1040:3) at nextResolve (node:internal/modules/esm/loader:163:28) at ESMLoader.resolve (node:internal/modules/esm/loader:835:30) at ESMLoader.getModuleJob (node:internal/modules/esm/loader:416:18) at ModuleWrap.<anonymous> (node:internal/modules/esm/module_job:76:40) at link (node:internal/modules/esm/module_job:75:36) { code: 'ERR_UNSUPPORTED_ESM_URL_SCHEME' } Node.js v19.7.0
但使用node --experimental-network-imports ./filename.js执行时就能正常运行并得到预期响应。我原以为fetch在Node.js中是默认原生支持的,19.7.0版本应该不再是实验性特性了,是不是我的理解有误?
问题分析与解答
你的理解没错:fetch API在Node.js 19.7.0是稳定特性
Node.js从v18开始就将fetch API设为稳定特性,v19.7.0自然默认支持,不需要额外的实验性参数来启用fetch本身。报错根源和fetch无关,是ESM加载器的限制
你遇到的ERR_UNSUPPORTED_ESM_URL_SCHEME错误,是Node.js默认的ESM模块加载器的限制:它只允许加载file:和data:协议的模块,不支持直接加载https:协议的远程模块。为什么fetch代码会触发这个错误?
大概率是你的文件被识别为ESM模块(比如package.json中设置了"type": "module",或者文件后缀是.mjs),且代码或依赖库中存在隐藏的网络URL模块导入语句(比如import 'https://xxx'这类写法)。当Node.js解析模块时遇到这类语句,就会抛出上述错误。而--experimental-network-imports参数的作用就是允许ESM加载器处理https:协议的模块导入,因此加上该参数后,模块解析错误被绕过,fetch就能正常执行。建议解决方向
- 检查代码及项目依赖,确认是否存在网络URL形式的模块导入,这才是报错的核心原因。
- 如果确认没有这类导入语句,可能是Node.js v19.7.0的临时bug,可以尝试升级到v19的最新版本,或者切换到更稳定的v18 LTS版本,问题通常能得到解决。
内容的提问来源于stack exchange,提问作者MarcL

