做者:David Nealjavascript
翻譯:瘋狂的技術宅前端
原文:developer.okta.com/blog/2019/1…java
未經容許嚴禁轉載node
2019 年是 Node.js 誕生的第 10 個年頭,npm
上可用的包數量超過了 100 萬。 Node.js 自己的下載量也在持續增加,同比增加了 40%。另外一個重要的里程碑是 最近 Node.js加入了 OpenJS 基金會,該基金會承諾改善項目的情況和可持續性,並改善與整個 JavaScript 社區的協做。webpack
正如你所見到的那樣,在短期內發生了不少事情!Node.js 社區仍在蓬勃發展,即使是到了 2020 年仍然沒有放緩的跡象。git
下一個Node.js 的主要版本正在探索更多有趣的功能。在本文中,我將探討 Node.js 社區在 2020 年值得期待的一些最重要的更新。github
在撰寫本文時 Node.js 的最新版本是 13。已經有了不少功能和更新,能夠在 2020 年以前開始試用。如下是一些要點:web
在深刻探討這些細節以前,先看一下咱們對 Node.js 發佈時間表的指望。npm
每六個月發佈一次新的 Node.js 主要版本,發佈時間分別是四月和十月。其涉及到的主要版本被稱爲當前 版本。在撰寫本文時 Node.js 的當前版本是 13,它於 2019 年 10 月份發佈。json
每一年的10月發佈編號爲奇數的版本(例如 v9,v11 和 v13),其壽命很短,所以不適合生產環境。你能夠認爲奇數版本是 beta 版本。它們被用於測試 Node.js 的下一個偶數版本中的新功能和更改。
偶數版本(例如 v8,v10 和 v12)於每一年 4 月發佈。在發佈以後,上一個奇數版本將會中止更新。儘管它比奇數版本更穩定,但在接下來的六個月中將會繼續積極開發。能夠將前六個月視爲「發佈候選」階段。
一旦偶數版本通過六個月的考驗,將會進入一個新的階段,被稱爲「長期支持」(LTS)。 LTS 階段被認爲能夠投入生產。在接下來的 12 個月中,LTS 版本將會進行錯誤修復、安全更新和其餘的一些改進,目的是不破壞任何現有程序。
在 LTS 以後,有一個最後的「維護」階段。在維護期間 Node.js 版本將會只接收 關鍵 錯誤和安全修復程序。在維護階段持續 18 個月後,會被視爲壽命終止(EOL),而且再也不受到支持。
咱們應該指望可以在 2020 年看到如下發布時間表。
2020 年 1 月 ~ 3 月
2020 年 4 月
2020 年 10 月
![2020 年 Node.js 新功能發佈時間表](
)注意:因爲Node 8.x 的生命週期(EOL)依賴於 OpenSSL-1.0.2, OpenSSL-1.0.2 的生命週期在 2019年末結束,因此計劃將Node 8.x 的 EOL 定於2019年末。你應該開始計劃將 8.x 程序遷移到 10.x 或 12.x 了。
從 v13.2.0 開始,Node.js 既支持傳統的 CommonJS 模塊,也支持新的標準 ECMAScript(ES)模塊。這意味着你最終可以使用可能已經可以在瀏覽器中使用的 import
和 export
語法。另外請務必注意,默認狀況下 Node.js 中的 ES 模塊啓用了 JavaScript 嚴格模式,你沒必要在每一個文件的開始都指定 use strict
。
// message file
async function sendMessage { ... }
export { sendMessage };
// index file
import { sendMessage } from "./message";
複製代碼
可是爲了使 Node.js 知道正在使用 ES 模塊,你仍然須要作一些工做。最多見的兩種方法是使用 .mjs
文件擴展名,或者在最近的父 package.json
文件中指定 "type":"module"
。
.js
文件重命名爲 .mjs
文件。package.json
文件,或者把 package.json
添加到包含 ES 模塊的目錄中,並將 type
指定爲 module
。{
"type": "module"
}
複製代碼
另外一種可能性是在根 package.json
文件中啓用 ES 模塊,而後重命名全部 CommonJS 模塊文件來使用 .cjs
擴展名。
我我的以爲 .mjs
和 .cjs
擴展名比較粗略,因此我很樂意看到有一些方法能夠經過 package.json 文件去指定 ES 和 CommonJS 模塊的用法。
除了 ES 模塊支持以外,還能夠導入 WebAssembly(Wasm)模塊! 這是一種可移植的已編譯二進制格式,具備 JavaScript 更快的解析速度,並可以以本機速度執行。可使用 C/C++、Go、C#、Java、Python、Elixir、Rust 等語言去建立 WebAssembly 模塊。
在撰寫本文時,WebAssembly 模塊支持仍處於試驗階段。要啓用此功能,須要在執行 Node.js 程序時傳遞命令行標誌。例如:
node --experimental-wasm-modules index.js
複製代碼
假設你有一個實現爲 WebAssembly 模塊的圖像處理庫。使用此 Wasm 模塊的語法以下所示。
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 );
} )();
複製代碼
也能夠用 Node.js 中新的動態 import()
語句進行導入。
"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 );
} )();
複製代碼
與 JavaScript 類似,WebAssembly 在設計時就考慮到了安全性問題,以防止任何對底層操做系統的訪問(有時稱爲「沙盒」)。但有時 Node.js 中的 WebAssembly 模塊可能會由於可以進行系統級調用而受益。
因此就出現了新的 WebAssembly 系統接口(WASI)。WASI 被設計爲用於對基礎系統(例如主機應用,操做系統等)進行調用的標準接口。
Node.js 項目對 WASI 的支持已經在最近提交。 WASI 可能會是另外一個可以在 2020 年看到的使人興奮的功能!
診斷報告是可以供人類閱讀的 JSON 格式的過程信息摘要,其中包括調用棧、操做系統信息、已加載的模塊以及可以幫助支持應用程序的其餘有用的數據。這些報告可以在未處理的異常、致命錯誤、進程信號或使用新的 process.report
API 時觸發。能夠在 Node.js 中配置診斷報告,並以指定的文件名保存到文件夾中。
在撰寫本文時,診斷報告仍然處於實驗階段。要啓用此功能,須要在執行 Node.js 程序時傳遞命令行標誌:
node --experimental-report --report-uncaught-exception --report-filename=./diagnostics.json index.js
複製代碼
從 v13.x 開始,Node.js 帶有完整的 ICU(Unicode 的國際化組件)。 ICU 是一個成熟且流行的全球化庫。包括支持格式化數字、日期、時間和貨幣,可以執行時間計算和字符串比較,還有 Unicode 和其餘字符集之間轉換文本的功能。
本文只是開始拉開了 2020 年改進 Node.js 的全部艱苦工做的序幕!若是你有興趣隨時瞭解最新的更新或想要以某種方式參與其中,請在 Node.js 官網查看爲 Node.js 作出貢獻的方式 。