Cruller: 一個專注於生產環境的 Bun 執行時期,移植至 Zig 0.16

Cruller: 一個專注於生產環境的 Bun 執行時期,移植至 Zig 0.16

Cruller 通過剝離 Bun 的開發工具,提供一個最小化、可直接用於生產環境的 JavaScript 執行時期。

Cruller 是 Bun 最後以 Zig 為基礎的版本的專門分支。與完整的 Bun 執行時期不同,後者包含套件管理器、打包器和測試運行器,Cruller 已被縮減為運行預先構建的生產 JavaScript 伺服器所需的基本組件。它已經移植至純粹的 Zig 0.16,提供更精簡的建置流程和更小的二進位檔案大小。

核心功能與保留的組件

Cruller 保留了 Bun 執行時期的高效能核心,同時移除了以開發為導向的子系統。以下組件被保留:

  • JavaScriptCore:執行 JavaScript 的底層引擎。
  • Web APIs:支援 Bun.servefetch、串流、BlobRequestResponse
  • Networking:支援 HTTP/1、HTTP/2 和 HTTP/3,包括 WebSockets。
  • Infrastructure:靜態服務以及用於預先構建 JavaScript 的模組解析器。

為了達到最小的佔用空間,Cruller 移除了套件管理器、打包器/轉譯器、殼層、測試運行器、N-API、SQL 客戶端和歸檔支援。

技術實作與 Zig 0.16 移植

移植至 Zig 0.16 需要將執行時期與 Bun 原始的經過修補的 Zig 建置整合分離。主要的技術改進包括:

  • Vanilla Zig Build Graph:該項目現在使用標準的 Zig 0.16 建置系統。
  • Compatibility Shims:維護者為在 Zig 0.15 與 Zig 0.16 之間變更的 API 實作了相容性鉤墊。
  • Portable Release Builds:添加了一個生成的程式碼嵌入模組,使得發布建置在運行時不需要從建置目錄載入生成的 JavaScript。

效能與二進位檔案大小

在 Linux x64 上的測量顯示,Cruller 的二進位檔案大小顯著小於官方 Bun 1.3.14 二進位檔案:

指標 Cruller (ReleaseFast 已剝離) 官方 Bun 減少
二進位檔案大小 73.0 MiB 88.5 MiB ~18%

就效能而言,V8 Crypto 純 JS 基準測試顯示與官方 Bun 執行時期的效能相當,Cruller 的中位數約高出 2%,作者將此歸因於正常的運行間差異。

未來路線圖

維護者打算將 Cruller 用作生產執行時期,而完整的 Bun 執行時期則用於開發。計畫中的增強功能包括:

  • Enhanced Networking:加強 HTTP/2 和 HTTP/3 的支援。
  • Native Extensions:添加原生 ZMQ 外掛。
  • Memory Management:透過獨立的 QuickJS 基礎控制平面實作動態記憶體控制器,以支援複雜的記憶體政策。
  • Embeddability:將引擎打包為動態函式庫,並提供乾淨的 .zig 介面,以便將其嵌入其他 Zig 應用程式。

社群討論與批評

該項目在開發者社群中引發了對精簡執行時期可行性的各種觀點:

"我不認為我會那樣顯著地將我的開發執行時期與生產執行時期分離。在生產環境中才會顯現的行為機會對我來說太高了。

其他批評者質疑 fork 一些人聲稱包含「不良 Zig 實踐」的程式碼基礎的價值,而一些使用者則擔心在 fork 中修剪原始 git 歷史,這移除了原始提交作者的歸屬。

Sources