Node.js 21 正式發(fā)布,趕緊來看看有哪些更新吧!
版本說明
這兩個(gè)版本有什么區(qū)別呢?Node.js 21 適合在特定環(huán)境下進(jìn)行早期功能測(cè)試,而 Node.js 20 LTS 則適用于生產(chǎn)部署。Node.js 21 將在未來 6 個(gè)月內(nèi)成為“當(dāng)前”版本,直到 2024 年 4 月。以下是完整的 Node.js 發(fā)布計(jì)劃。
Node.js 的發(fā)布可以分為三個(gè)階段,奇數(shù)版本號(hào)的發(fā)布線路不會(huì)被提升為 LTS 版本,也就不會(huì)經(jīng)歷“Active LTS”和“Maintenance”階段。
- Current(當(dāng)前):包含大部分進(jìn)入 nodejs/node 主分支的非主要(非破壞性)變更。
- Active LTS(活躍長(zhǎng)期支持):新功能、錯(cuò)誤修復(fù)和經(jīng)LTS團(tuán)隊(duì)審核后被確定適合該發(fā)布線路且穩(wěn)定的更新。
- Maintenance(維護(hù)):關(guān)鍵錯(cuò)誤修復(fù)和安全更新。新功能可能會(huì)根據(jù)LTS團(tuán)隊(duì)的判斷加入。通常只在新功能支持遷移到后續(xù)發(fā)布線路的情況下才會(huì)添加。
如果你想要嘗試最新的Node.js功能,那么 Node.js 21 是個(gè)很好的測(cè)試平臺(tái),它提供了即將到來的新特性的先期體驗(yàn)。Node.js 的發(fā)布計(jì)劃特別關(guān)注這一點(diǎn)。但是如果正在準(zhǔn)備或已經(jīng)在生產(chǎn)環(huán)境中使用 Node.js,則應(yīng)該選擇較穩(wěn)定的版本,如Node.js 20 和 18 LTS。這些版本可以保證可靠性和穩(wěn)定性,并且會(huì)在較長(zhǎng)時(shí)間內(nèi)得到支持和維護(hù)。
Node.js 21 的亮點(diǎn)包括將 V8 JavaScript 引擎升級(jí)到 11.8 版本,穩(wěn)定的WebStreams和 fetch功能,一個(gè)用于更改模塊默認(rèn)值的新實(shí)驗(yàn)性標(biāo)志(--experimental-default-type),對(duì)測(cè)試運(yùn)行器的許多更新,內(nèi)置 WebSocket 客戶端等!
主要更新
穩(wěn)定的WebStreams和 fetch功能
Node.js 21 對(duì)fetch模塊和WebStreams進(jìn)行了重要更新,并將它們標(biāo)記為穩(wěn)定版本。
這一變化影響到了WebStreams、FormData、Headers、Request、Response和fetch等模塊。
內(nèi)置 WebSocket 客戶端
這個(gè)版本新增了一個(gè)實(shí)驗(yàn)性的瀏覽器兼容的 WebSocket 實(shí)現(xiàn),可以通過使用參數(shù)--experimental-websocket來開啟。但是,像所有實(shí)驗(yàn)性功能一樣,它可能會(huì)隨時(shí)發(fā)生變化。
V8 11.8
按照慣例,Node.js 21 中包含了新版本的 V8 引擎(更新到版本11.8,該版本是 Chromium 118 的一部分),帶來了性能的改進(jìn)和新的語(yǔ)言功能,包括:
- 數(shù)組分組
- ArrayBuffer.prototype.transfer
- 擴(kuò)展的 WebAssembly 常量表達(dá)式
Node.js 測(cè)試運(yùn)行器支持通配符
在 Node.js 21 中,測(cè)試運(yùn)行器引入了對(duì)通配符表達(dá)式的支持。通配符是一種模式語(yǔ)法,可以用來匹配多個(gè)文件路徑。在測(cè)試過程中,可以使用通配符表達(dá)式來指定要運(yùn)行的測(cè)試文件。
通過使用通配符表達(dá)式,可以更方便地選擇和執(zhí)行特定類型的測(cè)試文件,而不需要一個(gè)個(gè)地指定它們的路徑。例如,如果想運(yùn)行所有具有.test.js文件擴(kuò)展名的文件,無論這些文件位于哪個(gè)目錄下,可以使用類似于node --test **/*.test.js的命令。這樣,測(cè)試運(yùn)行器會(huì)自動(dòng)匹配并執(zhí)行符合該模式的測(cè)試文件。
ESM:支持改變模塊默認(rèn)值
experimental-default-type 是 Node.js 的一個(gè)實(shí)驗(yàn)性特性,可以用來切換默認(rèn)的模塊系統(tǒng)。這意味著開發(fā)者可以使用不同的模塊類型,并在需要時(shí)進(jìn)行切換,使得 Node.js 應(yīng)用更加靈活,能夠應(yīng)對(duì)不同的場(chǎng)景。
標(biāo)志 --experimental-default-type=module 用于將模塊類型切換成 ES 模塊。對(duì)于已經(jīng)明確定義為 ES 模塊或 CommonJS 的代碼,例如在 package.json "type" 字段中或文件擴(kuò)展名為 .mjs/.cjs 或 --input-type 標(biāo)志等,不會(huì)受到影響。在使用 --experimental-default-type=module 標(biāo)志時(shí),原本默認(rèn)解析為 CommonJS 的代碼將被解析成 ES 模塊。
此外,Node.js 團(tuán)隊(duì)還在探索使用檢測(cè) ES 模塊語(yǔ)法作為Node.js識(shí)別文件是否為ES模塊的一種方式,目標(biāo)是最終找到一種支持ES模塊語(yǔ)法的方法,并盡可能減少變更。
模塊自定義鉤子 globalPreload 已被移除,改用 register 和 initialize
模塊自定義鉤子 globalPreload 已被移除。取而代之的是,使用 register 方法將數(shù)據(jù)從應(yīng)用線程發(fā)送到自定義鉤子,并使用 initialize 鉤子在線程之間建立通信通道。
fs.writeFile 函數(shù)添加 flush 選項(xiàng)
在寫入文件時(shí),有可能數(shù)據(jù)并不會(huì)立即刷新到永久存儲(chǔ)中。這可能導(dǎo)致后續(xù)讀取操作看到舊的數(shù)據(jù)。該版本為 fs.writeFile 系列函數(shù)添加了一個(gè) flush 選項(xiàng),該選項(xiàng)可以在成功寫入操作結(jié)束時(shí)強(qiáng)制刷新數(shù)據(jù)到永久存儲(chǔ)。
性能
性能是一個(gè)運(yùn)行時(shí)的重要屬性,@nodejs/performance 團(tuán)隊(duì)在過去一年中一直努力改進(jìn) URL、fetch、streams、node:fs 和 HTTP 等方面的性能。
Streams
Node.js 流團(tuán)隊(duì)不斷優(yōu)化可寫流和可讀流。在這個(gè)版本中,通過移除冗余檢查、利用位圖以及以更高效的方式安排回調(diào)來進(jìn)一步優(yōu)化流操作。
HTTP
在此之前,當(dāng)向分塊響應(yīng)寫入數(shù)據(jù)時(shí),無論響應(yīng)是否處于 corked 狀態(tài),Node.js 都會(huì)為每個(gè) .write(...)調(diào)用創(chuàng)建一個(gè)單獨(dú)的數(shù)據(jù)塊。這會(huì)在客戶端和服務(wù)端都產(chǎn)生不必要的開銷。
該更新通過在取消 corked 狀態(tài)時(shí),為所有 write(...) 調(diào)用創(chuàng)建一個(gè)單一的數(shù)據(jù)塊來解決了這一問題。
考慮以下基于 Transfer-Encoding 文檔的示例:
res.cork();
res.write('Mozilla');
res.write(' Developer Network');
res.uncork();
在每個(gè)數(shù)據(jù)塊的開頭,您需要以十六進(jìn)制格式添加當(dāng)前數(shù)據(jù)塊的長(zhǎng)度,然后跟著 '\r\n',再接著是數(shù)據(jù)塊本身,最后再加上另一個(gè) '\r\n'。終止塊是正常的數(shù)據(jù)塊,唯一的例外是它的長(zhǎng)度為零。
最終生成的響應(yīng)流為:
HTTP/1.1 200 OK
Content-Type: text/plain
Transfer-Encoding: chunked
7\r\n
Mozilla\r\n
18\r\n
Developer Network\r\n
0\r\n
\r\n
在 Node.js 21 中,當(dāng)取消 corked 狀態(tài)時(shí),所有數(shù)據(jù)塊都會(huì)合并成一個(gè)單獨(dú)的數(shù)據(jù)塊,從而減少了很多不必要的開銷。
HTTP/1.1 200 OK
Content-Type: text/plain
Transfer-Encoding: chunked
25\r\n
Mozilla Developer Network\r\n
0\r\n
\r\n
llhttp 9.1.2 強(qiáng)制嚴(yán)格模式執(zhí)行
- 在以前的 Node.js 版本中,默認(rèn)情況下未啟用嚴(yán)格模式。在 Node.js 21 中,強(qiáng)制執(zhí)行了以前包含在嚴(yán)格模式中的所有設(shè)置,提高了代碼的可靠性和安全性。
- 現(xiàn)在,標(biāo)頭后面必須有 \r\n(之前允許單獨(dú)使用 \r)。此外,數(shù)據(jù)塊后必須有 \r\n,以確保一致的數(shù)據(jù)處理。
- 在解析帶有 Connection: close 標(biāo)頭的消息后不再允許傳輸數(shù)據(jù)。這一變化增強(qiáng)了協(xié)議遵從性并改善了連接處理。
為適應(yīng)特定的用例,引入了--insecure-http-parser 標(biāo)志。該選項(xiàng)允許用戶禁用上述更改,并保持與以前的解析行為的向后兼容性。
這些更新旨在增強(qiáng)整個(gè)系統(tǒng)的穩(wěn)定性,并改善 Node.js 應(yīng)用的數(shù)據(jù)處理一致性。鼓勵(lì)開發(fā)人員審查其代碼庫(kù)并相應(yīng)地調(diào)整其實(shí)現(xiàn),以確保與最新版本的無縫集成。
navigator 對(duì)象集成
在 Node.js 21 中,引入了全局 navigator 對(duì)象,增強(qiáng)了 Web 的互操作性?,F(xiàn)在,可以通過 navigator.hardwareConcurrency 訪問硬件并發(fā)信息。