Logo of node-fetch-native

node-fetch-native

node-fetch 的更好再分发版本

一个 node-fetch v3 (+ 更多!)的重新分发,以实现更好的向后和向前兼容性。

为什么选择这个包?

  • 我们无法再使用最新版本 require('node-fetch')。这导致了流行库无法升级,并且 node-fetch@2node-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#1650nodejs/node#8381

此包捆绑了一个紧凑简单的代理支持解决方案,适用于没有原生 fetch 的 Node.js 版本(使用 HTTP Agent)和有原生 fetch 的版本(使用 Undici Proxy Agent)。

默认情况下,将检查并使用(按顺序) https_proxyhttp_proxyHTTPS_PROXYHTTP_PROXY 环境变量作为代理;如果它们都没有设置,则禁用代理。您可以使用传递给 createFetchcreateProxy 工具的 url 选项来覆盖它。

默认情况下,将检查并使用 no_proxyNO_PROXY 环境变量作为要忽略代理的主机列表(逗号分隔)。您可以使用传递给 createFetchcreateProxy 工具的 noProxy 选项来覆盖它。以点开头的条目将用于检查域以及任何子域。

通过导出条件,此实用程序为 Node.js 添加了代理支持,而对于其他运行时,它将简单地返回原生 fetch。
代理支持正在开发中。请查看 unjs/node-fetch-native#107 获取路线图和贡献!

支持代理的 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 返回一个包含 agentdispatcher 键的对象,这些键可以作为 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@2node-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

使用 pnpm.overrides

// package.json
{
  "pnpm": {
    "overrides": {
      "node-fetch": "npm:node-fetch-native@latest"
    }
  }
}

许可

用 💛 制作,根据 MIT 许可证发布。