Electron 替代方案:Tauri、Wails、Neutralinojs、Flutter 和原生
想离开 Electron,最接近的换法是保留 HTML、CSS 和 JavaScript,改用系统自带的 web view,也就是 Tauri、Wails 或 Neutralinojs,想连网页技术栈一起放弃,就是 Flutter、.NET MAUI 或纯原生,如果你只是想让一个网站有独立窗口,根本不需要框架,Pake 这样的封装工具不用写代码就能做到。
为什么有人想离开 Electron
Electron 自己的介绍是用 JavaScript、HTML 和 CSS 构建桌面应用的框架,并说它的做法是把 Chromium 和 Node.js 嵌进自己的二进制里,所以每个 Electron 应用都带着一份自己的浏览器引擎,安装包大就来自这里,引擎更新也要由应用作者来发布。这两种取舍的细节在 Tauri 和 Electron 封装网站的对比里已经讲过,这篇不重复。
空应用的体积不能代表你的应用,公开的对比通常测的是空应用,而安装包大小和运行时内存是两回事,能从厂商自己页面上确认的只有结构上的差别,比如 Tauri 说应用不打包浏览器引擎,最小的应用可以小于 600 KB,这是它对空应用的说法。你的应用内存用得少不少,取决于引擎和页面本身,决定之前请在活动监视器或任务管理器里量自己的构建。
站得住的理由更窄一些,要更小的下载,不想自己发布 Chromium 的安全更新,Electron 的发布时间表每 8 周出一个大版本,只支持最新的三个,一个大版本发出后大约 24 周就出了支持范围,跟不上这个节奏的应用跑的就是没人维护的 Chromium,或者你的应用其实就是个网站,却背着整个浏览器。
各个选项,用厂商自己的话
Tauri。它的入门页说这是为所有主流桌面和移动平台构建小而快的二进制的框架,前端可以是任何能编译成 HTML、JavaScript 和 CSS 的框架,后端可以用 Rust、Swift 和 Kotlin,应用使用用户系统里现成的 web view,由 WRY 负责渲染,对 Electron 团队来说它最像可以直接换的方案,只是 Node.js 后端换成了 Rust。
Wails。它的 README 说后端用标准 Go,把 Go 代码和网页前端包成一个二进制,使用原生渲染引擎,「no embedded browser」,页面没有按名字列出支持的平台,请去它的安装文档里确认你的系统,适合写 Go 的团队。
Neutralinojs。它的文档说它不打包 Chromium,使用操作系统里现成的浏览器库,能在 Linux、Windows、macOS 和网页上运行,可以通过扩展用任意语言来扩展,自称轻量且可移植,和前面几个一样,网页引擎也是系统的。
Flutter。Flutter 桌面页说它能编译原生的 Windows、macOS 或 Linux 桌面应用,多平台页提到原生编译的性能且没有大型浏览器引擎依赖,按它的基础指南,Flutter 使用 Dart 语言。你要用 Dart 重写界面而不是复用网页界面,所以更适合新应用,不适合移植。
.NET MAUI。微软的概览说它用 C# 和 XAML 构建原生移动和桌面应用,覆盖 Android、iOS、macOS 和 Windows,macOS 应用走 Mac Catalyst,Windows 应用用 WinUI 3,列表里没有 Linux,需要在里面放网页内容时,它的 WebView 在 Windows 上用 WebView2,在 Mac Catalyst 上用 WKWebView。
原生。Mac 上用 SwiftUI 或 AppKit,Windows 上用 WinUI,平台行为最完整,工作量也最大,因为每个平台都是一套代码。
对比表
| 语言 | Web view | 平台(按厂商页面) | 适合 | |
|---|---|---|---|---|
| Electron | JavaScript、HTML、CSS | 自带 Chromium | Windows、macOS、Linux | 所有系统同一个引擎 |
| Tauri | 前端用网页技术,后端 Rust、Swift 或 Kotlin | 系统 web view | 主流桌面和移动平台 | 网页界面,二进制小 |
| Wails | Go 加网页前端 | 原生渲染引擎 | README 只写了跨平台,没有列出系统 | 写 Go 的团队 |
| Neutralinojs | 网页前端,扩展可用任意语言 | 系统浏览器库 | Linux、Windows、macOS、网页 | 很小的工具 |
| Flutter | Dart | 编译为原生应用,按其页面没有大型浏览器引擎依赖 | Windows、macOS、Linux | 新界面,不是移植 |
| .NET MAUI | C#、XAML | 原生控件,WebView 可选 | Android、iOS、macOS、Windows | .NET 团队 |
表里没有放成熟度,各家页面没有可比的衡量,发布日期和 star 数又过时很快,决定前请看每个项目最近几个月的发布说明和 issue。
换成系统 web view 要多做什么
离开 Electron 不只是换打包方式,用系统 web view 之后,页面由 Mac 上的 WKWebView、Windows 上的 WebView2 和 Linux 上的 WebKitGTK 来渲染,Tauri 的 webview 参考页就是这么列的,同一份 HTML 在三处表现可能不同,所以每个要发布的系统都要测,包括你的 Linux 用户装的 WebKitGTK 版本,依赖 Chromium 特性或渲染进程里 Node.js 的东西也会失效,换来的是引擎随系统、WebView2 或发行版更新,而不是随你的发布更新。
Pake 用什么,为什么
Pake 基于 Tauri,它包的是一个网址,不是给你一个框架,所以只有当你的「应用」就是现成网站时才是合适的工具。CLI 会复制 Tauri 模板,把选项写进配置,编译后打包成安装程序,过程见 Pake 是怎么工作的,它的 FAQ 说安装包小是因为引擎是系统的,运行时内存由引擎和页面决定,不由 Pake 决定,文档里也没有把引擎换成 Chromium 的设置,如果你需要所有系统上同一个 Chromium,Pake 就不合适,基于 Electron 的封装工具更合适。
pake https://example.com --name Example
把 Nativefier 应用迁到 Pake和 WebCatalog、Unite、Coherence X 与 Pake 的对比讲了和这些框架并列的几个封装工具。
怎么选
已经有一个网页界面的 Electron 应用,先试 Tauri,团队本来写 Go 或想要最小的运行时,再看 Wails 或 Neutralinojs,要做新界面又能离开网页栈,看 Flutter、MAUI 或原生,产品本身就是网站,就封装它,无论哪种,都先在目标系统上给最冒险的那个界面做一个小原型,因为引擎差异在那里最先暴露。
常见问题
Tauri 比 Electron 小吗?
Tauri 说应用不打包浏览器引擎,最小的应用可以小于 600 KB,所以下载更小,内存占用取决于引擎和你的页面,请自己量。
我的 React 或 Vue 代码能保留吗?
Tauri 说任何能编译成 HTML、JavaScript 和 CSS 的前端都行,Wails 和 Neutralinojs 也都承载网页前端,渲染进程里的 Node.js API 不会跟过去。
把网站放进窗口需要框架吗?
不需要,用地址构建应用的封装工具就够了,把网站变成桌面应用列了几种选择。
