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