BACK
Featured image of post Node v19 正式發布

Node v19 正式發布

Node.js 19 在 2022/10/18 正式發布了,此次更新包括將 V8 JavaScript 引擎更新到10.7,以及默認啟用 HTTP (s)/1.1 KeepAlive。Node.js 18 在本月晚些時候將進入長期支持(LTS),Node.js 19 將取代 Node.js 18 成為 "Current" 版本。

參考網站
參考網站

Node.js 19 在 2022-10-18 正式發布了,此次更新包括將 V8 JavaScript 引擎更新到 10.7,以及默認啟用 HTTP (s)/1.1 KeepAlive
Node.js 18 在本月晚些時候將進入長期支持(LTS),Node.js 19 將取代 Node.js 18 成為 “Current” 版本。


官方文檔

node –watch (實驗性)

運行時,增加了一個令人興奮的功能,支持使用 node --watch,選項在 “watch” 模式下運行。在 “watch” 模式下運行,當導入的文件被改變時,會重新啟動進程。

1
node --watch index.js

此功能在 v19.0.0v18.11.0+ 中可用。

默認啟用 HTTP(S)/1.1 KeepAlive

從這個版本開始,Node.js 默認將 keepAlive 設置為 true,這意味著任何出站的 HTTP (s) 連線將自動使用 HTTP 1.1 Keep-Alive。默認的 keep-alive 時間是 5 秒。
啟用 keep-alive 將提供更好的吞吐量,因為連接在默認情況下被重複使用。

穩定的 WebCrypto

WebCrypto API 現在已經穩定(以下算法除外:Ed25519、Ed448、X25519 和X448)
使用 globalThis.cryptorequire('node:crypto').webcrypto 來訪問這個模塊。

自定義 ESM Resolution 調整

Node.js 已經刪除了 --experimental-specifier-resolution 標誌,其功能現在可以通過自定義加載器實現。

移除 DTrace/SystemTap/ETW 支持

對 DTrace/SystemTap/ETW 的支持在 v19.0.0 中被移除,主要原因是資源的優先級問題。

如果你有興趣幫助恢復 DTrace,可以查看該 issue:https://github.com/nodejs/node/issues/44550

依賴

V8 10.7

V8 引擎已經更新到 10.7 版本,這是 Chromium 107 的一部分。這個版本包括了 JavaScript API 的一個新特性:Intl.NumberFormat

Intl.NumberFormatv3 API 是一個新的 TC39 ECMA402 第三階段提案,擴展了先前存在的 Intl.NumberFormat

llhttp

Node.js 19 搭載了 [email protected]

npm

Node.js 19 搭載了 [email protected]

Node.js 18 將進入 LTS

Node.js 18 系列將在下週過渡到長期支持版本。

生命週期

Node.js 14 將在 2023 年 4 月達到生命週期結束,因此建議用戶開始計劃升級到 Node.js 16(LTS)或 Node.js 18(LTS)。
Node.js 16 (LTS) 將在 2023 年 9 月達到生命週期結束,比原計劃 2024 年 4 月提前了。

更多詳情可查看:https://nodejs.org/en/blog/announcements/v19-release-announce/


補充: Nodejs 16 的新特性

原文網址:https://weekly.shanyue.tech/release/node-16/

Node 16 於四月二十日發布,山月在第一時間下載了Node16 體驗了以下新特性。偶數號的版本為LTS 版本,這將是既Node14 之後的下一個長期支持版本,Node14 在2020-10-27 已進入 Active LTS 階段,還沒有升級的同學要盡量更新呀。

Node 16 Release 官方文檔 列出了此次它所有的新特性以及非常詳細的提交記錄。那它到底更新了哪些新特性,先讓我們一睹為快吧!

Timers Promise API

Timers Promise API 其實在 Node 15 就已存在,那時候是一個實驗特性,目前已進入了穩定階段,是一項令人興奮的特性。那它到底是幹什麼用的呢?

先別急,在此之前,先看一個問題:如何實現一個sleep/delay 函數?

答案也很簡單,使用 Promise 封裝一個 setTimeout 即可

1
const sleep = (t = 0) => new Promise(resolve => setTimeout(resolve, t));

那有了 Timers Promise 之後呢,使用 setTimeout 直接可替代 sleep 功能,驚不驚喜。

1
2
3
import { setTimeout } from 'timers/promises';

await setTimeout(100);

setTimeout 的第二個參數接收一個值,作為 Promise 成功後的返回值

1
2
3
4
const r = await setTimeout(100, 'hello, world');

//=> hello, world
console.log(r);

而當 setInterval 也變為 Promise 形式後,對於每間隔一分鐘便執行操作的定時任務而言,具有更大的可讀性

1
2
3
4
5
6
7
import { setInterval } from 'timers/promises';

for await (const startTime of setInterval(100, Date.now())) {
  const now = Date.now();
  if ((now - startTime) > 1000)
    break;
};

底層依賴升級

我們知道,Node 基於 v8、libuv、llhttp 等諸多依賴,這次它對諸多依賴進行了升級。如同我們的業務項目依賴於諸多軟件包,每一次依賴的升級也會對性能造成不少提升

  • v8 升級到 9.0,主要是 ECMAScript RegExp Match Indices
  • llhttp 升級到 6.0.0,用以解析 HTTP 報文
  • icu 升級到 69.1
  • npm 升級到 7.10.0

使用 process.versions 可看到相關依賴的版本號

1
> process.versions
export
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
{
  "node": "16.0.0",
  "v8": "9.0.257.17-node.10",
  "uv": "1.41.0",
  "zlib": "1.2.11",
  "brotli": "1.0.9",
  "ares": "1.17.1",
  "modules": "93",
  "nghttp2": "1.42.0",
  "napi": "8",
  "llhttp": "6.0.0",
  "openssl": "1.1.1k+quic",
  "cldr": "39.0",
  "icu": "69.1",
  "tz": "2021a",
  "unicode": "13.0",
  "ngtcp2": "0.1.0-DEV",
  "nghttp3": "0.1.0-DEV"
}

btoa 與 atob

關於 Base64 的轉化,Node 在以前使用了 Buffer.from,而現在支持 btoa/atob 與瀏覽器環境保持了一致。
而對於一個 SSR 項目而言,執行環境的區分將無關緊要,統一使用 btoa/atob 就好了

1
2
3
4
5
6
7
8
const base64 = {
  encode (v: string) {
    return isBrowser ? btoa(v) : Buffer.from(v).toString('base64');
  },
  decode (v: string) {
    return isBrowser ? atob(v) : Buffer.from(v, 'base64').toString();
  }
}

更多

關於 Node16 升級的諸多小細節,可參閱版本發布獲取更多信息,可持續 Wayne’s Blog 對各軟件每一次重大版本升級的說明講解。


comments powered by Disqus