Node.js 26 發佈:Temporal API 與運行時現代化

Node.js 26 的發佈標誌著該平台在現代化其核心 API 與引擎方面邁出了重要一步。雖然版本升級帶來了常見的效能改進與依賴更新,但最引人注目的新增功能是預設啟用了 Temporal API,解決了 JavaScript 生態系統中最長期的痛點之一:日期與時間處理。

如同「Current」版本的慣例,Node.js 26 將在接下來的六個月內作為尖端版本,並於十月進入長期支援 (LTS) 階段。對於開發者而言,這次發佈與其說是一個單一的「殺手級功能」,不如說是清理舊有負擔並整合現代 TC39 提案的累積效應。

Temporal API 的到來

Node.js 26 中最受期待的變化是現在預設啟用的 Temporal API。多年來,JavaScript 開發者一直依賴舊有的 Date 物件,該物件因其 API 混亂且缺乏對時區與日曆系統的支持而廣受批評。為了填補這一空白,社群高度依賴 Moment.js、Luxon 和 date-fns 等第三方函式庫。

有了 Temporal,Node.js 提供了一個直接內建於運行時中的強大且功能豐富的替代方案。正如 Hacker News 社群成員所指出的,這是向平台原生日期/時間處理邁出的受歡迎轉變:

"Moment 和 Luxon 相當不錯,但合理的日期/時間處理應該是平台開箱即用的功能。"

V8 14.6 與新語言特性

Node.js 26 將 V8 JavaScript 引擎更新至版本 14.6.20.33。這次更新不僅僅是為了速度;它還將幾個值得注意的 TC39 提案引入了運行時:

Map Upsert

[Weak]Map.prototype.getOrInsert()getOrInsertComputed() 方法引入了一種更有效率的方式來處理類似快取的模式。有趣的是,一些開發者注意到這裡對 "upsert" 的定義在語義上有所轉變。雖然傳統上被視為 "Update or Insert"(更新或插入),但 V8 的實作專注於 "Get or Insert"(獲取或插入)。

Iterator Sequencing

新增的 Iterator.concat() 允許更輕鬆地對迭代器進行排序,簡化了開發者處理數據流與複雜迭代邏輯的方式。

現代化平台:移除與棄用

Node.js 26 繼續了激進進的 "SEMVER-MAJOR" 變更,以移除舊有代碼並減輕核心團隊的維護負擔。關鍵的移除項目包括:

  • http.Server.prototype.writeHeader(): 現在已完全移除。開發者必須遷移至 writeHead()

  • 舊版 Stream 模組: 內部的 _stream_wrap_stream_readable_stream_writable_stream_duplex_stream_transform_stream_passthrough 模組已被清除。

  • TypeScript Transforms: --experimental-transform-types 旗標已被移除,這標誌著運行時處理類型轉換的方式發生了轉變。

  • Corepack: Corepack 的文件已被移除,且用戶注意到它不再隨 Node.js 26 一起發佈,這可能會影響使用它作為安裝 pnpm 主要方法的人。

其他值得注意的更新

  • Undici 8: 預設的 HTTP 客戶端已更新至版本 8.0.2,持續提升網路請求的效能與可靠性。
  • 建置需求: 最低 GCC 要求已提升至 13.2,且不再支援 Python 3.9。
  • Crypto 增強功能: 此發佈包含 crypto 模組的幾項更新,包括對 KeyObject API 的原始金鑰格式支持,以及非對稱金鑰導入的統一化。

社群觀點

雖然這次發佈普遍受到好評,但社群仍持續推動核心中缺失的功能。一些開發者對內建的 SQLite 模組仍帶有實驗性標籤表示失望,而其他人則感嘆缺乏原生的 WebSocket server 實作來簡化部署並提升安全性。

對於想要升級的開發者,建議審查您對舊版 httpstream 方法的使用情況,以避免破壞性變更。一旦完成向 Temporal 的遷移,對重型日期處理函式庫的需求可能會終於開始減少。

Sources