用 TypeScript 构建超快、超小、跨平台桌面应用的框架,Bun + 原生绑定(Objective-C/C++/Zig),MIT 协议,12.5k stars。定位是 Electron 的轻量替代方案。

核心特性

  • Bun 驱动主进程:主进程(Bun process)和 webview 的 TS 代码都用 Bun 打包执行,无需 Node
  • 原生系统 webview:默认用系统自带 webview(macOS WebKit / Windows WebView2 / Linux webkit2gtk),也支持 bundleCEF 打包固定版本 Chromium 换取一致性。这是构建配置里的一个选项(如 config.build.linux.bundleCEF),不是独立项目,可随时切换 CEF 版本;未来 Ladybird/Servo 成熟后会作为可替换引擎
  • 超小体积:自解压 bundle 用 ZSTD 压缩,最小约 14MB(多数体积来自 Bun 运行时);增量更新用 Zig 优化的 BSDIFF,补丁可小至 4KB
  • WebGPU 支持:bundleWGPU 让 TS 直接控制原生 GPU surface,无需经过 webview;提供 Three.js/Babylon.js 适配器
  • 类型化 RPC:主进程与 webview 之间隔离,通过类型化 RPC 通信
  • 平台支持:macOS 14+/Windows 11+/Ubuntu 22.04+ 官方支持,其他 Linux 发行版社区支持

CLI 命令

安装后 electrobun 命令出现在 node_modules/.bin,通常经 bunx/npx 调用。

electrobun init

初始化新项目,交互式或直接指定模板:

bunx electrobun init                    # 交互式选择模板
bunx electrobun init photo-booth        # 直接指定模板

内置模板:hello-world、photo-booth、interactive-playground、multitab-browser。

electrobun build [options]

按 electrobun.config.ts 构建应用,始终只构建当前主机的平台/架构(多平台分发需在各平台 CI runner 上分别跑)。

选项说明取值默认
--env构建环境dev | canary | stabledev
electrobun build                  # dev 构建(当前平台)
electrobun build --env=canary     # 预发布构建,生成分发产物和更新清单
electrobun build --env=stable     # 生产构建,签名+notarization+压缩优化

electrobun run

直接启动已构建好的 dev bundle,不重新构建,用于只想重新拉起应用的场景。

electrobun dev [options]

日常开发主命令,等价于 electrobun build --env=dev 接 electrobun run。

选项说明
--watch监听源文件变化,自动重新构建并重启应用
electrobun dev            # 构建 + 启动(dev 模式)
electrobun dev --watch    # 构建 + 启动 + 监听变更

--watch 监听范围:build.bun.entrypoint 所在目录、每个 view 的 entrypoint 目录、build.copy 来源路径、build.watch 中额外声明的路径。检测到变更后杀掉运行中的应用、重新构建(含 postBuild 等生命周期钩子)、再重启;构建期间暂停监听避免误触发;300ms 防抖;构建失败只记录日志,监听继续。

三种构建环境对比

环境用途特征
dev本地开发日志/错误输出到终端,无签名,产物在 build/ 目录,无分发产物
canary预发布/beta可选签名+notarization,生成分发产物和自动更新清单
stable生产发布完整签名+notarization(如已配置),优化压缩产物,生成全部更新文件

典型 package.json 脚本

{
  "scripts": {
    "start": "electrobun run",
    "dev": "electrobun dev",
    "dev:watch": "electrobun dev --watch",
    "build:canary": "electrobun build --env=canary",
    "build:stable": "electrobun build --env=stable"
  }
}

多平台分发时,同一套 build:* 脚本在各平台的 CI runner 上分别执行即可,无需跨平台交叉编译。

配置文件 electrobun.config.ts

TypeScript 编写,ESM 语法,类型安全:

import type { ElectrobunConfig } from "electrobun";
 
export default {
  app: {
    name: "MyApp",
    identifier: "com.example.myapp",
    version: "1.0.0",
  },
  runtime: {
    exitOnLastWindowClosed: true,
  },
  build: {
    bun: {
      entrypoint: "src/bun/index.ts",
    },
  },
} satisfies ElectrobunConfig;

build.bun 和 build.views 下每个入口都透传 Bun.build() 的选项(plugins、external、sourcemap、minify、splitting、define、drop、format 等),唯一必填字段是 entrypoint,entrypoints/outdir/target 由 Electrobun 自动管理。

与 Vite 的组合模式

Electrobun 只管桌面壳(主进程 + webview 承载),前端页面本身可以用 Vite 单独跑 dev server 拿 HMR。常见组合(示例来自实际项目 package.json):

{
  "scripts": {
    "start": "vite build && electrobun dev",
    "dev:hmr": "concurrently \"bun run hmr\" \"bun run start\"",
    "hmr": "vite --port 5173"
  }
}

即 Vite 负责前端资源热更新,electrobun dev 负责拉起原生壳加载页面,用 concurrently 把两个进程一起跑起来。细节见 package-json。

与 Electron 的定位差异

维度ElectrobunElectron
运行时BunNode.js
Webview系统原生(可选 CEF)内置 Chromium
典型体积~14MB(系统 webview)通常 100MB+(内置 Chromium)
增量更新BSDIFF 补丁最小 4KB通常整包更新
语言TypeScript-first支持任意 Node 生态
生态成熟度较新(12.5k stars),API 覆盖仍在扩展成熟稳定,插件/工具链极丰富

扩展

相关

  • package-json — Electrobun 项目 package.json 脚本示例解析
  • electrobun-config-ts — Electrobun 的配置文件简介
  • vite — 常与 Electrobun 搭配,负责前端资源构建和 HMR
  • README — Electrobun 的底层运行时
  • electron — Electrobun 对标的重量级前辈框架,生态成熟但体积大