Electron 的 5 款轻量级替代方案
比较五款轻量级 Electron 替代方案:tinyjs、Electrobun、Neutralinojs、Perry 和 Wails,了解其渲染方式、开发语言及适用场景。
有五款轻量级 Electron 替代方案值得关注:tinyjs、Electrobun、Neutralinojs 和 Wails 使用操作系统自带的 webview 渲染前端;Perry 则将 TypeScript 编译为原生应用,绘制真正的平台控件,完全不依赖 webview。
你手里有一个运行良好的 React 或 Svelte 前端,可基于它构建的一个小工具,安装包却比旁边安装的大多数应用都要大。
每个 Electron 应用都会打包自己的 Chromium 和 Node.js,因此每次安装都要附带一个完整的浏览器引擎,每个运行中的应用都要为此付出磁盘空间和内存的代价。本文从四个相同的维度对比五款替代方案:渲染方式、后端使用的语言、支持的桌面平台,以及适用人群。
核心要点
- tinyjs、Electrobun、Neutralinojs 和 Wails 使用系统 webview 渲染。Perry 将 TypeScript 编译为原生的 AppKit、Win32 和 GTK4 控件。
- 后端语言在很大程度上决定了你的选择:JavaScript(tinyjs)、TypeScript 或 Zig/Rust/Go/Odin(Electrobun)、任意语言编写的扩展(Neutralinojs)、编译型 TypeScript(Perry),或 Go(Wails)。
- 使用系统 webview 意味着同一套前端需要分别在 WebKit、WebView2 和 WebKitGTK 上进行测试。
- 本文中的所有体积数据均为各项目自行公布,且各项目的测量方式不尽相同。
开发者为什么要寻找 Electron 替代方案?
大多数 Electron 替代方案都不打包 Chromium,而是借用操作系统已自带的 webview,从而让应用体积大幅缩小。代价则是渲染一致性。你的应用在 macOS 上运行于 WebKit,在 Windows 上运行于 WebView2,在 Linux 上运行于 WebKitGTK,因此在一些边界情况下的表现,就和同一个网站分别在 Safari 和 Chrome 中运行时一样存在差异。
有两款知名方案未列入下面的五款之中。Tauri 将系统 webview 与 Rust 后端相结合。Deno Desktop 基于 Deno 运行时构建桌面应用。
下表从渲染引擎、后端语言、桌面平台和公布的体积四个方面对比这五款 Electron 替代方案:
| 工具 | 渲染方式 | 后端语言 | 桌面平台(状态) | 体积(由各项目自行公布) |
|---|---|---|---|---|
| tinyjs | 系统 webview | 运行于 txiki.js 上的 JavaScript | macOS(主要平台)、Windows、Linux | 发布后的应用约 6 MB |
| Electrobun 2.0 | 系统 webview,可选 CEF | TypeScript,或 Zig/Rust/Go/Odin | macOS、Windows、Linux | 原生主进程 1.28 MiB;Cottontail 约 15 MiB |
| Neutralinojs | 系统 webview | 页面端 JS;扩展可使用任意语言 | Linux、Windows、macOS | 未给出数据 |
| Perry | 原生控件 | AOT 编译的 TypeScript | macOS、Windows、Linux | hello world 约 34 KB;使用运行时后为数 MB |
| Wails | 系统 webview | Go | Windows、macOS、Linux(v3.0 稳定版) | 二进制文件约 15 MB |
tinyjs:不开放端口的 JavaScript 后端
tinyjs 在 txiki.js 上运行 JavaScript 后端,并使用平台自带的 webview 显示页面:macOS 上为 WebKit,Windows 上为 WebView2,Linux 上为 WebKitGTK。页面与后端通过 Unix socket(Windows 上为命名管道)通信,因此应用从不开放本地网络端口。
- 后端: txiki.js(QuickJS 加 libuv),可访问文件、进程、socket、FFI 和 SQLite。运行时无需 Node。
- 平台: 该仓库面向 macOS、Windows 和 Linux,项目官网将 macOS 列为主要平台。构建必须在目标发布平台的操作系统上进行。
tinyjs build生成已签名的应用包,tinyjs notarize将其提交给 Apple 进行公证。 - 体积: tinyjs 称发布后的应用约为 6 MB,其中 txiki.js 运行时占 5.6 MB。
tinyjs new myapp --template react-ts
cd myapp
tinyjs dev
tinyjs build
后端导出一个 api 对象,页面通过方法名调用其中的方法:
// src/backend/main.js
export const api = {
greet: async ({ user }) => `Welcome, ${user}`,
};
// in the page
const message = await tiny.api.call('greet', { user });
tinyjs 提醒,Linux 是渲染差异最大的平台。媒体编解码器取决于系统安装了哪些 GStreamer 插件,而且在 WebKitGTK 下 Web Audio 输出可能出现爆音。适用人群: 希望整个应用(包括后端)都使用同一种语言的 JavaScript 开发者。
Electrobun:TypeScript 或编译型主进程
Electrobun 默认使用系统 webview 渲染。其主进程在 Cottontail(或 Bun)上运行 TypeScript,你也可以使用 Zig、Rust、Go 或 Odin 编写主进程。它支持 macOS、Windows 和 Linux。
- 渲染器: 默认使用系统 webview。如果跨平台渲染一致性比下载体积更重要,可以通过 CEF 打包 Chromium。
- 后端: Cottontail,2.0 版本将其介绍为一个基于 JavaScriptCore、使用 Zig 构建的 JavaScript 运行时。
- 体积: Electrobun 公布的 macOS ARM64 上 hello world 压缩下载体积为:使用原生主进程时 1.28 MiB,使用 Cottontail 时约 15 MiB。
- 发布: 内置代码签名、差分更新以及各操作系统的安装程序。该软件包在 npm 上以 MIT 许可证发布。
npx electrobun init
import { BrowserWindow } from "electrobun/main";
new BrowserWindow({
title: "Inventory",
url: "views://mainview/index.html",
frame: { width: 1024, height: 720 },
});
views:// scheme 用于加载项目中打包的视图。如果你使用 Electrobun 的 Hutch CLI,hutch electrobun init 会生成相同的项目脚手架。适用人群: 希望保留 Electron 主进程/渲染进程分离架构、同时大幅缩小包体积的团队。
Neutralinojs:纯页面应用,无通用后端
Neutralinojs 在操作系统 webview 中渲染,没有通用的 JavaScript 后端进程。你的代码运行在页面中,并调用内置的原生 API。其文档确认应用不附带 Chromium,而是依赖操作系统提供的 web view,例如 Linux 上的 WebKitGTK。
- 后端: 页面通过客户端库访问原生层。根据 Neutralinojs GitHub 仓库的说明,原生调用通过 WebSocket 传输,并由内置的静态服务器提供前端文件。对于 API 未覆盖的逻辑,你可以使用任意语言编写扩展,并通过 IPC 与之连接。
- 平台: Linux、Windows、macOS 和 Web。发布页面显示最新版本为 v6.10.0。
适用人群: 需求在内置 API 范围之内(文件访问、执行命令、对话框)的小型工具。
Perry:原生控件,而非 webview
Perry 并不是 webview 封装器。它通过 LLVM 将 TypeScript 提前编译(AOT)为原生可执行文件,绘制真正的平台控件:macOS 上为 AppKit,Windows 上为 Win32,Linux 上为 GTK4。Perry 还支持移动端、手表和电视平台。
- 后端: 没有独立的后端。整个应用都是编译为机器码的 TypeScript,当程序需要时,Perry 运行时会被链接进二进制文件。
- 限制: Perry 编译的是 TypeScript 的一个实用子集,其限制说明页面排除了
eval()及其他动态代码,并注明装饰器仅部分支持。部分 npm 包无法编译。为了兼容 JavaScript npm 包,Perry 提供了可选的 V8 运行时,可通过--enable-js-runtime启用。 - 体积: Perry 的仓库给出的数据是:仅打印常量的 hello world 约 34 KB。一旦程序使用了运行时(循环、JSON、async),体积将达到数 MB,在 macOS arm64 上约为 5.5 MB。
perry doctor
perry check ./src
perry compile main.ts -o myapp
perry doctor 检查编译器、链接器和平台 SDK 是否已安装。perry check 报告无法原生编译的代码。Perry 没有 DOM,因此依赖 DOM 的前端代码无法直接迁移。适用人群: 愿意重写 UI 以获得原生控件的 TypeScript 开发者。
Wails:Go 后端,系统 webview
Wails 将 Go 后端与操作系统 webview 相结合。Go 开发者可以沿用已有的 Web 前端工具链,由各平台自带的 WebView 负责渲染,因此无需打包浏览器引擎。Wails v3.0.0 于 2026 年 10 月 26 日发布。
- 渲染器: Windows 上为 WebView2,macOS 上为 WebKit。自 v3.0.0 起,Linux 默认使用 GTK4 与 WebKitGTK 6.0,旧的 GTK3 技术栈在 v3.1 之前仍可通过
-tags gtk3使用。 - 状态: v3.0 是当前的稳定版本线,v2 仍会接收关键更新。v3 中的 iOS 和 Android 支持仍处于实验阶段,不在稳定性承诺范围内。版本发布频率稳定。
- 体积: Why Wails 页面公布的二进制文件体积约为 15 MB。
go install github.com/wailsapp/wails/v3/cmd/wails3@latest
wails3 setup
适用人群: 后端逻辑已经使用 Go 编写的团队。
应该选择哪款 Electron 替代方案?
选择哪款 Electron 替代方案,首先取决于你希望后端使用哪种语言,其次取决于你能接受多大程度的渲染差异。如果想全程使用 JavaScript,选 tinyjs。如果需要 TypeScript 主进程并可选打包 Chromium,选 Electrobun。如果使用 Go,选 Wails;如果应用只需要内置的原生 API,选 Neutralinojs。如果你想要原生控件而非 Web UI,Perry 是五款中唯一的选择。在最终决定之前,请用你最看好的两款候选方案分别构建一个 hello world,并在每个目标操作系统的 webview 中运行你的真实前端。
常见问题
Windows 用户需要安装 WebView2 才能运行用这些工具构建的应用吗?
通常不需要。所有 Windows 11 设备都预装了 Evergreen WebView2 Runtime,微软也已将其推送到大多数 Windows 10 设备上,自 2023 年 1 月起还包括受管理设备和已加入域的设备。仍有少量 Windows 10 设备未安装该运行时。因此,微软建议即使使用 Evergreen 模式,你的安装程序也应检测该运行时,并在缺失时进行部署。
能否在 Perry 中复用现有的 React 前端?
只能部分复用,且仍属实验性质。Perry 没有 DOM,但独立的 perry-react 项目提供了一个兼容 React 的渲染器。在 package.json 中通过 packageAliases 配置块,将 react 和 react-dom 的导入指向 perry-react,JSX 元素即可映射为原生控件,例如 div 映射为 VStack,button 映射为 Button。该项目自称是第一阶段的概念验证,目前面向 macOS,iOS、Android、GTK4 和 Win32 尚在规划中。在第一阶段,同一组件的多个实例共享 hook 状态,不支持 className 样式(仅支持内联 style 属性),依赖 DOM 或 className 的库(如 MUI 或 React Router)也无法使用。
这些 Electron 替代方案中,哪些还能构建移动应用?
Perry 支持移动端。它可以将同一套 TypeScript 编译到 iOS 和 Android,还支持 watchOS 和电视平台。tinyjs 表示不支持 iOS 或 Android,并将自身定位为桌面运行时。Neutralinojs 列出的平台为 Linux、Windows、macOS 和 Web。Wails v3 提供实验性的 iOS 和 Android 支持,但尚未纳入其稳定性承诺。如果你需要一款同样能在手机上运行的 webview 应用,Tauri 2 在支持桌面端的同时也支持 iOS 和 Android。
Linux 用户需要安装什么才能运行基于系统 webview 的应用?
需要安装 WebKitGTK 库,因为这些工具使用的是系统 webview,而不是自行打包。tinyjs 的示例将 libwebkit2gtk-4.1-0 列为 Linux 上的依赖。Wails v3.0 默认使用 GTK4 与 WebKitGTK 6.0。音视频支持取决于设备上安装了哪些 GStreamer 插件,因此请在计划支持的每个 Linux 发行版上测试媒体播放功能。
Gain Debugging Superpowers
Unleash the power of session replay to reproduce bugs, track slowdowns and uncover frustrations in your app. Get complete visibility into your frontend with OpenReplay — the most advanced open-source session replay tool for developers.
Star on GitHub12k