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