Node.js v20 中的新功能(測試運行器、權限模型、SEA、V8 JS 引擎 11.3)

已發表: 2023-04-28

Node.js v20 現已可用! 2023年4月18日公開,現在大家可以使用了。 在此版本中,Node.js 應該更安全並且性能更好。

重要的是要知道——由於這是一個偶數版本,它計劃在 2023 年 10 月成為長期支持 (LTS) 版本,並將支持到 2026 年 4 月。但是,Node.js 團隊正在積極尋求社區反饋以在將其提升為 LTS 之前識別並修復任何問題。

Node.js 的這個新版本帶來了開發人員肯定會喜歡的令人興奮的更新和功能,例如實驗性權限模型、同步import.meta.resolve 、穩定的測試運行器、將 V8 JavaScript 引擎更新到版本 11.3,帶來性能改進和錯誤修復,以及更多。

在本文中,您將探索 Node.js v20 中引入的變化,深入了解其新特性和功能。

開始使用 Node.js v20

安裝 Node.js v20 與其他版本的 Node.js 非常相似。 您需要做的就是:

  1. 從官方 Node.js 網站下載安裝程序包。
  2. 下載安裝程序後,運行它並按照說明完成安裝過程。 這個過程非常簡單,您只需同意許可協議並單擊“下一步”按鈕即可。
  3. 安裝過程完成後重新啟動您的系統/機器以確保所有更改生效。
  4. 通過運行以下命令驗證您的 Node.js 安裝:
 node -v
驗證 Node.js v20 安裝
Node.js v20 安裝

如果您看到版本號 (v20.0.0),則表示 Node.js 已正確安裝,您可以開始使用 Node.js v20。

Node.js v20 已經到來! 在此處查看權限模型、同步 import.meta.resolve、穩定的測試運行程序以及更多令人興奮的功能和更新️ 點擊推文

Node.js v20 有什麼新功能?

讓我們探索此 Node.js 版本引入的 5 個主要更新。 這些功能包括:

實驗權限模型

Node.js v20 中實驗性權限模型的引入是一個重要的補充,它使開發人員能夠在執行期間更好地控制對特定資源的訪問。

當安全和資源使用至關重要時(例如在生產環境中),此新功能非常有用。

權限模型具有多種功能,包括限制對文件系統、child_process、worker_threads 和本機插件的訪問。

開發人員可以使用--allow-fs-read--allow-fs-write--allow-child-process標誌來指定可訪問的資源。 要激活這些標誌,開發人員需要結合使用--experimental-permission標誌和所需的權限。

以下是如何使用權限模型允許對整個文件系統進行讀寫訪問的示例:

 $ node --experimental-permission --allow-fs-read=* --allow-fs-write=* index.js

開發人員還可以使用權限模型來指定對特定文件夾和文件的訪問權限。 例如,以下命令允許對/tmp/文件夾進行寫訪問:

 $ node --experimental-permission --allow-fs-write=/tmp/ --allow-fs-read=/home/index.js index.js

