Node.js 已合并 Fetch API


根据 Node.js 的发布记录,上个月其核心开发团队合并了为 Node.js 添加 Fetch API 的 PR。

Fetch API 提供了 WHATWG 标准接口获取资源,这是一个基于 Promise 的 HTTP 客户端,可以用来简化 HTTP 请求,在浏览器环境已支持,浏览器环境的兼容性实现参考 Web/API/fetch,使用方式与浏览器中使用 Fetch API 一致。

Fetch API 主要包含以下四个接口:

  • fetch():该方法是最常用的,用于发送请求。
  • Headers:相当于 response/request 的头信息,可以使你查询到这些头信息,或者针对不同的结果做不同的操作。
  • Request:相当于一个资源请求。
  • Response:相当于请求的响应。

对于 Node.js 来说,这是一项十分重要的特性。下面介绍一下 Fetch API 是如何产生的,以及这项新增的功能对 Node.js 开发者意味着什么?

在 Web 诞生的早期阶段,跨站点执行异步请求十分不方便,开发者需要使用笨拙的方法在多个网络之间进行交互。

1998 年,随着 Internet Explorer 5 引入XMLHttpRequest,这一状况得以改变。它是一个旨在克服这种限制的 API。最初,XMLHttpRequest被设计用来通过 HTTP 获取 XML 数据,因此被命名为XMLHttpRequest。此后逐渐添加了对其他数据格式的支持,主要是 JSON、HTML 和纯文本。

XMLHttpRequestAPI 在当时提供了极大的帮助,但随着网络的发展,它也变得难以操作,以至于 JavaScript 框架,特别是 jQuery,不得不对其进行抽象,以使实现更容易,以及成功/错误处理更顺畅。

2015 年,Fetch API 作为XMLHttpRequest的现代继任者被推出,随后它成为 Web 应用中进行异步调用的事实标准。与XMLHttpRequest相比,Fetch 的一个显著优势是它使用了 Promise 特性,提供了一个更简单、更干净的 API,同时避免了回调地狱。

尽管 Fetch API 已经诞生了一段时间,但由于一些限制,它还没有被纳入 Node.js 核心。在 Hacker News 上一个由 Node.js 核心贡献者回答的问题中,有人指出,浏览器的 Fetch API 实现依赖于基于浏览器的 Web Streams API 和AbortController接口(用于中止获取请求),直到最近 Node.js 才有这个接口。因此,很难决定将其纳入 Node.js 核心的最佳方法。

在添加 Fetch API 之前,请求模块 (request module) 是 Node.js 中最流行的 HTTP 请求方法。但整个 JavaScript 生态迅速发展,新引入的模式使 request 过时了。这里的一个关键例子是 async/await,request API 中没有这方面的规定,由于这些限制,该项目后来被废弃。

总的来说,Fetch API 进入 Node.js 核心对开发者来说是一件好事。不过 Fetch API 在 Node.js 中完全稳定可能需要一段时间(大约一两年),因为要使其符合标准还有很多工作要做。此外,许多有趣的更新也将在不久的将来发生,其中之一包括向 Undici 添加 HTTP/2 支持,并最终支持 Fetch API 本身。


相關推薦

2023-10-19

得关注的变化包括: 将 V8 JavaScript 引擎升级至 11.8 fetch和WebStreams到达稳定状态 添加用于 flip module 默认值的新实验性 flag (--experimental-default-type) 内置 WebSocket 客户端 针对 test runner 的许多更新 …… 公告写道,当 N

2023-07-07

e() API 使用 Web 标准的 Request 和 Response 对象,可无缝配合 fetch()、Web 流等其他标准 API。 此外,Deno.serve() 提供可观的性能改进。Deno 团队的基准测试显示,使用 Deno.serve() 构建的 Hello World 服务器的吞吐量是 Node.js 服务器的两倍,

2023-08-25

(native bundler)、转译器、task runner、npm 客户端,以及 fetch、WebSocket等 Web API。 Bun 刚刚发布了 v0.8.0,新版本主要变化: 添加调试器支持 Bun 通过 WebKit 的 Inspector Protocol 实现了调试器支持。要使用它,需开启--inspectflag

2023-01-07

中弃用无效端口 #45576 弃用 url.parse() #44919 lib drop fetch 实验警告 #45287 net (SEMVER-MINOR) 添加 autoSelectFamily 和 autoSelectFamilyAttemptTimeout 选项 (Paolo Insogna) #44731 src (SEMVER-MINOR) 添加 uvwasi 版本 (Jithil P Ponnan) #45639 (SEMVE

2023-07-20

OR) 添加 shorthands 到test #47909 (SEMVER-MINOR) 支持合并覆盖率报告 #47686 (SEMVER-MINOR) 在测试 hook 之前执行 #47586 (SEMVER-MINOR) expose reporter 以在运行 api 中使用 #47238 tools: 更新 LICENSE 和 licen

2022-11-16

将 anonrig 添加到 collaborators # 45002 lib 删去 fetch 实验性警告 #45287 util (SEMVER-MINOR) 添加 MIME 实用程序 #21128 提高文本解码器解码性能 #45294 详情可查看更新说明:https://nodejs.org/en/blog/release/v19.1

2023-02-27

包器 (native bundler)、转译器、task runner、npm 客户端,以及fetch、WebSocket等 Web API。 Bun 最近发布了 0.5.7 版本,主要变化: 支持FormData 引入git依赖 为AbortSignal添加fetch() 改进setTimeout()与 Node.js 的兼容性 bun wiptest变更为bun te

2023-07-08

 运行环境。Node.js 由 Node.js Foundation(已与 JS Foundation 合并为 OpenJS Foundation)持有和维护,亦为 Linux 基金会的项目。Node.js 采用 Google 开发的 V8 运行代码,使用事件驱动、非阻塞和异步输入输出模型等技术来提高性能,可

2023-06-13

 运行环境。Node.js 由 Node.js Foundation(已与 JS Foundation 合并为 OpenJS Foundation)持有和维护,亦为 Linux 基金会的项目。Node.js 采用 Google 开发的 V8 运行代码,使用事件驱动、非阻塞和异步输入输出模型等技术来提高性能,可

2023-05-27

用 TLS 的 API 都支持使用 IP 地址。例如: const resp = await fetch("https://1.1.1.1"); console.log(await resp.text()); deno.json和 CLI flag 中的 Glob 支持 其他改进和错误修复: 改进配置文件 此前如果 Deno 需要忽略每个子命令的文件或文

2022-10-20

化、其他一些利用 SIMD 的性能提升都在 PR 合并和准别中。 详细了解 上面是对 Noslate Project 的简单介绍,如果想要详细了解可通过下述方式: GitHub:  https://github.com/noslate-project/noslate  

2022-01-18

除许多非社区维护的重写和分支带来的混淆。他们也已经合并了所有活跃的分支,待事情平息后,关于此库带来的混乱会减少,他们也会放弃使用“官方”的口径。 从项目仓库的 star 数增长情况来看,由社区控制的 Faker.js 项

2022-06-12

加到 URL BUILDING 部分 #3989 文档:通过以下方式修复合并错误 #3991 文档:通过以下方式澄清全局前缀 #3985 chore(.gitignore):使用更新的骨架模板 #3993 在候选发布阶段支持先前版本的插件 #3992 添加 Markdown lin

2023-06-22

 运行环境。Node.js 由 Node.js Foundation(已与 JS Foundation 合并为 OpenJS Foundation)持有和维护,亦为 Linux 基金会的项目。Node.js 采用 Google 开发的 V8 运行代码,使用事件驱动、非阻塞和异步输入输出模型等技术来提高性能,可