先说结论,可能跟你想的不一样
去年底接了个私活,把一个内部用的日志分析小工具从 Electron 迁到 Tauri 2.0。起因特别朴素:运维那边抱怨,200 多台办公机上装这玩意儿,C 盘越占越大,而且每次升级要重新下一遍完整包。迁完之后 electron-builder 打的 NSIS 安装包是 78MB,Tauri 2.0 的 msi 是 4.1MB,降了 95%。我本来挺得意,把截图发到群里,结果一个用户回了一句「怎么感觉打开速度没变」,我当时就有点愣。
这句话把我拽回现实了。我们讨论 Tauri 和 Electron 的时候,翻来覆去比的是安装包体积,但用户每天真正感知的是启动时间和内存占用,这两项 Tauri 并没有赢多少,某些场景甚至是输的。后面我认真测了一轮,测试机是一台 i5-1135G7 / 16GB 的 ThinkPad,Windows 11 23H2,关掉杀软实时扫描。Electron 34 的空窗口(就一个 hello world 页面)冷启动到 window.onload 大约 470~520ms,任务管理器里 4 个进程加起来 115MB 上下,其中 GPU 进程一个人就吃掉 50 多 MB。Tauri 2.0 同一个页面,冷启动 590~650ms——等一下,Tauri 启动居然更慢?对,因为 WebView2 的进程是惰性拉起来的,而且 Rust 侧初始化加上 IPC 握手也要时间。
但真正让我意外的是内存。WebView2 一旦把页面加载完,那一串 msedgewebview2.exe(我数了一下,稳定在 5 到 8 个进程)加起来 90 到 120MB,跟 Electron 是同一个量级。所以我的第一个结论有点反直觉:Tauri 省下来的是磁盘和分发带宽,不是内存。 Windows 上 WebView2 本身就是 Chromium,你没绕开 Blink,也没绕开 V8,只是把这份运行时从你的安装包里挪进了操作系统。macOS 上情况稍微好一点,WKWebView 用的是系统 WebKit,同一个页面大概 60~80MB,但代价是 Safari 那套 JIT 限制和一堆没实现的 API。
(上面这些数字是我自己量的,你那台机器肯定不一样,但量级关系应该差不多,别拿它当基准测试。)
真正的成本在后面:签名、公证、更新
代码签名这件事,凡是 2023 年 6 月之后还做过 Windows 打包的应该都有印象。CA/Browser Forum 要求 OV 和 EV 证书的私钥必须放在硬件 token 或者云 HSM 里,以前 CI 上塞一个 .pfx 加个密码就完事的时代结束了。我见过有团队真的在机房里放了一台常开的 NUC,上面插着 USB token,用脚本远程调签名——听着离谱,但那是当时最省钱的方案。另一条路是 Azure Trusted Signing,Basic 档 9.99 美元一个月,不过它要求你有三年可查的企业实体经营记录,个人开发者直接被挡在门外。没有 EV 证书的后果就是 SmartScreen 弹警告,用户得连点三次「仍要运行」,这个漏斗损失跟框架选哪个毫无关系,但它是桌面开发真正的入场费。
macOS 那边是公证。altool 在 2023 年 11 月正式退役,现在只有 notarytool 一条路。要开 hardened runtime,还要写 entitlements 文件。我踩过一个坑:应用里内嵌了一个网页下载功能,公证之后一跑就闪退,日志里啥也没有,折腾了大半天才发现是缺 com.apple.security.cs.allow-jit。这种知识散落在各种 GitHub issue 和 Stack Overflow 的角落里,文档基本不会写。苹果开发者账号 99 美元一年倒是小事,时间成本才是大头。
自动更新是桌面应用的生死线,但三个框架的成熟度差得很远。Electron 有 electron-updater,配好 electron-builder 的 publish 配置之后,Squirrel.Windows 和 macOS 的 .zip target 都支持差分更新,走 blockmap,我们一个 80MB 的包热更新下载量大概 3~8MB,体验相当好。Tauri 2.0 才把 updater 收进官方插件,之前社区版一堆坑,而且 Windows 上打出来的更新包是整个 msi,没有差分——4MB 的包无所谓,可你要是带了一堆二进制资源或者模型文件,那就难受了。Qt 这边基本得自己写,或者用 QSimpleUpdater,配合 Windows 的 WinSparkle 和 mac 的 Sparkle 各搞一套,光是把两条链路跑通就是两天起步。
还有一个几乎没人提的点:更新失败怎么回滚。 Squirrel 会把旧版本留在 AppData\Local 下面,新版本崩了还能退回去。Tauri 的 updater 默认是就地替换,写坏了只能让用户重装。如果你做的是给非技术用户用的东西,这块得自己加保险,比如先落盘到临时目录、校验哈希、再原子替换。
三端三引擎,这是个隐形成本
Tauri 在不同平台上跑的是完全不同的渲染引擎:Windows 是 WebView2(跟着 Edge 走,现在基本是 Chromium 130 以上),macOS 是 WKWebView,Linux 是 WebKitGTK。这意味着什么?backdrop-filter 在 WebKitGTK 上到 2.44 还有明显的掉帧,position: sticky 在 Safari 内核上一堆祖传 bug,input[type=date] 三个平台长出来的控件完全是三个样子。我们最后把日期选择器直接换成自绘的了,多花三天。
Electron 就简单粗暴:三端跑的都是你打包进去的那个 Chromium,版本你自己锁。行为一致带来的调试效率,很多时候比那 70MB 安装包值钱——除非你的用户真的在弱网环境,或者要拷 U 盘分发,或者要塞进容器镜像。
但反过来讲,Electron 每个应用自带一份 Chromium 和 Node,就意味着每个应用都要跟着 Chromium 的安全更新重新发版。我们那个工具一年发了 6 次,其中 4 次纯粹是升 Electron 大版本为了堵 CVE。Tauri 走系统 WebView,理论上微软帮你打补丁,听起来很美,实际也有坑:Windows 上 WebView2 Runtime 的版本参差不齐,Win10 老机器上可能是半年前的(WebView2 有 Evergreen 和 Fixed Version 两种分发模式),你写在 CSS 里的新特性在用户机器上就是没效果。
我现在怎么选,四条判断标准
折腾完这轮,我把判断条件简化成了四条,基本够用了:
团队是纯前端、要三个月内出活、用户量五万以内、磁盘不是瓶颈 → Electron。别犹豫,2025 年它在人力成本上还是最划算的,生态和踩坑资料的密度摆在那。
分发渠道是应用商店或者企业内网、安装包体积是硬指标(要塞进 OTA 包、要装进车机、要预置到出厂镜像)→ Tauri。省下的分发带宽和镜像层数是实打实的。
需要调硬件、串口、USB 原始帧、要 60fps 画大量图形、或者做视频编辑这种 → Qt 或者干脆用原生。Qt 6.5 之后开源版只提供在线安装器了,离线包得走商业授权;LGPLv3 下动态链接可以闭源,但你要用 Qt Charts、Data Visualization 这些模块,或者想做静态链接,就得掏钱。具体价格我记不太准了,几年前问过大概是每人每年几千美元起,现在肯定涨了。
只做 Windows 一端,公司已经有 .NET 团队 → WinUI 3,别为了跨平台硬上 Web 技术栈,最后你会发现省下来的那点开发时间全花在补 WebView 的坑上了。
最后说句实在话。网上的框架对比文章九成都在比「Hello World 打包体积」,那个数字在你项目真正上线、开始收用户反馈之后,几乎是最不重要的一个。真正决定一个桌面应用死活的,是签名证书办不下来、更新推不出去、崩溃了回滚不了这些琐碎事,而这些跟 Tauri 还是 Electron 没什么关系。