跨平台桌面应用 4 大技术栈
| 技术 | 底层 | 语言 | 包大小 | 性能 | 生态 |
|---|---|---|---|---|---|
| Electron | Chromium + Node.js | JS/TS | 80~150MB | ★★★ | ★★★★★ |
| Tauri | 系统 WebView + Rust | TS + Rust | 2~10MB | ★★★★★ | ★★★ |
| Qt | Qt 库 | C++ / QML / Python | 30~80MB | ★★★★★ | ★★★★ |
| Fyne | 系统 GUI | Go | 10~30MB | ★★★★ | ★★ |
一、Electron
原理
- Chromium:渲染 UI(每个窗口一个)
- Node.js:调用本地 API(文件系统、进程、IPC)
- 主进程 + 渲染进程:主进程(Node.js)管理窗口,渲染进程(Chromium)展示 UI
优势
- Web 生态完整:React、Vue 任意用
- 跨平台:Windows / macOS / Linux 一套代码
- 第三方 SDK 丰富:自动更新、native dialog、native menu
劣势
- 包大:80MB 起步
- 内存高:每个窗口一个 Chromium
- 性能:JS 引擎有 GC 抖动
代表应用
- VSCode、Slack、Discord、Notion、Postman、Figma Desktop
适用场景
- 内部工具 / 中后台
- 重 UI 重数据展示
- 团队 JS 技术栈
二、Tauri
原理
- 系统 WebView:Windows 用 WebView2,macOS 用 WKWebView,Linux 用 WebKitGTK
- Rust 后端:编译成原生二进制,提供 IPC、文件系统、shell 等
- 前端任意:React / Vue / Svelte / Solid / 纯 HTML
优势
- 极小包:2~10MB(vs Electron 80MB)
- 低内存:复用系统 WebView
- Rust 后端:性能强、安全(内存安全)
- 细粒度权限:声明式 ACL
劣势
- WebView 跨平台表现不一致(Windows 较新,Linux GTK 旧)
- 生态比 Electron 小
- 学习曲线:Rust + 前端
代表应用
- 各种 Rust 生态工具
- 部分 VSCode 插件、Cursor 编辑器
- OpenCode、cc-connect、tinyhumans/openhuman
适用场景
- 追求包大小 / 启动速度
- Rust 团队
- 命令行 + GUI 一体
三、Qt
原理
- Qt 库:跨平台 C++ GUI 库
- QWidget:传统 UI
- QML:声明式 UI(类 QML + JavaScript)
- PyQt / PySide:Python 绑定
优势
- 性能极强:原生绘制
- 跨平台:Windows / macOS / Linux / Android / iOS / 嵌入式
- 工业级:KDE、Autodesk Maya、VirtualBox、VLC
- 工具链成熟:Qt Creator IDE
劣势
- 学习曲线陡:C++ + Qt 框架
- 商业授权:LGPL / GPL / Commercial 三种
- 包大:30MB+
- UI 不够现代(vs Web)
适用场景
- 工业控制 / 嵌入式 UI
- 科学计算 / 数据可视化
- 跨平台 + 高性能
四、Fyne
原理
- Go 语言:编译成单一二进制
- 系统原生控件:Windows GDI、macOS Cocoa、Linux GTK
- 声明式 API:类 Flutter 风格
优势
- 跨平台编译:Go 一份代码,Windows/macOS/Linux 任意编译
- 单二进制:无外部依赖
- 小包:10~30MB
- 简单易学
劣势
- 生态小:第三方库少
- UI 不够丰富:控件有限
- 性能中等:没有 GPU 加速
适用场景
- Go 团队
- 内部工具
- 简单桌面应用
详细对比
包大小
| 应用 | Electron | Tauri | Qt | Fyne |
|---|---|---|---|---|
| Hello World | 80MB | 3MB | 30MB | 12MB |
| 复杂应用(VSCode 级别) | 200MB+ | 15MB | 100MB | 40MB |
启动时间
| 应用 | Electron | Tauri | Qt | Fyne |
|---|---|---|---|---|
| 冷启动 | 1.5~3s | 0.3~1s | 0.2~0.5s | 0.5~1s |
| 热启动 | 0.5~1s | 0.1~0.3s | 0.1~0.2s | 0.2~0.5s |
内存占用
| 应用 | Electron | Tauri | Qt | Fyne |
|---|---|---|---|---|
| 空闲 | 100~200MB | 30~80MB | 20~50MB | 30~70MB |
| 复杂场景 | 500MB+ | 150MB | 100MB | 150MB |
选型决策树
| |
安装包大小优化
Electron
- 移除不必要的依赖
- 用
electron-builder拆分 platform / arch - 用
asar压缩资源
Tauri
- 用 release 模式(默认)
- 启用 LTO(Link Time Optimization)
- 拆分 release(不同 OS 单独打包)
Qt
- 静态链接 vs 动态链接
- 删除用不到的 Qt 模块
Fyne
- UPX 压缩
- Go 1.20+ 链接器优化
跨平台坑
macOS
- 签名 + 公证(notarization)必需
- 沙箱(sandbox)
- Apple Silicon(arm64)vs Intel(x64)
Linux
- 各种发行版:deb / rpm / AppImage / Flatpak
- WebView 版本:Ubuntu LTS 用 snap,WebView 是 Chromium
Windows
- 32 / 64 位
- WebView2 Runtime(Win10 1803+ 预装,旧版需引导安装)
下一步
- Electron 入门,看 2018-12-15《Electron 跨平台桌面应用》
- Tauri 2.x 实战,看 2020-05-15《Tauri 2.x 跨平台桌面应用》
- Fyne 入门,看 2016-10-15《Go-Fyne 入门》
参考资料
- Electron 官方:https://www.electronjs.org/
- Tauri 官方:https://tauri.app/
- Qt 官方:https://www.qt.io/
- Fyne 官方:https://fyne.io/
- Wails(Go + WebView):https://wails.io/
- Flutter Desktop:https://flutter.dev/desktop
