Cruller: 一个专注于生产环境、移植到 Zig 0.16 的 Bun 运行时

Cruller: 一个专注于生产环境、移植到 Zig 0.16 的 Bun 运行时

Cruller 通过剥离 Bun 的开发工具,提供了一个极简且生产就绪的 JavaScript 运行时

Cruller 是 Bun 基于 Zig 的最后一个发行版的专门分支。与包含包管理器、打包器和测试运行器的完整 Bun 运行时不同,Cruller 被精简为运行预构建生产级 JavaScript 服务器所需的必要组件。它已被移植到原生 Zig 0.16,提供了更精简的构建流程和更小的二进制文件体积。

核心特性与保留组件

Cruller 保留了 Bun 运行时的高性能核心,同时移除了面向开发的子系统。保留了以下组件:

  • JavaScriptCore: 用于执行 JavaScript 的底层引擎。
  • Web APIs: 支持 Bun.servefetch、streams、BlobRequestResponse
  • 网络: 支持 HTTP/1、HTTP/2 和 HTTP/3,包括 WebSockets。
  • 基础设施: 静态资源服务以及用于预构建 JavaScript 的模块解析器。

为了实现极小的占用,Cruller 移除了包管理器、打包器/转译器、shell、测试运行器、N-API、SQL 客户端以及压缩包支持。

技术实现与 Zig 0.16 移植

向 Zig 0.16 的移植涉及将运行时从 Bun 原有的补丁版 Zig 构建集成中分离出来。关键的技术改进包括:

  • 原生 Zig 构建图: 该项目现在使用标准的 Zig 0.16 构建系统。
  • 兼容性垫片 (Shims): 维护者为在 Zig 0.15 和 0.16 之间发生变化的 API 实现了垫片。
  • 可移植的发布构建: 添加了一个生成的代码嵌入模块,使得发布版本在运行时无需从构建目录加载生成的 JavaScript。

性能与二进制大小

在 Linux x64 上的测量结果显示,Cruller 的体积明显小于官方的 Bun 1.3.14 二进制文件:

指标 Cruller (ReleaseFast stripped) 官方 Bun 缩减幅度
二进制大小 73.0 MiB 88.5 MiB ~18%

在性能方面,一项 V8 Crypto 纯 JS 基准测试显示其性能与官方 Bun 运行时相当,Cruller 的中位数高出约 2%,作者认为这是正常的运行波动。

未来路线图

维护者打算将 Cruller 用作生产运行时,而将完整的 Bun 运行时用于开发。计划中的增强功能包括:

  • 增强网络功能: 加强 HTTP/2 和 HTTP/3 的支持。
  • 原生扩展: 添加原生的 ZMQ 插件。
  • 内存管理: 通过一个独立的、基于 QuickJS 的控制平面实现动态内存控制器,以处理复杂的内存策略。
  • 可嵌入性: 将引擎打包为具有简洁 .zig 接口的动态库,以便将其嵌入到其他 Zig 应用程序中。

社区讨论与批评

该项目在开发者社区中引发了关于精简版运行时可行性的各种观点:

"我不认为我会让我的开发运行时与生产运行时产生如此大的差异。对于我来说,这种只在生产环境中才会出现的行为风险太高了。"

其他批评者质疑分叉一个被某些人声称包含“糟糕的 Zig 实践”的代码库的价值,而一些用户对该分支中删除了原始 git 历史(这移除了原始提交者的署名)表示担忧。

Sources