Node.js v17.5.0 發(fā)布,核心增加 Fetch API
Node.js v17.5.0 版本于本周四(2022-02-10)發(fā)布,其顯著變化為:
- 試驗(yàn)性支持 fetch() API
- Stream 新增了 find()、toArray()、forEach()、some()、every() 方法
- 取消標(biāo)記 esm json 模塊
- NPM 更新至 8.4.1
- node-api 添加 node_api_symbol_for() 方法
fetch API 支持
Node.js 核心引入 fetch API 是一個(gè)令人興奮的功能,目前在 v17.5.0 版本為試驗(yàn)性支持,在今后的 LTS 版本中如果正式支持了,就不需要在依賴第三方 HTTP 請求庫了。
Fetch API 提供了 WHATWG 標(biāo)準(zhǔn)接口獲取資源,這是一個(gè)基于 Promise 的 HTTP 客戶端,可以用來簡化 HTTP 請求,在瀏覽器環(huán)境已支持,瀏覽器環(huán)境的兼容性實(shí)現(xiàn)參考 Web/API/fetch,使用方式與瀏覽器中使用 Fetch API 一致。
Fetch API 主要包含以下四個(gè)接口:
- fetch():該方法是最常用的,用于發(fā)送請求。
- Headers:相當(dāng)于 response/request 的頭信息,可以使你查詢到這些頭信息,或者針對不同的結(jié)果做不同的操作。
- Request:相當(dāng)于一個(gè)資源請求。
- Response:相當(dāng)于請求的響應(yīng)。
一個(gè)簡單的使用方式:
const response = await fetch(url);
console.log(response.ok);
console.log(await response.json());
運(yùn)行時(shí)需要加上 --experimental-fetch 標(biāo)記,例如 node --experimental-fetch test.mjs。
Node.js 中的 fetch() 實(shí)現(xiàn)基于 undici,該項(xiàng)目位于 Node.js Github 項(xiàng)目組織下,其中的幾位貢獻(xiàn)者也是 Node.js 項(xiàng)目的貢獻(xiàn)者,致力于為 Node.js 開發(fā)快速、可靠且符合規(guī)范的 HTTP 客戶端,比內(nèi)置的 HTTP 模塊還要快,因?yàn)樗饤壛嗽械?HTTP 模塊,直接構(gòu)建在 socket 之上,可參見筆者之前寫的這篇文章request 已廢棄 - 推薦一個(gè)超快的 Node.js HTTP Client undici。
Stream 模塊
Node.js v17.5.0 Stream 模塊增加了 find()、toArray()、forEach()、some()、every() 方法,這一塊可 參考官網(wǎng) API#stream 介紹。
下面以 some() 方法為例,如果有任何大文件就返回 true。
import { Readable } from 'stream';
import { stat } from 'fs/promises';
const anyBigFile = await Readable.from([
'file1',
'file2',
'file3',
]).some(async (fileName) => {
const stats = await stat(fileName);
return stats.size > 1024 * 1024;
}, { concurrency: 2 });
注意:奇數(shù)版本不是長期支持版本,Node.js 版本信息參考 Node.js 版本知多少?又該如何選擇?。
Reference
https://fusebit.io/blog/node-fetch/
https://mp.weixin.qq.com/s/JXrInHyOk0HAAtA9-CbESw
https://nodejs.org/en/blog/release/v17.5.0/