Bunmaska:用 Bun 和 WebKit 替代 Chromium 的 Electron 轻量方案
Electron minus Chromium, powered by Bun and WebKit
Bunmaska 是一个基于 Bun 运行时和 WebKit 的桌面应用框架,用 Electron 风格的 API 实现同样的 BrowserWindow 和 ipcMain,但把浏览器引擎和运行时换掉,应用体积从 Electron 的 150 MB+ 降到约 16-23 MB。
包体积
~16MB
整个应用,而不是你随它一起重新分发的浏览器。几秒内即可下载完成; 更新包只是其中一小部分。
运行于 Bun
毫秒级启动,原生运行 TypeScript——无需转译步骤——JavaScriptCore 让内存保持精简。你熟悉的 Node API,底层却是快得多的运行时。
原生代码,无需构建
从 .ts 文件调用操作系统。没有 node-gyp,没有
electron-rebuild,没有会在别人机器上崩掉的工具链。
WebKit,由你掌控
默认使用系统 WebKit——这就是下载体积小的原因。当需要逐字节一致性时,从引擎商店固定一个精确的、已签名的构建版本。绝不使用 Chromium。
零运行时依赖
没有运行时依赖,没有编译后的原生代码,没有 postinstall 脚本。你的 SBOM 就是“Bun + 你的代码”。
熟悉的开发体验
Electron 风格的 API。
原生实现。
你已经在写的同样的 app、BrowserWindow 和
ipcMain——底层替换了沉重的部分,
而不是让你迁移到新的 API。
3
平台
Windows · macOS · Linux
全部体积
~16-23 MB。没错, 全部就这么多。
Electron 还没做任何事就要 150 MB+。Bunmaska 是你不会注意到的下载量, 也是你听不到它在运行的应用。
一个最小的 Electron 应用 150 MB+
同样的应用,运行于 Bunmaska ~16-23 MB
同样的应用。一个打包了整个浏览器;另一个则没有。
这是 macOS 和 Linux,它们渲染在机器上已有的 WebKit 上—— 无需打包任何东西。Windows 没有系统 WebKit,所以它附带一个从源码构建的 WinCairo 引擎 (更重,并通过引擎商店在应用间共享)。
值得关注的部分
原生模块只是一个 .ts 文件
它 dlopen 操作系统,然后继续自己的生活。没有
node-gyp。没有 N-API。没有
electron-rebuild。没有那种在最关键的机器上失败的
40 分钟编译。
无需重新构建,因为从来就没有需要构建的东西。
pid.ts - macOS, Linux
// pid.ts - a native module. No build step. No bindings.gyp. Just Bun.
import { dlopen, FFIType } from "bun:ffi";
const libc = process.platform === "darwin" ? "libSystem.B.dylib" : "libc.so.6";
const { symbols } = dlopen(libc, {
getpid: { args: [], returns: FFIType.i32 },
});
export const pid = () => symbols.getpid();
Electron 的等价实现从 npm install node-gyp
和一个编译器开始。这个则不需要。
固定你 实际测试过的 WebKit。
默认情况下,应用渲染在机器上已有的 WebKit 上——这正是它们保持小巧的原因。 当需要逐字节一致性时,改为固定一个特定的构建版本。
bunmaska.config.ts
import { defineConfig } from "bunmaska/config";
export default defineConfig({
// Pin the exact WebKit you tested. Shared across apps. No global switch.
engine: { webkit: "webkitgtk-6.0-2.52.4-bunmaska1-linux-x64" },
});- 引擎解析
- 从共享商店解析——下载一次,所有固定它的应用都能使用。
- 按应用版本控制
- 不同的应用可以并排固定不同的版本。没有全局 开关。
- 可用性
- 已签名的安装包今天已内置。源已上线,包含一个 Windows 引擎;托管的 Linux 和稳定通道构建版本是下一步。
三个平台, 没有 chromium 在任何一个上。
三个平台今天都已发布——每个都以纯
bun:ffi 驱动 WebKit。macOS 和 Linux 使用系统引擎;Windows
构建自己的 WinCairo(它不附带 WebKit)——绝不使用 Chromium。目前是 alpha 阶段,
少数 API 因平台而异——我们在
对等页面上精确公布哪些不同。
Windows 稳定通道引擎、Windows ARM64,以及最后几个按平台的差距 记录在 路线图上。
Bunmaska 对比 Electron
同样的形态。 十分之一的重量。
你已经在写的同样的 API,底层替换了两个最沉重的部分—— 浏览器引擎和运行时。
Electron 在十年积累所换来的那些方面依然胜出——Windows-on-ARM、最后约 20% 的 API、按窗口的崩溃隔离,以及庞大的生态系统。我们保留了这些行;完整而诚实的对比在 对比页面上。
开发者体验
三条命令。 无需编译器。
bunmaska init > bunmaska dev > bunmaska build
使用你日常已经在用的同一套工具,创建、运行并打包一个原生桌面应用。
src/main.ts
import { app, BrowserWindow } from "bunmaska";
app.whenReady().then(() => {
const win = new BrowserWindow({ width: 960, height: 720 });
win.loadURL("https://example.com");
});独立可执行文件 无需安装运行时 双击即可启动
一条命令
整个流程就是 bunmaska。
脚手架、开发、打包和引擎管理——一个 CLI,纯 Bun,没有 Xcode 项目,也没有 electron-builder。它永远不会被打包进你的应用里。
终端
# scaffold · develop · ship
bunmaska init my-app # starter: main + preload + renderer + config
bunmaska dev # run with hot reload
bunmaska build # standalone .app / .deb / .exe
bunmaska build --update # + update.json + .tar.zst, a .sig each
# engine management
bunmaska engine list # installed engines, side by side
bunmaska engine which # engine this project resolves to
bunmaska engine install # id, local dir, or signed URL
# sanity check
bunmaska doctor # runtime, store, and resolved engine
大多数时候你都在 init > dev > build 中度过。其余部分在你需要的那天就在那里。完整参考见CLI 文档。
权衡取舍
它还是 alpha。 我们不打算假装 不是。
事情会变。有些东西会坏。我们会告诉你哪些坏了。如果到了 2027 年这里还写着 alpha,就开一个标题为 “你还好吗。” 的 issue。
Windows?
处于 beta(x64)——基于从源码构建的 WinCairo WebKit(绝不是 Chromium),在 CI 上与 macOS 和 Linux 一同显示绿色。那里有几个 API 被引擎阻塞(自定义协议、printToPDF、capturePage);托管版 WinCairo 引擎已在 feed 上,稳定版构建和 ARM64 仍在路线图上。功能对等矩阵对每一个格子都如实标注。
可用于生产环境?
它标着 alpha 是有原因的。把它用在你本来就打算重写的那个东西上吧。
为什么不用 Chromium?
因为它已经在你电脑上了,再塞进去第二个正是我们走到今天这一步的原因。
有什么代价?
覆盖 Electron 约 70-80% 的表面,而且我们发布功能对等矩阵,让你在投入之前就能查清楚。
快速发布。谨慎破坏。公开修复。
同样的 API。不要 Chromium。
用一个周末试试。到周一就讨厌它,或者不讨厌。
来源:Hacker News · bunmaska.org