iT邦幫忙

2026 iThome 鐵人賽

DAY 30
0

day30_title

前言

終於來到系列文的最後一天。這篇文章想做兩件事:
第一,帶大家實際鑽進 oven-sh/bun 的原始碼庫,
看看這個「號稱最快的 JavaScript 執行環境」在架構上到底是怎麼組織的;
第二,回顧這 30 天寫下來的一些心得,以及整理值得繼續深挖的參考資源。
當然我不大可能帶大家把整個源碼在這一章節讀完,
所以這篇主要是以組織還有導讀方向為主

一、Repo 頂層結構導覽

打開 oven-sh/bun 的 repo,頂層大致長這樣(節錄重點目錄):

bun/
├── src/            # 核心原始碼(含 Rust 呼叫進入點與尚未遷移的部分)
├── packages/        # Cargo workspace 內的 Rust crates + npm 相關套件
├── docs/            # 官方文件原始 Markdown
├── test/            # 龐大的測試套件(含 Node.js 相容性測試)
├── bench/           # 效能基準測試
├── patches/         # 對第三方依賴(如 WebKit)的 patch
├── scripts/         # 建置與開發腳本
├── completions/     # Shell 自動完成腳本
├── Cargo.toml        # Rust workspace 進入點
├── Cargo.lock
├── CLAUDE.md         # 給 AI coding agent 看的專案說明(很值得一讀!)
└── AGENTS.md

二、核心架構:以 Rust 為主力的多語言分工

根據 DeepWiki 上針對 Bun 專案整理的架構文件,Bun 目前的核心邏輯以 Rust 為主力,並搭配其他語言各司其職:

  • Rust:整個 repo 是一個包含約 200 個 crates 的 Cargo workspace(根目錄的 Cargo.toml),
    承擔了絕大部分的核心邏輯——事件迴圈、模組解析、bundler、package manager 等主要模組都在這裡
    要理解 Bun 目前怎麼運作,Cargo workspace 是最該優先掌握的部分。

  • Zig:仍保留在部分執行期(runtime)邏輯中,
    這是 Bun 從一開始就採用的語言,
    原因是它能直接呼叫 C ABI、沒有隱藏的執行期開銷,
    很適合寫底層系統程式,目前與 Rust 部分並存。

  • **C++**專門處理與 JavaScriptCore(JSC) 的綁定層 :
    Bun 選擇 JSC 而不是 V8 作為底層 JS 引擎,是它與 Node.js(V8)、Deno(V8)最大的技術差異之一,
    這也是為什麼啟動速度和記憶體佔用會有明顯落差。

  • TypeScript / JavaScript:用來實作內建模組,
    例如 node:fsnode:http 等 Node.js 相容層的部分邏輯,以及部分建置腳本。

