node-fetch-native
node-fetch 的更好再分发版本
一个 node-fetch v3 (+ 更多!)的重新分发,以实现更好的向后和向前兼容性。
为什么选择这个包?
- 我们无法再使用最新版本
require('node-fetch')
。这导致了流行库无法升级,并且node-fetch@2
和node-fetch@3之间出现依赖冲突
。 - 随着 Node.js 即将发布的版本,原生
fetch
将获得支持。我们已准备好使用此包支持原生 fetch,同时仍支持较旧的 Node 版本。 - 通过 undici 将原生 fetch 引入 Node.js 后,没有简单的方法可以支持 http 代理!
功能特性
✅ 优先使用原生全局变量(如果可用)(参见 Node.js 实验性 fetch)。
✅ 同时支持 CommonJS (require
) 和 ESM (import
) 用法
✅ 如果在没有 node
条件的情况下导入,则使用原生版本,通过条件导出实现,零打包开销
✅ 对 Node.js 的 Polyfill 支持
✅ 精简简单的代理,支持没有原生 fetch 的 Node.js 版本(使用 HTTP Agent)和有原生 fetch 的版本(使用 Undici Proxy Agent)
用法
安装 node-fetch-native
依赖
# npm
npm i node-fetch-native
# yarn
yarn add node-fetch-native
# pnpm
pnpm i node-fetch-native
您现在可以导入或引入该依赖
// ESM
import fetch from "node-fetch-native";
// CommonJS
const fetch = require("node-fetch-native");
更多具名导出
// ESM
import {
fetch,
Blob,
FormData,
Headers,
Request,
Response,
AbortController,
} from "node-fetch-native";
// CommonJS
const {
fetch,
Blob,
FormData,
Headers,
Request,
Response,
AbortController,
} = require("node-fetch-native");
强制使用非原生版本
有时,在 Node.js 或运行时环境下,当原生/polyfill 版本的 globalThis.fetch
出现问题时,您可能希望明确使用非原生(node-fetch
)的 fetch
实现。
您可以通过两种方式实现此目的
- 在启动应用程序之前设置
FORCE_NODE_FETCH
环境变量。 - 从
node-fetch-native/node
导入
Polyfill 支持
通过 polyfill 方法,我们可以确保在环境和所有文件中都可用全局 fetch。原生功能始终优先。
注意:如果您正在编写库,我不建议这样做!请优先使用显式方法。
// ESM
import "node-fetch-native/polyfill";
// CJS
require("node-fetch-native/polyfill");
// You can now use fetch() without any import!
代理支持
Node.js 对 fetch 没有内置的 HTTP 代理支持(参见 nodejs/undici#1650 和 nodejs/node#8381)
此包捆绑了一个紧凑简单的代理支持解决方案,适用于没有原生 fetch 的 Node.js 版本(使用 HTTP Agent)和有原生 fetch 的版本(使用 Undici Proxy Agent)。
默认情况下,将检查并使用(按顺序) https_proxy
、http_proxy
、HTTPS_PROXY
和 HTTP_PROXY
环境变量作为代理;如果它们都没有设置,则禁用代理。您可以使用传递给 createFetch
和 createProxy
工具的 url
选项来覆盖它。
默认情况下,将检查并使用 no_proxy
和 NO_PROXY
环境变量作为要忽略代理的主机列表(逗号分隔)。您可以使用传递给 createFetch
和 createProxy
工具的 noProxy
选项来覆盖它。以点开头的条目将用于检查域以及任何子域。
支持代理的 fetch
您可以简单地从 node-fetch-native/proxy
导入 { fetch }
,它带有一个预配置的、支持代理的 fetch
函数。
import { fetch } from "node-fetch-native/proxy";
console.log(await fetch("https://icanhazip.com").then((r) => r.text());
createFetch
工具
您可以使用 createFetch
工具来实例化一个带有自定义代理选项的 fetch
实例。
import { createFetch } from "node-fetch-native/proxy";
const fetch = createFetch({ url: "https://:9080" });
console.log(await fetch("https://icanhazip.com").then((r) => r.text());
createProxy
工具
createProxy
返回一个包含 agent
和 dispatcher
键的对象,这些键可以作为 fetch 选项传递。
import { fetch } from "node-fetch-native";
import { createProxy } from "node-fetch-native/proxy";
const proxy = createProxy();
// const proxy = createProxy({ url: "https://:8080" });
console.log(await fetch("https://icanhazip.com", { ...proxy }).then((r) => r.text());
别名到 node-fetch
使用此方法,您可以确保所有项目依赖项和 node-fetch
的使用都能受益于改进的 node-fetch-native
,并且不会在 node-fetch@2
和 node-fetch@3
之间产生冲突。
npm
使用 npm overrides
// package.json
{
"overrides": {
"node-fetch": "npm:node-fetch-native@latest"
}
}
yarn
使用 yarn selective dependency resolutions
// package.json
{
"resolutions": {
"node-fetch": "npm:node-fetch-native@latest"
}
}
pnpm
// package.json
{
"pnpm": {
"overrides": {
"node-fetch": "npm:node-fetch-native@latest"
}
}
}
许可
用 💛 制作,根据 MIT 许可证发布。