返回对比

面向 TypeScript 开发者的 Electron 替代方案

Electron 让 Web 开发者也能轻松制作桌面应用,而它在体积和内存上 的代价,也让“Electron alternative”成了一个长盛不衰 的搜索词。如果 TypeScript 是你的语言,2026 年有四条现实的路 径:留在 Electron、转向 Tauri、用 Bun 构建内嵌运行时的二进制 文件,或者用 Perry 编译为原生代码。它们做出的取舍截然不同。

四种方案

Electron——基准方案

每个应用都打包了 Chromium 和 Node.js。好处是十多年的生产 环境成熟度,以及一套你的团队已经熟悉的 UI 技术栈 (HTML/CSS/JS)——VS Code、Slack 和 Discord 都构建在它之 上。坏处是基础成本:hello-world 安装包约为 80–150 MB,多 个 Chromium 进程,空闲时占用数百 MB 内存。仅限桌面端。 完整的 Perry 对比 Electron

Tauri——在系统 webview 中运行 Web UI,后端为 Rust

Tauri 保留了 Web 前端,但去掉了打包的 Chromium:UI 在操作 系统自带的 webview(WKWebView、WebView2、WebKitGTK)中渲 染,因此安装包体积落在个位数 MB 量级。它稳定、文档完善, 且 Tauri 2 增加了对 iOS/Android 的支持。代价是:后端是 Rust,而不是 TypeScript——UI 之外的应用逻辑意味着要写 Rust 并跨越一个 IPC 桥——而且由于每个操作系统自带的 webview 不 同,渲染表现在各平台之间会有细微差异。 完整的 Perry 对比 Tauri

Bun——单文件二进制,没有 GUI 层

搜索“bun electron”的人通常是想要 Electron 的便 利,却不想承担它的体积。 bun build --compile 通过把 Bun 运行时和你打包好的 TypeScript 一起内嵌,产出单 个可执行文件——非常适合 CLI 和服务端场景,由于它本身就是 运行时,因此拥有完整的 npm 兼容性。但这个二进制文件大约在 60 MB(macOS arm64)到 100+ MB(Linux/Windows)之间,代码 依然以 JIT 方式执行,而且 Bun 没有 UI 框架——桌面应用仍然 需要在其上叠加 Electron、Tauri 或某个 webview 库。 完整的 Perry 对比 Bun

Perry——将 TypeScript 编译为原生组件

Perry 把 TypeScript 提前编译为机器码,并通过真正的平台组 件——AppKit、UIKit、GTK4、Win32,以及通过 JNI 实现的 Android——渲染 UI,完全没有 webview,也没有 IPC 桥。UI 和 逻辑用同一种语言,hello world 约 330 KB,典型二进制约 2–5 MB,启动时间约 1 毫秒,十个目标平台涵盖移动端、手表 和 TV。坦诚的提醒:Perry 是 Pre-1.0,它的 UI API 是自成一 体的(声明式,SwiftUI 风格——而非 HTML/CSS),生态相比 Electron 还很年轻。

并排对比

PerryElectronTauriBun (--compile)
语言全程 TypeScriptJS/TS + HTML/CSSJS/TS 前端,Rust 后端TypeScript
UI 方案原生平台组件内置 Chromium系统 webview无(CLI/服务端)
Hello-world 大小~330 KB~80–150 MB~3–10 MB按平台约 60–116 MB
执行方式AOT 机器码JIT(V8)JIT(webview JS 引擎)+ 原生 RustJIT(JavaScriptCore)
空闲时内存占用数十 MB(单一原生进程)数百 MB(多进程 Chromium)低于 Electron(系统 webview)运行时的典型水平
移动 / 手表 / TViOS, iPadOS, Android, watchOS, tvOS不支持iOS, Android (Tauri 2)不支持
成熟度Pre-1.0生产环境十余年稳定(1.x/2.x)稳定

React Native 或 Flutter 呢?

它们在每个讨论 Electron 的话题里都会出现,但它们回答的是不同 的问题。React Native 是移动优先的:你的 JavaScript 运行在 Hermes 引擎中,并通过一座桥驱动原生视图,桌面端支持仅存在于 独立的社区/微软分支中——它并不是 Electron 的直接替代品(Perry 对比 React Native)。Flutter 覆盖桌面和移动端,但意味着要放弃 TypeScript 转投 Dart,而且它是自己绘制组件,而不是使用平台自带的组件。如果留 在 TypeScript 是硬性约束,那么现实可行的桌面端候选仍然是上述 四个选项。

应该选哪一个?

留在 Web 技术栈

如果你的 UI 已经用 React/Vue/Svelte 构建好了,而且今天就 需要经过实战检验的桌面端分发方案,Electron 仍然是风险最 低的选择——代价是体积和内存。如果这个代价让你在意,并且你 愿意用 Rust 写后端,Tauri 能以极小的体积代价给你大部分 Web 技术栈的体验。

抛开 webview

如果你真正想要的是“输入 TypeScript,输出原生应 用”——一种语言、真正的平台组件、小体积二进制文件, 以及用同一份代码覆盖移动端/手表/TV——这正是 Perry 存在的 意义,代价是 Pre-1.0 的成熟度。而如果你只需要一个零兼容 性风险的单文件 CLI 或服务端程序,Bun 的 --compile 就是务 实之选。

亲自体验一下

安装 Perry,从 TypeScript 交付一个原生应用。