
Node.js 專註於十月二十九日發布 27.0.0-alpha.0.0.0,是 Node.js 27 開發週期的第一個 Alpha 版本,由 Rafael Gonzaga 負責發布[1]。這個版本把 V8 引擎由 14.6 升級至 15.6.75.13,並一次過移除多項遺留的 OpenSSL 路徑,屬於典型的「大版本清理」式更新。Alpha 版距離正式進入 Current 通道還有一段時間,但已足夠讓套件維護者預先檢視相容性。
語言與執行引擎
V8 15.6 帶來多項預設啟用的語言功能,包括 Math.sumPrecise()、Intl.Locale.prototype.variants、Iterator.prototype.join()、Iterator.prototype.includes(),以及 Iterator.zip() 與 Iterator.zipKeyed()。需要旗標的實驗功能劃有 import defer(--js-defer-import-eval)、不可變 ArrayBuffer(--js-immutable-arraybuffer)與 RegExp buffer boundaries。
行為隱面亦有多項變動。Math 系列方法改用 LLVM 的 libm 實作,最後一位有效位可能與舊版不同;同一個 --random-seed 之下,Math.random() 產生的序列會改變;error.stack 不再攜帶原型鏈查找;await 產生的微任務數量減少;大型陣列的 Array.prototype.sort() 改用 PowerSort,並堅持穩定排序。WebAssembly 方向,asm.js 不再編譯成 Wasm,--experimental-wasm- 系列旗標改名為 --wasm-。
記憶體與序列化
記憶體預設值改動值得留意。當沒有指定 --max-old-space-size 時,預設壓力上限改為實際記憶體的一半,並落在 256 MB 至 4 GB 之間;同時 Buffer 與 ArrayBuffer 實例所佔記憶體亦計入壓力上限。反之,過去舊版預設「餓死」記憶體的濫用,升級後可能提早觸發記憶體不足,需要明確設定上限。
序列化格式亦有破壞性變動。v8.serialize()、structuredClone() 與 postMessage() 改用新格式,舊版 Node.js 無法讀取;v8.cachedDataVersionTag() 與編譯快取改為在每個 V8 修訂版本都會變動,不再只在 V8 大版本更新時變動。此外,壓縮快照現在會包含內部物件、數值與完整腳本原始碼,生成時間約為原本兩倍,檔案大小亦約為兩倍[1]。
加密壓力的清理
這個版本把 OpenSSL 原始碼升級至 4.1.0,並把「要求 OpenSSL 3 或以上」列為 semver-major 變動,同時移除內建的 FIPS provider 建置、舊版 OpenSSL 程式碼路徑與 ncrypto 後端,以及結束 OpenSSL engine 支援。相關項目 DEP0093、DEP0198、DEP0203 與 DEP0204 一併進入生命週期結束。若專案依賴 FIPS 模式或自簽 engine,升級前必須先確認替代方案。
其他 semver-major 變動包括:fs.glob 改為原生實作;HTTP 的 keepAliveTimeout 預設值提高至 65 秒;req.headers 改為空原型物件;回調標頭超過上限時直接拒絕;domain 模組進入 runtime 棲用;npm 升級至 12.1.0;Intel macOS 支援降級為實驗性。
升級注意
Alpha 版本不宜用於生產環境,但有意測試的維護者宜先在 CI 跑一次完整測試,特別留意記憶體上限、序列化格式與 req.headers 空原型這三項,它們最容易在無警告的情況下改變行為。如果慣用 --max-old-space-size 自行控制記憶體則不受影響,但仍需檢查 Buffer 計入壓力後的實際用量。