前言:歡迎來到 Node.js 20
Node.js 20 已經發布,帶來了創新和激動人心的新時代。這個開創性的版本於2023年4月18日首次亮相,並將在2023年10月發佈長期支持(LTS)版本,並且將持續支持至2026年4月,下面小編就爲大家介紹一下Node.js20的幾個新特性:
1.Node.js 權限訪問
Node.js 20 正式推出了權限模型,這是 Rafael Gonzaga 提供的一項實驗性功能,可以在程序運行時限制對特定資源的訪問。
要使用這個強大的功能,只需啓用 --experimental-permission 標誌,例如:
node --experimental-permissions myApp.js
這將限制所有可用權限的訪問,這樣就可以確保應用程序遠離任何不受歡迎的入侵者。
文件讀寫系統
要允許訪問文件系統,請使用--allow-fs-read和 --allow-fs-write標誌:
$ node --experimental-permission --allow-fs-read=* --allow-fs-write=* index.js
Hello world!
(node:19836) ExperimentalWarning: Permission is an experimental feature
(Use `node --trace-warnings ...` to show where the warning was created)
下面是具體指令的含義:
- --allow-fs-read=*- 它將允許所有FileSystemRead操作。
- --allow-fs-write=*- 它將允許所有FileSystemWrite操作。
- --allow-fs-write=/tmp/- 它將允許FileSystemWrite訪問該/tmp/ 文件夾。
- --allow-fs-read=/tmp/,/home/.gitignore- 它允許FileSystemRead訪問/tmp/文件夾和路徑/home/.gitignore。
2.自定義 ESM 加載器鉤子
Node.js 20通過加載器提供的自定義鉤子
(--experimental-loader=./mr.mjs)在專用線程上運行,確保一切都保持井然有序。
以下是如何使用自定義加載器的快速示例:
loading.mjs
export async function resolve(specifier, parentModuleURL, defaultResolve) {
console.log("Resolving:", specifier);
return defaultResolve(specifier, parentModuleURL);
}
export async function load(url, defaultLoad) {
console.log("Loading:", url);
return defaultLoad(url);
}
index.js
console.log("Hello, Node.js 20!");
cmd
node --experimental-loader=./loader.mjs main.js
這個自定義加載器將記錄每個模塊的解析和加載過程。
3.同步的 import.meta.resolve()
爲了跟上瀏覽器行爲,現在 import.meta.resolve 函數返回同步。但仍可以根據需要自定定義加載器解析鉤子爲異步或同步函數。
以下是一個快速示例,展示它是如何工作的:
module.mjs
(async () => {
const resolvedURL = import.meta.resolve('./otherModule.mjs');
console.log("Resolved URL:", resolvedURL);
const asyncResolvedURL = await import.meta.resolve('./otherModule.mjs');
console.log("Async resolved URL:", asyncResolvedURL);
})();
這個示例演示了 import.meta.resolve 函數的同步和異步用法。
4.V8 引擎升級:釋放野獸!
以下是一些V8 引擎新功能的快速概述:
- 發揮正則表達式的無限潛力:使用設置符號+字符串屬性的 RegExp v 標誌,開啓更靈活、更富表現力的語法!
- 動態調整內存大小,優化性能盡在掌握:可調整大小的 ArrayBuffer 和可增長的 SharedArrayBuffer,讓內存管理達到前所未有的境界!
- 安全而可預測的數組操作方法:複製更改 Array 和 TypedArray 的方式,讓代碼既安全又可控,不修改原始數據!
- 打造格式良好的 Unicode 字符串:通過 String.prototype.isWellFormed 和 toWellFormed,驗證並轉換字符串爲完美的Unicode格式!
- 告別堆棧溢出,迎接高效遞歸:WebAssembly 尾調帶來無限遞歸的可能性,讓堆棧溢出成爲歷史!
5.穩定的測試運行器
Node.js 20 中的 test_runner 模塊已經升級並標記爲穩定版本,這意味着它已經準備好投入實際應用了。
下面是一個簡單的示例:
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");
});
6.性能增強:爲應用程序提速!
Node.js 20 注重性能,提供了一些出色的增強功能,將使應用程序運行更加流暢和快速。以下是一些亮點:
- **事件目標初始化成本降低:**初始化現在只需要一半的時間,使應用程序更加迅捷。
- **V8 快速 API 調用:**在諸如 URL.canParse() 和定時器等 API 中享受改進的性能。
7.Ada 2.0:新一代 URL 解析器巨星
Ada 2.0是用 C++ 編寫的最新和最棒的 URL 解析器版本。這個工具爲 URL 解析性能帶來了顯著的改進,使的應用程序比以往更加高效。
以下是 Ada 2.0 如何使用的一個簡單示例:
import { domainToASCII, domainToUnicode } from 'node:url';
const asciiDomain = domainToASCII('example.com');
console.log("ASCII Domain:", asciiDomain);
const unicodeDomain = domainToUnicode('xn--exmple-cua.com');
console.log("Unicode Domain:", unicodeDomain);
以上代碼演示瞭如何使用 Ada 2.0 將域名轉換爲其 ASCII 和 Unicode 表示形式。
8.準備 SEAs:出色的 Blob 單一可執行應用程序。
Node.js 20 引入了一種新的構建單一可執行應用程序(SEAs)的方式,通過將由 Node.js 從 JSON 配置中準備的 Blob 注入其中。這允許將多個共存的資源嵌入到 SEAs 中。
它的工作原理如下:
{
"main": "hello.js",
"output": "prep.blob"
}
node --experimental-sea-config sea-config.json
這將創建一個 prep.blob文件,其中包含了 SEA 所需的資源。
9.網絡加密 API
在Node.js 20 中 Web Crypto API 函數參數的強制轉換和驗證遵循 WebIDL 定義,就像 Web Crypto API 的其他實現一樣。
這提高了與其他 JavaScript 環境的互操作性,在每個環境都可以友好運行!
10.其他變化的地方
除了我們介紹的所有出色功能之外,Node.js 20 還包括一些其他不錯的更新,以增強開發體驗:
- 更好的 TypeScript 支持:使用 TypeScript 編寫更乾淨、更高效的代碼。
- 改進的 TLS 1.3 支持:享受更強大的加密來保障安全通信。
- 更快的啓動時間:應用程序啓動速度更快。
- 有效的錯誤處理:優雅地處理錯誤,確保應用程序平穩運行。
- 改進的調試體驗:輕鬆解決那些討厭的錯誤。
總結
這就是 Node.js 20 帶來的令人大開眼界的創新點的介紹,如果各位想獲取更多的詳細信息,請訪問 Node.js 20官網。
擴展鏈接: