前端前線 2026 年 9 月 5 日

2026-09-05 — Bun 1.4.1 內建 HTTP/2 與串流寫檔,WHATWG 修訂 Sanitizer 與圖片尺寸屬性規格

primary=https://bun.sh/blog/bun-v1.4.1 primary=https://github.com/whatwg/html/commit/e5071a20c8569d8a3ec02ed27dd01b948773f850 primary=https://github.com/whatwg/html/commit/100b354e67829809ffc7a966b326731b9a2e784e

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 buildexport * 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.0v1.4.1 的 RSS 對照:

應用v1.4.0v1.4.1
Next.js SSR222 MB142 MB
vite dev142 MB111 MB
Express65 MB53 MB

原始來源:Bun v1.4.1 release notes


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 才生效,行為與現有的 commentsdataAttributes 兩個欄位一致。規格本身尚未綁定特定瀏覽器版本,實作端須待 Firefox、Chrome 後續更新才會反映這個新欄位。

原始來源:whatwg/html commit e5071a2


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 屬性寫的值而非圖片檔案本身的解析度,若程式碼曾假設兩者永遠一致,需要重新檢查。

原始來源:whatwg/html commit 100b354


End of article
0
Would love your thoughts, please comment.x
()
x