Bun 甚至維護了自己 fork 過的 WebKit(oven-sh/webkit
因為他們對 JSC 做了客製化 patch,
這也解釋了為什麼從源碼編譯 Bun 需要先編譯 JavaScriptCore、再編譯 C++ binding、最後才連結出 bun 執行檔——這個流程在 LICENSE.md 和 contributing 文件中都有提到。

四大核心功能對應的模組

Bun 官方定位自己是「all-in-one toolkit」,核心賣點是四合一:

  1. Runtime(JS/TS 執行環境,取代 Node.js)
  2. Bundler(取代 esbuild / webpack)
  3. Test runner(取代 Jest / Vitest)
  4. Package manager(取代 npm / yarn / pnpm)

這四塊功能在源碼中大致對應到(依 DeepWiki 整理的分區):

  • Core JavaScript Runtime:Global Object 與 JSC 整合、事件迴圈與非同步操作、模組解析系統、記憶體管理與 GC
  • JavaScript Toolchain:Lexer / Parser、AST 結構與轉換、Bundler 架構、程式碼生成與輸出、JSX/TypeScript 支援、Standalone 編譯、CSS Parser 與 Bundler、Bake(開發伺服器與 HMR)
  • Package Manager:安裝流程與 lockfile、依賴解析、npm registry 與網路層、workspace / monorepo 支援
  • Networking and I/O:HTTP Server(Bun.serve)、HTTP Client / fetch、WebSocket、子行程管理、Socket 網路層、Streams API

值得一提的是,Bun 的 JS transpiler、CSS lexer、以及 Node.js 模組解析器
其源碼其實是 esbuild(Evan Wallace 的知名專案)的移植版本——這在官方 LICENSE.md
中有明確標注。如果你熟悉 esbuild 的內部設計,讀這部分 Bun 源碼時會有很強的既視感。

三、看源碼建議路徑(給想動手挖的人)

如果你也想像我這樣讀讀源碼,以下是我覺得比較不會迷路的順序:

  1. 先讀 README.md + CLAUDE.md + AGENTS.md:建立整體地圖,不要一頭栽進 src/

  2. Cargo.toml(workspace 根目錄):了解目前有哪些 Rust crate、彼此的依賴關係,
    這是目前最活躍、也最能反映核心邏輯的部分。

  3. 挑一個你熟悉的功能切入,例如:

    • 如果你常用 Bun.serve,就去找 HTTP Server 相關模組
    • 如果你在意套件安裝速度,去看 package manager 的 lockfile 與依賴解析邏輯
    • 如果你對 bundler 好奇,順著 esbuild 的設計概念去對照 Bun 的 bundler 架構
  4. 搭配 DeepWiki 上的 Bun 專案文件:這是一個把整個 repo 建成可搜尋 wiki 的第三方工具,對於快速定位「這個功能大概在哪裡實作」非常有幫助,可以省下不少用 grep 亂找的時間。

  5. 實際跑一次 canary build:官方提供 bun upgrade --canary
    可以直接用到 main 分支最新的建置版本,搭配原始碼一起看,比較容易理解「這段程式碼實際上做了什麼」。

四、心得與觀察

寫到系列最後一篇,想留幾點比較主觀的心得:

寫 30 天文章我個人覺得蠻累的,基本上每個資料還有請教 AI 的部分我都完整在本地以及雲端跑過驗證,
當然也有我個人加料的部分像是 Day25 把我自己所學也加入整合
有時候一度想要放棄,因為希望把文章品質維持其實在平日有工作的狀態下,非常折磨,
何況最近小弟公司的系統要配合更版加上準備日後議程以及 side project 等多重壓力下,
我已經竭盡所能把 bun 的完整系列生了出來

bun tired

五、參考資源整理

給後續想繼續深入的人,這裡整理一份延伸閱讀清單:

最後結語

小弟我在一開始使用 bun 的時候是在 bun beta 版的時候,那時候我嘗試在跑我的前端項目,
後來導入公司,但那時候踩到雷,因為那時候還不夠穩定用 docker 起起來時有爆掉過,一度把打包專案改回 nodejs
直到 1.0 之後才比較穩定,且那時候出了 window 版本

那時候我就有念頭想說可以出個 bun 的系列集,不過有趣的是隨後竟然 bun 與 Anthropic 合體了😂

雖然我也是可以分享一些踩雷過程,但那些都已經在過去式了,在現今 bun 版本如此穩定的狀態下,那可能都是過時的資訊了
所以我再三思考,應該不會分享那些,

在主題的選取上我有一度遇到瓶頸,會猶豫是要講到 bun 的應用還是 bun 的分析,且深淺都要思考,所以盡可能把一個藍圖
弄出來,如果講得太深,反而沒辦法滿足所有人,我盡可能把每個部分由淺入深的提及,在深度的部分仍有保留,但也不至於
新手望塵莫及,但也不至於把文章弄得太淺,讓人認為我在水鐵人賽,所有部分我都盡可能驗證過,隨著深度增加,
我所需要的驗證時間,有成倍加長,不敢說自己文筆很好,但我盡可能讓 bun 每個直得摸的部分都沾過一輪,
如果讀者細心跟著我的步調沾過,應該沒有 bun 會難倒你的

另外,如果有從 day1 一路到現在一定會覺得我是不是少講許多厲害的東西,那是因為我需要考量到文章可讀性,
萬一再往下講,可能太深入,所以最後索性留下一點懸念,畢竟有些東西是有興趣的人也可以通曉,我僅留下來引路即可

也謝謝讀者耐心看完我 30 天的 bun 主題

last


上一篇
多核心壓榨:Bun Worker 與 reusePort 叢集化,把剩下的 CPU 吃乾抹淨
系列文
不只是快 —— Bun 30 天:從底層架構、全套工具鏈到生產部署30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言