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.serve、fetch、streams、Blob、Request和Response。 - 网络: 支持 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 历史(这移除了原始提交者的署名)表示担忧。