Node.js v20新特徵(測試執行器、許可權模型、SEA和V8 JS引擎升級至11.3)

Node.js v20新特徵(測試執行器、許可權模型、SEA和V8 JS引擎升級至11.3)

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中引入的變化,深入瞭解其新特性和功能。

  1. 開始使用Node.js v20
  2. Node.js v20有哪些新特性?

開始使用Node.js v20

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

  1. 從Node.js官方網站下載安裝程式包。
  2. 一旦你下載了安裝程式,執行它並按照說明完成安裝過程。這個過程非常簡單,你只需要同意許可協議並點選 “Next” 按鈕。
  3. 安裝過程完成後,重新啟動你的系統/機器,以確保所有的變化生效。
  4. 通過執行以下命令驗證你的Node.js安裝:
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
node -v
node -v
node -v

Node.js v20的安裝

Node.js v20的安裝

如果你看到版本號(v20.0.0),這意味著Node.js已經正確安裝,你可以開始使用Node.js v20。

Node.js v20有什麼新特性?

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

  1. 實驗性許可模型
  2. 穩定的測試執行器
  3. V8 JavaScript引擎更新至11.3
  4. 同步的import.meta.resolve()
  5. 實驗性的單一可執行應用程式(SEA)

實驗性許可模型

在Node.js v20中引入的實驗性許可模型是一個重要的補充,它讓開發者在執行過程中對特定資源的訪問有更多的控制。

當安全和資源使用至關重要時,例如在生產環境中,這項新功能是有益的。

許可權模型具有多種能力,包括限制對檔案系統、child_process、worker_threads和本地附加元件的訪問。

開發人員可以使用諸如 --allow-fs-read, --allow-fs-write, 和 --allow-child-process 等標誌來指定哪些資源可以訪問。為了啟用這些標誌,開發者需要利用 --experimental-permission 標誌,並結合所需的許可權。

下面是一個例子,說明如何使用許可權模型來允許對整個檔案系統的讀寫訪問:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ node --experimental-permission --allow-fs-read=* --allow-fs-write=* index.js
$ node --experimental-permission --allow-fs-read=* --allow-fs-write=* index.js
$ node --experimental-permission --allow-fs-read=* --allow-fs-write=* index.js

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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ node --experimental-permission --allow-fs-write=/tmp/ --allow-fs-read=/home/index.js index.js
$ node --experimental-permission --allow-fs-write=/tmp/ --allow-fs-read=/home/index.js index.js
$ node --experimental-permission --allow-fs-write=/tmp/ --allow-fs-read=/home/index.js index.js

許可權模型的一個重要好處是能夠對檔案系統的訪問進行更精細的控制。例如,開發人員可以指定路徑和萬用字元模式,允許訪問特定的資料夾或檔案。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ node --experimental-permission --allow-fs-read=/home/user/* index.js
$ node --experimental-permission --allow-fs-read=/home/user/* index.js
$ node --experimental-permission --allow-fs-read=/home/user/* index.js

上述命令授予/home/user/目錄內所有資料夾的讀取許可權。

程序物件的許可權屬性也可以用來檢查在執行時是否被授予了特定的許可權。例如,如果你想檢查你的Node.js程序是否有對特定資料夾的讀取許可權,/home/user/documents,你可以使用以下程式碼:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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');
}
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'); }
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,用於編寫和構建測試檔案,還有mocking、watch模式,以及使用 node --test 命令並行執行多個測試檔案的能力。

下面是一個如何使用測試執行器的例子:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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");
});
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"); });
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 標誌提供實驗性的測試覆蓋率和嘲弄功能。

雖然不打算取代全功能的測試框架,如JestMocha,但穩定的測試執行器提供了一個簡單而快速的方法來建立測試套件。自從在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 :提供更大的靈活性,允許更有效的記憶體分配。
  • 帶有集合符號和字串屬性的正規表示式v標誌:為正規表示式新增功能。
  • 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中,構建單個可執行應用需要注入Node.js從JSON配置中準備的blob,而不是注入原始JS檔案。

blob是一個包含二進位制資料的檔案,在本例中是由Node.js準備的,它被注入到二進位制中。作出這一改變是為了能夠將多個共存的資源嵌入到SEA中,這就開闢了新的用例。

下面是一個sea-config.json檔案的例子:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
{
"main": "myscript.js",
"output": "sea-prep.blob"
}
{ "main": "myscript.js", "output": "sea-prep.blob" }
{ 
"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基金會的成員,微軟正在調查這項功能,作為減少向量攻擊和賦予Node.js架構更好體驗的一種方式。雖然SEA功能仍然是實驗性的,但它代表了Node.js社羣的一個令人興奮的新發展。

效能

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

其中一個值得注意的改進是減少了初始化 EventTarget 的成本,它被削減了一半,從而使使用它的所有子系統的訪問速度加快。此外,V8快速API呼叫已被用於提高 URL.canParse() 和定時器等API的效能。

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

小結

在這篇文章中,你已經瞭解了Node.js v20帶來的一些主要功能(實驗性和穩定性)和改進,比如對V8 JavaScript引擎的改進、效能、測試執行器和實驗性許可權模型的引入,以及單次執行應用程式。

需要知道的是,Node.js v14將在2023年4月進入生命末期,所以建議開始計劃升級到Node.js v18(LTS)或vNode.js 20(即將成為LTS)。

評論留言