Bun 1.4.1 內建 HTTP/2 與串流寫檔,大砍記憶體用量
Bun Blog · 2026-09-04
Bun 團隊於 2026 年 9 月 4 日發布 v1.4.1,一次修復 202 個回報問題。這個版本替 Bun.serve 加入原生 HTTP/2 支援、讓 Bun.write() 能把回應主體直接串流寫入磁碟,並提供 workspace 專用的獨立 node_modules 佈局。安裝與建置流程也同步調整,鎖定 Electron 之類要求特定目錄結構的工具鏈。
執行期改動
Bun.serve 現在能在同一個連接埠上以 ALPN 協商同時服務 HTTP/1.1 與 HTTP/2,明文連線則靠偵測 HTTP/2 preface 判斷協定;開發者可設定 http1: false 拒絕舊版客戶端。官方基準測試顯示 Hello World GET 請求吞吐量比 Node.js 快 6.8 倍。設定方式只需在選項物件加入一個欄位:
Bun.serve({
tls: { key, cert },
http2: true,
fetch(req) {
return new Response("hi");
},
});Bun.write() 這次改為把 Response/Request 的主體直接串流寫入磁碟,不再整包緩衝進記憶體,並在 256 KiB 時自動套用 backpressure。寫入 128 MiB 檔案時,峰值 RSS 從 161 MB 降到 13 MB。新增的 WebSocket.prototype.pause()/resume() 與 crypto.argon2/argon2Sync(支援 argon2d/i/id,輸出與 Node.js 逐位元組一致)也一併納入這個版本。
安裝與建置系統
workspace 設定新增 selfContained 欄位,讓指定套件擁有獨立完整的 node_modules,不再依賴 hoist 到 workspace 根目錄的共用結構:
{
"workspaces": {
"packages": ["apps/*"],
"selfContained": ["apps/desktop"]
}
}bun build 對 export * as 的重寫更精準,zod 4.5 的輸出從 375.3 KB 降到 77.3 KB,fp-ts 2.16 從 21.8 KB 降到 3.2 KB;動態 import() 現在也能被 tree-shaking 移除未用的匯出。新增的 --min-chunk-size 旗標與「require() 作為 chunk 邊界」的行為,讓 400 個延遲載入模組的啟動時間從 23.2 ms 降到 11.2 ms。
安全性修正與其他變動
這個版本修正一個 TLS 驗證問題:fetch() 先前會用請求裡自訂的 Host 標頭去驗證憑證,而非用 URL 本身的主機名稱,導致部分合法請求誤觸發 ERR_TLS_CERT_ALTNAME_INVALID;現在改回比對 URL hostname。安裝行為新增旗標:
bun install --offline:完全不發網路請求,套件須已在快取中,否則直接報缺件錯誤bun install --prefer-offline:優先使用快取套件,不論其新舊--env-file=/dev/stdin:允許從管線或 FIFO 讀取環境變數檔
閒置記憶體同樣下降,以下是閒置三分鐘後,v1.4.0 與 v1.4.1 的 RSS 對照:
| 應用 | v1.4.0 | v1.4.1 |
|---|---|---|
| Next.js SSR | 222 MB | 142 MB |
| vite dev | 142 MB | 111 MB |
| Express | 65 MB | 53 MB |
WHATWG 替 HTML Sanitizer API 加上 javascriptURLs 設定,補齊 removeUnsafe() 的清除邏輯
WHATWG html · 2026-09-04
WHATWG 於 2026 年 9 月 4 日在 whatwg/html 推上提交 e5071a2,替 Sanitizer 介面新增 setJavascriptURLs(allow) 方法與對應的 SanitizerConfig.javascriptURLs 設定項。這個改動由 Noam Rosenthal 提出,關閉了 issue #12686,並附上 web-platform-tests 的驗證案例 wpt#62421。
背景
HTML Sanitizer API 提供瀏覽器原生的 DOM 消毒能力,用來取代自行導入 DOMPurify 之類函式庫解析不受信任 HTML 的做法。目前 Firefox 148 已內建支援,Chrome 146 於 Canary 加上旗標開關,Safari 尚未開始實作,整體還未進入 Baseline。過去移除 javascript: 開頭 URL 屬性的行為,是寫死在「呼叫方法是否為 Safe 模式」的邏輯裡,並非配置本身的一部分。
核心改動
提交把移除 javascript: URL 的判斷,從方法別硬編碼改為 configuration 內的獨立布林欄位。canonicalize the configuration 演算法新增一步:若設定沒有指定 javascriptURLs,就沿用原本套用在 comments/dataAttributes 的預設值參數(該參數同時把舊名 allowCommentsPIsAndDataAttributes 改名為 permissiveDefaults)。新增的介面成員如下:
interface Sanitizer {
boolean setComments(boolean allow);
boolean setDataAttributes(boolean allow);
boolean setJavascriptURLs(boolean allow); // 新增
boolean removeUnsafe();
};
dictionary SanitizerConfig {
boolean comments;
boolean dataAttributes;
boolean javascriptURLs; // 新增
};影響範圍
調整後,呼叫 removeUnsafe() 時也會套用同一套 javascript: URL 清除規則,不再只限於以 Safe 模式建立的 Sanitizer 才生效,行為與現有的 comments、dataAttributes 兩個欄位一致。規格本身尚未綁定特定瀏覽器版本,實作端須待 Firefox、Chrome 後續更新才會反映這個新欄位。
WHATWG 改寫 img/input 尺寸屬性演算法,未渲染時改回傳 width/height 內容屬性
WHATWG html · 2026-09-04
WHATWG 於 2026 年 9 月 4 日提交 100b354,修改 img 元素與 Image Button 狀態下 input 元素的 width/height IDL 屬性演算法。作者 Anne van Kesteren 指出,舊規格要求元素未渲染時回傳自然尺寸(natural dimensions),但所有主流瀏覽器實際回傳的是 width/height 內容屬性值,此次改動讓規格對齊既有實作。提交關閉 issue #12573,測試案例為 wpt#61080。
核心改動
規格新增一個共用演算法「determine the dimensions」,同時套用在 img 與 Image Button input 兩種元素上,步驟為:
- 若元素正在被渲染,回傳其 content box 的寬高(CSS px)
- 否則 width/height 先預設為 0
- 若存在自然尺寸(natural dimensions),用它覆蓋 width/height
- 若元素有
width/height內容屬性且可解析為非負整數,再用內容屬性值覆蓋 - 回傳最終的 width、height
換句話說,內容屬性的優先權高於自然尺寸,兩者都缺席時才回退到 0。舊演算法裡「has density-corrected natural width and height」這個額外判斷條件也一併移除,因為先前提交 4ff60b0 已讓每張可用圖片都能取得 300×150 的預設尺寸,不會再有判斷失敗的情況。
影響範圍
這是一項規格追認既有瀏覽器行為的修正,不涉及新的瀏覽器實作工作。開發者在未渲染的 img(例如 display: none 或尚未插入文件)上讀取 .width/.height 時,得到的數值會是 HTML 屬性寫的值而非圖片檔案本身的解析度,若程式碼曾假設兩者永遠一致,需要重新檢查。