Node.js 20 正式發(fā)布!你了解多少?
4 月 18 日,Node.js 正式發(fā)布了 20 版本,新版中的亮點(diǎn)包括全新的 Node.js 權(quán)限模型、同步的 import.meta.resolve、穩(wěn)定的測試運(yùn)行器、更新 V8 JavaScript 引擎到 11.3,Ada 到 2.0 等!
下載:https://nodejs.org/en/download/current/
注意,Node.js 20 將在 10 月份進(jìn)入長期支持(LTS)期,在那之前,它將在接下來的六個月內(nèi)成為“Current”版本。鼓勵探索這個最新版本提供的新功能和好處,并評估它對應(yīng)用的潛在影響。
權(quán)限模型
Node.js 權(quán)限模型是一種實(shí)驗(yàn)性機(jī)制,用于在執(zhí)行期間限制對特定資源的訪問。在這個第一個包含權(quán)限模型的發(fā)布版本中,這些功能帶有以下能力:
- 限制對文件系統(tǒng)的訪問(讀和寫),使用 --allow-fs-read 和 --allow-fs-write 命令;
 - 限制對 child_process 的訪問,使用 --allow-child-process 命令;
 - 限制對 worker_threads 的訪問,使用 --allow-worker 命令
 - 限制對原生插件的訪問(與 --no-addons 標(biāo)志相同)
 
可用權(quán)限由 --experimental-permission 標(biāo)志記錄。
使用 --experimental-permission? 啟動 Node.js 時,將限制訪問文件系統(tǒng)、生成進(jìn)程和使用 node:worker_threads 的能力。
使用 Node.js 的開發(fā)人員現(xiàn)在可以更好地控制文件系統(tǒng)訪問,因?yàn)橐肓?nbsp;--allow-fs-read? 和 --allow-fs-write 標(biāo)志。這些實(shí)驗(yàn)性功能允許更細(xì)粒度地控制 Node.js 進(jìn)程可以訪問文件系統(tǒng)的哪些部分。
要啟用這些標(biāo)志,可以使用 --experimental-permission 標(biāo)志和所需的權(quán)限。例如,運(yùn)行以下命令允許對整個文件系統(tǒng)進(jìn)行讀寫訪問:
還可以通過將逗號分隔的值傳遞到標(biāo)志中來指定文件系統(tǒng)訪問的特定路徑。例如,以下命令允許對 /tmp/ 文件夾進(jìn)行寫訪問:
通配符模式也可以用于一次性允許訪問多個文件或文件夾。例如,以下命令允許讀取 /home/? 目錄中以 test 開頭的所有文件和文件夾:
當(dāng)啟用權(quán)限模型時,process? 對象的新 permission 屬性可以用于在運(yùn)行時檢查是否已授予某個權(quán)限。
需要注意,這些功能仍處于實(shí)驗(yàn)階段,可能會在 Node.js 的未來版本中發(fā)生更改。
自定義 ESM loader hooks 接近穩(wěn)定版
通過 loader 提供自定義 ES module 生命周期 hook(--experimental-loader=./foo.mjs)現(xiàn)在在專用線程中運(yùn)行,與主線程隔離開來。這為 loader 提供了單獨(dú)的作用域,并確保 loader 和應(yīng)用代碼之間沒有交叉污染。
為了與瀏覽器行為一致,import.meta.resolve()? 現(xiàn)在返回同步操作;注意,用戶 loader 中的resolve? hook 仍然可以是異步操作,如果 loader 作者希望的話,在應(yīng)用代碼中import.meta.resolve仍將返回同步操作。
這些改變是標(biāo)記 ESM loader 為穩(wěn)定版前的最后幾個未解決問題。一旦社區(qū)中沒有重大錯誤報告一段時間,Node.js 團(tuán)隊(duì)就打算將 loader 標(biāo)志、import.meta.resolve和resolve和load hook 標(biāo)記為穩(wěn)定版。這使 ESM 的更廣泛采用成為可能,因?yàn)橹匾睦嫦嚓P(guān)者將擁有一個穩(wěn)定的 API 來構(gòu)建分析和報告庫。
V8 11.3
與往常一樣,Node.js 中包含了V8引擎的新版本(更新到版本11.3,是 Chromium 113 的一部分),帶來了改進(jìn)的性能和新的語言特性,包括:
- String.prototype.isWellFormed和toWellFormed;
 - 通過復(fù)制修改 Array 和 TypedArray 的方法;
 - 可調(diào)整大小的ArrayBuffer和可增長的SharedArrayBuffer;
 - 具有設(shè)置符號和字符串屬性的 RegExp v 標(biāo)志;
 - WebAssembly 尾調(diào)用。
 
