根据 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 和纯文本。
XMLHttpRequest
API 在当时提供了极大的帮助,但随着网络的发展,它也变得难以操作,以至于 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 本身。