前端前線 2026 年 5 月 15 日

2026-05-15 — Bun Rust 移植合併、Firefox/Safari 大站特例、Chrome install 元素

primary=https://github.com/oven-sh/bun primary=https://denodell.com/blog/browsers-treat-big-sites-differently primary=https://developer.chrome.com/blog/install-element-ot

Bun Rust 移植主線合併:99.8% Node.js 相容性,架構全面換血

github.com/oven-sh · 2026-05-15

Bun JavaScript 執行環境的 Rust 移植分支(Phase A)已於 2026-05-15 合併進主線,這是自 Bun 以 Zig 語言起家以來最大規模的架構變動。移植後的二進位在 Node.js 相容性測試套件上達到 99.8%,並徹底移除對原生 Node.js 二進位的任何動態依賴。在 HN 與 Lobsters 上雙雙登上前三,吸引近千則討論。

移植背景

Zig 是 Bun 的初始實作語言,賦予其直接操作 LLVM 工具鏈的能力,但也帶來生態整合上的挑戰——Rust 擁有更成熟的 crate 生態、更廣泛的社群貢獻者基礎,以及更完整的非同步框架(Tokio)。Phase A 移植計畫的目標並非重寫邏輯,而是在保持行為不變的前提下替換底層語言,從而降低長期維護成本。

核心改動

Phase A 移植涵蓋多個關鍵子系統。HTTP/WebSocket 伺服器層改用 Rust 的 hyper crate 重新實作,取代原先以 Zig 手寫的 uWebSockets 綁定。子程序管理(Bun.spawnnode:child_process)改由 Tokio 的非同步執行緒池驅動,消除了 Zig 事件迴圈與 JavaScriptCore 互動的邊界問題。

檔案系統 API(node:fsBun.file)底層改用 tokio::fs,並保留了 Zig 版的零複製傳輸路徑。整個移植過程刻意避免修改 JavaScriptCore 綁定層,確保現有插件與 V8 相容模式行為不受影響。

影響範圍

剩餘 0.2% 的失敗案例主要集中在 node:vm 模組邊界行為,以及少數依賴 V8 特定記憶體佈局的測試——這些在原先的 Zig 版本中同樣失敗,並非移植退步。對使用 bun buildbun testbun install 的開發者,本次合併在行為層面是透明的。受影響較大的是嵌入 Bun 作為函式庫的場景,因部分 C ABI 導出函數簽章有所調整。冷啟動時間在 macOS ARM64 上從約 12ms 降至 9ms,推測是 Tokio 執行緒池初始化策略不同所致。

原始來源:github.com/oven-sh/bun


Firefox 與 Safari 內建「大站特例」程式碼:瀏覽器單一文化的隱形代價

denodell.com · 2026-05-15

一篇在 Lobsters 引發廣泛討論的文章揭示,Firefox 和 Safari 在引擎原始碼中內嵌了針對特定高流量網站的域名判斷邏輯——字面意義的 if (site == "tiktok.com") { ... }這些特例修補(quirks/interventions)長期以來被視為技術債,但實際上已成為維持多瀏覽器生態存活的必要機制,折射出 Chrome 市場主導地位帶來的深層問題。

具體機制

Firefox 提供 about:compat 內部頁面,列出所有已啟用的相容性干預措施,包括向 TikTok 注入自訂 CSS、為 Netflix 偽裝 User-Agent 字串、對部分影音平台注入 JavaScript polyfill 以繞過對 Chrome 的硬性要求。

Safari 的對應邏輯集中在 WebKit 的 Quirks.cpp,包含數百條域名檢查。具體案例:Facebook、X、Reddit 獲得客製化 Picture-in-Picture 修正;Amazon 商品頁獲得觸控轉滑鼠事件處理(修復商品縮放);Instagram Reels 和 Twitch 各有針對性渲染修補。

成因與影響

Chrome 桌面市佔率長期維持 80% 以上,導致許多網站工程師僅在 Chrome 上測試。當這些網站在 Firefox 或 Safari 上出現異常,Firefox 和 Safari 工程師被迫在引擎層面加入補丁。更深層的問題是部分網站主動拒絕非 Chrome 請求,導致兩個瀏覽器在特定域名下偽裝成 Chrome 回應。文章作者將此類比為 Internet Explorer 時代的「IE Only」設計——方向相反但結果同樣是單一引擎主導標準制定,Web 標準的多元化在實作層面已名存實亡。

原始來源:denodell.com


Chrome 148 引入 <install> HTML 元素:PWA 安裝標準化

developer.chrome.com · 2026-05-12

Chrome 與 Edge 148 版本開始提供 <install> HTML 元素的原始試驗(Origin Trial),允許開發者用一行 HTML 在頁面上嵌入瀏覽器原生控制的 PWA 安裝按鈕,無需 JavaScript 事件監聽。元素外觀、文字、語言全由瀏覽器控制,類似 <input type="file"> 的受信任 UI 設計模式,有效避免釣魚式安裝誘導。

規格細節

元素支援兩種情境:安裝當前頁面所屬 PWA(需要 Web App Manifest 含 id 欄位),以及跨域安裝其他應用程式(透過 installurlmanifestid 屬性指定)。三個事件:promptaction(完成安裝)、promptdismiss(用戶取消)、validationstatuschanged(驗證狀態變更)。功能偵測方式為 'HTMLInstallElement' in window,不支援時可提供 fallback 內容。

跨域安裝使元素成為 Web 應用程式目錄的基礎元件——一個網站可以列出並安裝其他域名的 PWA,安裝確認由瀏覽器原生 UI 處理,無需操作 beforeinstallprompt 事件。Origin Trial 開放至 Chrome 153;OT 期外可透過 about://flags/#web-app-install-element 手動啟用。Firefox 和 Safari 尚未表態是否跟進,該功能目前屬於 Chromium 平台特有提案。

原始來源:developer.chrome.com


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