2019 年,Node.js 已經10歲了,而 NPM 上可用的包數量也超過了 100 萬個。Node.js 本身的下載數也仍在上升,同比上年增長 40%。另一個重要的里程碑是 Node.js 最近加入了 OpenJS 基金會,該基金會承諾改善項目的健康度和可持續性,並加強與整個 JavaScript 社區的協作。
如你所見,在短時間內發生了很多事情!Node.js 社區每年都有增長勢頭,2020 年沒有絲毫放緩的跡象。在 Node.js 的下一個主要版本中,正在研究許多有趣的特性。在本文中,將會探討 Node.js 社區在 2020 年值得期待的一些重要更新。
Node.js 13 有什麼新功能?
在本文成文時最新版本是 Node.js 13,有很多功能和更新可以在 2020 年之前開始使用,下面是一些亮點:
- ECMAScript 模塊
- WebAssembly 支持
- 診斷報告
- 對日期、時間、數字和貨幣格式提供全面的國際化支持
- QUIC 協議支持
- V8 JavaScript 引擎性能更新
在詳細瞭解這些更新之前,讓我們先看看 Node.js 的發佈計劃。
2020 年 Node.js 的發佈計劃
每 6 個月發佈一個新的 Major 版本,分別在 10 月和 4 月。此主要版本稱為當前版本。截至本文撰寫之時,Node.js 的當前版本為 13,於 2019 年 10 月發佈。
奇數版本(如v9、v11、v13)每年 10 月發佈,時間很短不被視為已準備好投入生產。可以認為奇數版本是測試版,為了測試新特性和引入 Node.js 下一個偶數版本的變更。
偶數版本(如v8、v10、v12)每年 4 月發佈。發佈後,以前的奇數版本將停止接收更新。雖然比奇數版本更穩定,但在未來 6 個月內仍將積極開發更新,可以把前 6 個月看作是一個發佈候選期。
一旦一個偶數版本經過 6 個月,就進入了一個新的生命階段,稱為長期支持(LTS)。LTS 階段可以被視為可以被應用於生產環境,在接下來的 12 個月中,LTS 版本以不破壞任何現有應用的目的進行 bug 修復、安全更新和其他改進。
在 LTS 之後,有一個最後的維護階段。維護階段為 18 個月,在此階段中只會進行嚴重的錯誤和安全修復。經過 18 個月的維護,將被視為壽命結束(EOL),不再進行支持。
預計 2020 年的發佈時間表
預計在 2020 年會以下面的時間表發佈:
2020年1-3月
- 13.x 是當前版本,並積極開發
- 10.x 和 12.x 為 LTS
2020年4月
- 14.x 發佈併成為當前版本
- 14.x 發佈後,13.x 工作立即停止
- 10.x 進入維護階段
2020年10月
- 15.x 發佈併成為當前版本
- 14.x 進入LTS
- 12.x 進入維護
注:由於 8.x 的生命週期結束(EOL)依賴於 OpenSSL-1.0.2,因此計劃在 2019 年底結束,OpenSSL-1.0.2 也計劃在 2019 年底結束。如果你還沒有準備好,請計劃起來將 8.x 應用程序升級到 10.x 或 12.x。
支持 ECMAScript 模塊
從 v13.2.0 開始,Node.js 將支持傳統的 CommonJS 模塊和新的 ECMAScript(ES) 標準模塊。這意味著將可以使用 import 和 export 語法,您可能已經在瀏覽器中嘗試過了。另外,需要注意的是 Node.js 中的 ES 模塊在默認情況下啟用了 JavaScript Strict 模式,因此不需要在每個文件的頂部指定 "use strict"。
<code>// message file
async function sendMessage { ... }
export { sendMessage };
// index file
import { sendMessage } from "./message";/<code>
但是,仍然需要額外做一些事情,讓 Node.js 知道您正在使用 ES 模塊。最常用的兩種方法是使用 .mjs 文件擴展名或在最近的 package.json 中指定"type": "module"。
選項一:重命名 .js 文件為 .mjs 文件;
選項二:更新項目根 package.json,或者增加一個 package.json 到包含 ES 模塊的目錄來指定 type 和module;
<code>{"type": "module"}/<code>
還有一種方法,在根 package.json 文件中啟用 ES 模塊,然後重命名所有 CommonJS 文件為 .cjs 擴展名。
Node.js 可以導入 WebAssembly 模塊
除了支持 ES 模塊外,還可以導入 WebAssembly(Wasm)模塊!WebAssembly 模塊是一種可移植的二進制格式,可以比 JavaScript 更快地解析並以本機速度執行。WebAssembly 模塊可以使用諸如 C/C++、Go、C#、Java、Python、Elixir、Rust 等語言來建構。
截至本文撰寫時,WebAssembly 模塊支持仍處於試驗階段。要啟用此功能,必須在執行 Node.js 時傳遞命令行參數。例如:
<code>node --experimental-wasm-modules index.js/<code>
下面是一個例子,假設有一個圖像處理庫為 WebAssembly 模塊實現。使用這個 WebAssembly 模塊的語法可能如下所示。
<code>import
*
as
imageUtils
from
"./imageUtils.wasm"
;
import
*
as
fs
from
"fs"
;
(
async
() => {
const
image =
await
fs.promises.readFile(
"./image.png"
);
const
updatedImage =
await
imageUtils.rotate90degrees( image );
} )();/<code>
還可以使用 Node.js 中新的動態 import() 語句導入 WebAssembly 模塊。
<code>"use strict";
const fs = require("fs");
(async () => {
const imageUtils = await import("./imageUtils.wasm");
const image = await fs.promises.readFile("./image.png");
const updatedImage = await imageUtils.rotate90degrees(image);
})();/<code>
WebAssembly系統接口(WASI)
與 JavaScript 類似,WebAssembly 在設計時亦考慮了安全性,以防止訪問不被預期的底層操作系統。但是,在您可控的情況下有些時會受益於 WebAssembly 的能力,來進行一些系統級別的調用。
這就是新的 WebAssembly 系統接口(WASI),WASI 被設計成一個標準接口,用於調用底層系統,如主機應用程序、本機操作系統等。
最初的 WASI 支持最近被提交到 Node.js 項目。WASI 是 2020 年 Node.js 另一個激動人心的特性!
2020 將推出診斷報告
診斷報告是人類可讀的 JSON 格式的進程信息摘要,包括調用堆棧、操作系統信息、加載的模塊和其它可以幫助應用程序的有用數據。這些報告可以在未處理的異常、致命錯誤、進程信號或使用新的 process.report API 時觸發。Node.js 可以配置將診斷報告保存到指定的文件夾和文件名。
截至本文撰寫之時,診斷報告仍在實驗階段。要啟用此功能,必須在執行 Node.js 時傳遞命令行參數。例如:
<code>node --experimental-report --report-uncaught-exception --report-filename=./diagnostics.json index.js/<code>
2020 國際化支持將加大
從 v13.x 開始,Node.js 使用完整的 ICU(International Components for Unicode),ICU 是一個成熟而流行的全球化庫。ICU 包括對格式化數字、日期、時間和貨幣、執行時間計算和字符串比較,以及在 Unicode 和其他字符集之間轉換文本的支持。
2020 的其他 Node.js 更新
- QUIC 協議支持:提供更高性能和可靠性的現代傳輸協議;
- 更好的 Python 3 構建支持:到 2020 年,應該可以使用 Python3 構建 Node.js 和本機模塊;
- 更新的 V8 JavaScript 引擎:V8 v7.8 和 7.9 提高了性能和 Wasm 支持;
- 穩定的 Worker Threads API:Node.js 中的 Worker Threads 支持並行與 CPU 密集型的 JavaScript 操作;
進一步瞭解 Node.js、JavaScript 和 安全性
這篇文章只是在 2020 年為改進 Node.js 所做的所有努力中的一個開始!如果您有興趣隨時瞭解最新的更改或以某種方式參與其中,Node.js 網站上有一個對 Node.js 做出貢獻的方法列表。
關注我
大家好,這裡是 FEHub,每天早上 9 點更新,為你嚴選優質文章,與你一起進步。
如果喜歡這篇文章,記得點贊,轉發。讓你的好基友和你一樣優秀。
- 感謝大家的支持
- 吃飯時加個雞腿
- 咱們明天見 :)
歡迎關注 「FEHub」,每天進步一點點
關於本文
譯文:https://mp.weixin.qq.com/s/RGTjSaY_knfXMAgecPV5Ag
原文:https://developer.okta.com/blog/2019/12/04/whats-new-nodejs-2020
閱讀更多 開發指南 的文章