穩(wěn)定版 Test Runner
Node.js 20 中包含了一個對 test_runner 模塊的重要變更。該模塊在最近的更新后被標(biāo)記為穩(wěn)定版。穩(wěn)定版 Test Runner 包括編寫和運(yùn)行測試所需的基本組件,包括:
- describe、it/test和 hooks 用于結(jié)構(gòu)化測試文件
 - mocking
 - 觀察模式
 - node --test 用于并行運(yùn)行多個測試文件
 
以下是使用 Test Runner 的簡單示例:
性能
隨著新成立的 Node.js 性能團(tuán)隊(duì)的加入,自上一次主要發(fā)布以來,性能再次成為了一個重點(diǎn)。Node.js 20對運(yùn)行時的基礎(chǔ)部分(包括URL、fetch()和EventTarget)進(jìn)行了許多改進(jìn)。
初始化EventTarget?的成本減半,可以更快地訪問使用它的所有子系統(tǒng)。此外,V8 Fast API 調(diào)用已被利用,以改進(jìn)諸如URL.canParse()和定時器等 API 的性能。
Node.js 20包括特定的變化,例如使用 C++ 編寫的快速且符合規(guī)范的 URL 解析器 Ada 的更新版本2.0。
現(xiàn)在需要注入Blob來準(zhǔn)備單個可執(zhí)行文件
該項(xiàng)目在過去一年中一直致力于支持單個可執(zhí)行文件(SEA),并最近實(shí)現(xiàn)了初步支持。由于該功能仍處于實(shí)驗(yàn)性階段,團(tuán)隊(duì)將繼續(xù)完善這一方法。在 Node.js 20 中,構(gòu)建單個可執(zhí)行文件現(xiàn)在需要從 JSON 配置中注入 Node.js 準(zhǔn)備的 Blob,而不是注入原始的JS文件。
例如:sea-config.json
這會將 blob 寫入 sea-prep.blob 文件:
這個 Blob 現(xiàn)在可以注入到二進(jìn)制文件中。這一改變是為了允許將多個共存資源嵌入到單個可執(zhí)行文件(Single Executable Apps)中,從而開辟了新的用例。
Web Crypto API
Node.js 致力于與其他 JavaScript 環(huán)境的互操作性。例如,在 Node.js 20 中,Web Crypto API 函數(shù)的參數(shù)現(xiàn)在按照它們的 WebIDL 定義進(jìn)行強(qiáng)制轉(zhuǎn)換和驗(yàn)證,就像其他 Web Crypto API 實(shí)現(xiàn)一樣。這進(jìn)一步提高了與其他 Web Crypto API 實(shí)現(xiàn)的互操作性。
正式支持 ARM64 Windows
Node.js 具有廣泛的平臺和架構(gòu)支持,Node.js 現(xiàn)在包括適用于 ARM64 Windows 的二進(jìn)制文件,可以在該平臺上進(jìn)行本地執(zhí)行。MSI、zip/7z包和可執(zhí)行文件可以從 Node.js 下載站點(diǎn)以及所有其他平臺上獲得。CI 系統(tǒng)已更新,所有更改現(xiàn)在都在 ARM64 Windows 上進(jìn)行了全面測試,以防止回歸并確保兼容性。
Web Assembly System Interface(WASI)的進(jìn)展
該項(xiàng)目繼續(xù)在 Node.js 中實(shí)現(xiàn)WASI。值得注意的進(jìn)展是,雖然它是實(shí)驗(yàn)性的,但不再需要命令行選項(xiàng)來啟用 WASI,這應(yīng)該使其更容易使用。WASI 團(tuán)隊(duì)期待著 preview2,并為未來做了一些更改。其中包括在調(diào)用new WASI()時添加版本選項(xiàng)。在20.x版本中,版本是必需的,并且沒有默認(rèn)值。這對于支持新版本的應(yīng)用非常重要,因?yàn)樗鼈儾粫J(rèn)使用可能已過時的版本。然而,這也意味著任何依賴于版本默認(rèn)值的代碼都需要更新以請求特定版本。
注意事項(xiàng)
需要注意,Node.js 14 將在2023年4月停止維護(hù),因此建議您開始計劃升級到 Node.js 18(LTS)或Node.js 20(即將成為LTS)。
Node.js 16(LTS)將在2023年9月停止維護(hù),這是為了與OpenSSL 1.1.1的支持結(jié)束時間一致,該時間將于2024年4月結(jié)束。
完整更新:https://nodejs.org/en/blog/release/v20.0.0
更新概述:https://nodejs.org/en/blog/announcements/v20-release-announce















 
 
 







 
 
 
 