權限模型的一項顯著優勢是能夠對文件系統的訪問進行更精細的控制。 例如,開發人員可以指定路徑和通配符模式以允許訪問特定文件夾或文件。

 $ node --experimental-permission --allow-fs-read=/home/user/* index.js

上面的命令授予對/home/user/目錄中所有文件夾的讀取權限。

進程對象的 permission 屬性也可用於檢查是否在運行時授予了特定權限。 例如,如果您想檢查您的 Node.js 進程是否具有對特定文件夾/home/user/documents 的讀取權限,您可以使用以下代碼:

 if (process.permission.has('fs.read', '/home/user/documents')) { console.log('Read access granted to /home/user/documents'); } else { console.log('Read access not granted to /home/user/documents'); }

通過使用權限模型,您可以更細粒度地控制 Node.js 進程的文件系統訪問,這可以帶來更好的安全性和更有效的資源利用。

請務必注意,權限模型仍處於實驗階段,可能會在 Node.js 的未來版本中發生變化。 建議及時了解權限模型文檔,並在使用這些實驗性功能時謹慎行事。

穩定的測試運行器

Node.js v20 包含一個穩定版本的 test_runner 模塊,使開發人員能夠快速輕鬆地構建和運行 JavaScript 測試套件,而無需安裝額外的依賴項。

穩定的測試運行器現在包括幾個構建塊,例如describeit / test和 hooks ,用於編寫和構建測試文件,以及模擬、觀察模式和使用node --test命令。

以下是如何使用測試運行器的示例:

 import { test, mock } from 'node:test'; import assert from 'node:assert'; import fs from 'node:fs'; mock.method(fs, 'readFile', async () => "Hello World"); test('synchronous passing test', async (t) => { // This test passes because it does not throw an exception. assert.strictEqual(await fs.readFile('a.txt'), "Hello World"); });

測試運行器通過--test-reporter標誌提供可配置和自定義的測試報告程序,通過--experimental-test-coverage標誌和模擬功能提供實驗測試覆蓋率。

雖然不打算取代 Jest 或 Mocha 等功能齊全的測試框架,但穩定的測試運行器提供了一種簡單快速的方法來創建測試套件。 自從在 Node.js v19 中引入以來,它得到了顯著增強,並且由於最終用戶的測試和反饋,它現在在 Node.js v20 中被標記為穩定。

可以在這個合併的拉取請求中找到更多信息。

V8 JavaScript 引擎更新到 11.3

為 Node.js 提供支持的 V8 JavaScript 引擎已在 Node.js v20 中更新至版本 11.3。 這帶來了改進的性能並引入了新的語言功能。 此更新的一些新功能包括:

  • String.prototype.isWellFormedtoWellFormed :這些方法對於確保正確的字符串格式特別有用。 這有助於確保用戶字符串輸入採用正確的 UTF-16 格式,減少表情符號時代的錯誤。
  • 通過副本更改 Array 和 TypedArray 的方法:這對於在不影響原始數據的情況下創建數組的修改副本很有用,這在需要保留原始數據以進行比較或其他目的的情況下尤為重要。
  • 可調整大小的ArrayBuffer和可增長的SharedArrayBuffer :提供更大的靈活性,允許更有效的內存分配。
  • RegExp v flag with set notation and properties of strings:添加正則表達式的功能。
  • WebAssembly 尾調用:提供了一種優化某些類型函數調用的方法。

這些更新展示了 Node.js 開發社區對提高性能和功能的持續承諾。

同步 import.meta.resolve()

在 Node.js v20 中,引入了import.meta.resolve() ,這使得編寫對位置不敏感的腳本變得更加容易。 此函數同步返回,類似於瀏覽器行為,允許更高效的執行。

用戶加載器解析鉤子仍然可以定義為異步函數,但是即使加載了異步解析鉤子, import.meta.resolve()仍然會為應用程序代碼同步返回。

import.meta.resolve()的同步行為允許更高效的代碼執行,尤其是在處理大量數據時。 作為作者,您可以根據自己的喜好將解析掛鉤定義為異步或同步函數。 無論是否加載了異步解析掛鉤,應用程序代碼仍將同步執行。

實驗性單一可執行應用程序 (SEA)

實驗性單一可執行應用程序 (SEA) 是 Node.js v20 中引入的一項新功能,允許將您的應用程序與 Node.js 二進製文件捆綁在一起,使最終用戶能夠將其作為單個可執行文件分發和運行。

這是社區長期以來的要求,該團隊在過去一年中一直在完善該方法。

在 Node.js v20 中,構建單個可執行應用程序需要從 JSON 配置中註入由 Node.js 準備的 blob,而不是注入原始 JS 文件。

blob 是一個包含二進制數據的文件,在本例中,它由 Node.js 準備,並被注入到二進製文件中。 進行此更改是為了能夠將多個共存資源嵌入到 SEA 中,從而開闢了新的用例。

這是sea-config.json文件的示例:

 { "main": "myscript.js", "output": "sea-prep.blob" }

當使用命令node --experimental-sea-config sea-config.json執行時,blob 被寫入sea-prep.blob文件,然後可以將其註入二進製文件。

SEA 功能允許開發人員分發 Node.js 應用程序,而無需用戶安裝 Node.js。 該功能由 Darshan Sen 創建,他在 OpenJS World 的 JavaScriptLandia 獎中獲得了新來者傑出貢獻獎。

作為 OpenJS 基金會成員的 Microsoft 正在研究此功能,以此作為減少向量攻擊和增強 Node.js 架構以獲得更好體驗的方法。 雖然 SEA 功能仍處於實驗階段,但它代表了 Node.js 社區令人興奮的新發展。

表現

Node.js v20 對其運行時進行了重大改進,新成立的 Node.js 性能團隊重新關注性能。 這些改進包括對運行時核心部分的優化,例如 URL、 fetch()EventTarget

其中一項顯著的改進是初始化EventTarget的成本降低了一半,從而可以更快地訪問使用它的所有子系統。 此外,V8 快速 API 調用已被用於增強URL.canParse()和計時器等 API 的性能。

另一個具體的變化是包含了 Ada 的更新版本 2.0,這是一個用 C++ 編寫的快速且符合規範的 URL 解析器。

你知道 Node.js v20 帶來了一個穩定的原生測試運行器嗎? 是時候更有效地測試您的代碼了! 檢查一下️ 點擊推特

概括

在本文中,您了解了 Node.js v20 帶來的一些主要特性(實驗性和穩定性)和改進,例如對 V8 JavaScript 引擎、性能、測試運行器和實驗性權限模型的引入以及單執行應用程序的改進.

重要的是要知道 Node.js v14 將於 2023 年 4 月結束生命週期,因此建議開始計劃升級到 Node.js v18 (LTS) 或 vNode.js 20(即將成為 LTS)。

您想試試最新版本的 Node.js 嗎? 您可以通過在 Kinsta 上部署您的 Node.js 應用程序來做到這一點,並從我們這裡獲得您的第一筆 20 美元。 我們已經支持 Node.js v20,這意味著您可以從今天開始測試它的新特性和功能。

現在輪到你了! 您覺得 Node.js v20 中哪些功能或改進最有趣? 有沒有我們可能忽略的重要內容? 讓我們在評論中知道。