Bun 官方棄用 Zig,改用 Rust 重寫整個執行環境
Bun Blog · 2026-07-08
JavaScript 執行環境 Bun 官方在 2026 年 7 月 8 日發布部落格,證實團隊已將整個程式碼庫從 Zig 重寫成 Rust,新架構將自 v1.4.0 起正式取代原本以 Zig 撰寫的版本。v1.3.14 是最後一個 Zig 版本,目前 Rust 版本已在 canary 通道釋出。這是 Bun 自 2023 年推出以來最大規模的底層架構變更。
背景
Bun 原本以 Zig 撰寫,但 Zig 手動管理記憶體的模式與 JavaScript 引擎 JavaScriptCore 的垃圾回收機制混用,長期造成 use-after-free、double-free、錯誤路徑記憶體洩漏與堆積損毀等問題。官方部落格列出光是 v1.3.14 就修復了 13 個此類記憶體錯誤。記憶體安全性因此成為團隊決定換語言的主要理由,Rust 編譯器強制的所有權檢查與 Drop trait 的 RAII 模式,可以在編譯期消除整類此前反覆出現的錯誤。
核心改動
團隊採取的是「機械式移植」:Rust 程式碼刻意貼近原本 Zig 的架構寫法,先求行為一致,更道地的 Rust 慣用寫法留待 v1.4 之後再逐步重構。移植過程中團隊建立了 LIFETIMES.tsv 與 PORTING.md 兩份文件,對照 Zig 語法模式該如何轉換成 Rust 的生命週期標註。原始碼從單一龐大結構拆分成約 100 個 crate 以縮短編譯時間,並透過 PR #30224 把 src/ 目錄依功能領域重新分類,涉及 2,039 個檔案的搬移,目的是消除模組間的循環依賴。
整個重寫工程壓縮在 11 天內完成(2026 年 5 月 3 日至 14 日),共產生 6,502 次 commit,尖峰時段每分鐘 58 次 commit、每分鐘寫出約 1,300 行程式碼,單一小時內甚至衝到 695 次 commit。團隊大量倚賴 Claude(部落格中稱為「Claude Fable 5」預覽版)進行程式碼生成:分成 Phase A 產出移植指南與生命週期分析、trial run 用 3 個檔案驗證流程,再到 Phase B–D 以 4 個 worktree、每組 16 個 Claude 實例(共 64 個)平行生成程式碼。
為了抓出 AI 生成程式碼中的錯誤,團隊設計了對抗式審查流程:負責實作的 Claude 握有原始 Zig 程式碼與移植指南,而兩個審查用的 Claude 只拿得到程式碼差異(diff),並被要求預設程式碼有問題去挑錯,最後由另一個 Claude 依審查意見修正。這套流程抓出的實際錯誤包括 libuv 非同步 close() callback 的 use-after-free、負數奈秒值誤用 trunc() 而非 floor(),以及 unwrap_or() 因為提早求值而導致 panic 等問題。
影響範圍
最終產出約 100 萬行新程式碼、跨平台約 4,175 個測試檔、逾 130 萬個 expect() 斷言全數維持通過,沒有任何測試被刪除或跳過。執行檔體積也隨之縮小:Windows 版從 94 MB 降到 76 MB(減少 19%),Linux 版從 88 MB 降到 70 MB(減少 20%)。
| 項目 | v1.3.14(Zig) | v1.4.0(Rust) | 變化 |
|---|---|---|---|
| Bun.serve 吞吐量 | 169.6k req/s | 177.7k req/s | +4.8% |
| node:http 吞吐量 | 103.8k req/s | 108.5k req/s | +4.5% |
| next build | 13.62 s | 13.03 s | +4.5% |
| Bun.build() 2,000 次迭代記憶體 | 6,745 MB | 609 MB | 大幅降低 |
官方也公布了 19 個在重寫過程中被引入、後續修復的迴歸問題,例如 debug_assert! 巨集內含副作用邏輯導致 release build 下 HMR 失效(#30678),以及 bytemuck::cast_slice 在奇數長度切片上直接 panic、需改用 &buf[..buf.len() & !1] 修正(#31188)。目前已上線的 128 個修復項目,都是曾在 Zig 版本重現過的既有 bug。
正式落地案例方面,資料庫工具 Prisma 的 Prisma Compute 已在 Rust 版 Bun 上開放公測,官方指出先前困擾團隊的記憶體洩漏與虛擬機暫停後連線池無法恢復的問題已獲解決。Anthropic 的 Claude Code 從 v2.1.181 起也改用 Rust 版 Bun,啟動時間中位數從 517ms 降到 464ms,提升約 10%。團隊另外投入 11 輪安全審查與 24 小時不間斷的覆蓋率導向模糊測試(fuzzing),鎖定 JavaScript、TypeScript、CSS、YAML 等各種剖析器,目前已透過超過 1,000 億次模糊測試執行找出 15 個問題。
TypeScript 7.0 正式登場:Go 原生編譯器讓建置速度暴增近 12 倍
TypeScript 官方部落格 · 2026-07-08
微軟 TypeScript 團隊在 2026 年 7 月 8 日正式發布 TypeScript 7.0,這是一次把整個編譯器從 JavaScript 改寫成 Go 語言的原生重寫,官方部落格直接稱其為「10 倍速的 TypeScript 原生版」。此前原生移植計畫公告已預告方向,7.0 是這個計畫的第一個正式穩定版。
核心改動
新編譯器以 Go 撰寫,得以善用多執行緒與現代硬體,官方也把 Parcel 的檔案監控工具移植到 Go 上,重建了 --watch 模式。語言伺服器協定(LSP)實作方面,相較 TypeScript 6.0,失敗指令減少 80%、當機次數減少 60%。團隊也新增了 --checkers、--builders、--singleThreaded 等實驗性參數,讓開發者可以手動調整平行化策略。
JavaScript 檔案的分析邏輯也被整個重做,目標是讓 .js 檔案中的 TypeScript 特性行為與 .ts 檔案一致,因此移除了 @enum、@class 等 JSDoc 特殊處理與 Closure 風格語法。官方 CHANGES.md 記錄了更細節的相容性變動,例如 undefined、unknown、any 型別的參數即使關閉 strict 也不能省略,且 @overload 標籤不再支援箭頭函式或函式表達式。
規格細節
樣板字面值(template literal)的 Unicode 處理方式也改變了:過去像 "😀abc" 這種含有 emoji 的字串,會依照 UTF-16 code unit 切開、產生不成對的代理對(surrogate),新版則會把完整的 code point 視為單一單位,切出 ["😀", "abc"]。編譯器預設值方面也有一次性大調整:
strict模式預設開啟module預設為esnexttarget預設對齊目前穩定版 ECMAScripttypes預設為[](原本是["*"])stableTypeOrdering強制開啟,無法關閉
多項舊選項直接被移除並在編譯期噴出硬錯誤,包括 target: es5、moduleResolution 的 node/node10/classic 模式、amd/umd/systemjs/none 模組格式,以及 baseUrl 設定。esModuleInterop 與 allowSyntheticDefaultImports 也不能再設為 false。想在 7.0 之外並存舊版可安裝 @typescript/typescript6 相容套件:
{
"devDependencies": {
"@typescript/native": "npm:typescript@^7.0.2",
"typescript": "npm:@typescript/typescript6@^6.0.2"
}
}影響範圍
官方公布的建置時間對照,顯示大型專案的加速幅度相當可觀:
| 專案 | TS 6 | TS 7 | 倍數 |
|---|---|---|---|
| VSCode | 125.7s | 10.6s | 11.9x |
| Sentry | 139.8s | 15.7s | 8.9x |
| Bluesky | 24.3s | 2.8s | 8.7x |
| Playwright | 12.8s | 1.47s | 8.7x |
加上 --checkers 8 參數後,VSCode 專案的加速倍數可再拉高到 16.7 倍,Sentry 則到 11.6 倍,記憶體用量也普遍下降 6% 到 26%。VSCode 專案中編輯器顯示錯誤的等待時間,則從 17.5 秒縮短到 1.3 秒以內。真實團隊的採用成果也一併公開:Slack 表示合併佇列等待時間減少 40%,CI 型別檢查時間從 7.5 分鐘降到 1.25 分鐘;Vanta 在主要專案上取得 9 倍加速;Microsoft News Services 表示每月省下 400 小時的 CI 建置時間;Canva 則把初次顯示錯誤的時間從 58 秒縮短到 4.8 秒。
編輯器支援上,VS Code 目前已有專屬擴充套件可以搶先使用,Visual Studio 會自動啟用 TypeScript 7;其餘支援 LSP 的編輯器同樣可以接上。但 Vue、Astro、Svelte、MDX 與 Angular 樣板因為還沒有穩定的程式化 API 可以串接,暫時無法使用 TypeScript 7,官方建議團隊可以讓 CLI 建置流程先切到 7.0,編輯器端則暫時維持 6.0。
原始來源:TypeScript Blog: Announcing TypeScript 7.0、typescript-go CHANGES.md
Node.js 26.5.0 釋出:新增 blob.textStream()、TLS 安全修補與多項效能優化
Node.js 官方部落格 · 2026-07-08
Node.js 團隊在 2026 年 7 月 8 日發布 Current 通道的 v26.5.0,由 Richard Lau 擔任本次發版負責人。這個版本納入多項 semver-minor 新功能、一批 TLS/加密相關的安全性修補,以及串流與 HTTP 模組的效能調整。
核心改動
本次最受關注的新 API 是 blob.textStream(),透過 PR #64036 合併進 buffer 模組,功能是回傳一個會把 Blob 內容以 UTF-8 解碼成文字串流的 ReadableStream,等同於把 blob.stream() 接上 TextDecoderStream,實作對齊 W3C FileAPI 規格與既有的 undici 專案。其他新增的 semver-minor 功能包括:
--experimental-import-text:讓 ESM 可以直接 import 文字檔(#62300)perf_hooks新增每個事件迴圈迭代的取樣延遲量測(#62935)- 公開
ReadableStreamTeeAPI,方便組合串流(#64195) - TLS 連線可回報協商後採用的金鑰交換群組(#64119)
ESM 方面也做了幾項補強,包括預設開放 addon 使用 import、改善非同步模組必要條件的錯誤訊息,以及針對頂層 await 提供更清楚的錯誤診斷。串流模組則修正了非同步迭代下半開(half-open)雙工串流被提早關閉的問題,並針對 WHATWG 串流做了每個 chunk 的額外負擔優化。
影響範圍
安全性修補集中在 TLS 與加密模組:新版會在驗證階段拒絕小階(small-order)EdDSA 點,修正大型 Diffie-Hellman generator 的驗證邏輯,並處理 X.509 憑證中過大的 RSA 指數(exponent)。HTTP 模組則修正了透過代理伺服器使用 CONNECT 方法時預設 Host 標頭的處理方式,以及 cork/uncork 搭配使用時 drain 事件未正確觸發的問題。
效能面的調整包括重複使用 setStreamTimeout 中的 Timeout 物件、REPL 延遲載入 acorn 並延後建立 VM context,以及 TextEncoder.encode 避免多餘的來源字串複製。相依套件也一併更新:undici 升級到 8.7.0、nghttp3 升級到 1.17.0、sqlite 升級到 3.53.3,V8 引擎也回合併了多項上游修補。
另一項治理層面的變動是新增了發版簽署金鑰:Stewart X Addison(@sxa)正式加入 Node.js 發版團隊,未來版本可能會改用他的金鑰(指紋 655F3B5C1FB3FA8D1A0CA6BDE4A7D232B936D2FD)簽署,使用自動化流程驗證發版版本的團隊需要留意匯入這把新金鑰。虛擬檔案系統(VFS)這次也修了幾個邊角案例,包括拒絕把目錄改名搬進自己的子目錄,以及避免遞迴 readdir 時因符號連結成環而卡死。
原始來源:Node.js Blog: Node.js v26.5.0 (Current)、GitHub PR #64036