告别 Electron 的 150MB:Fyne / Gio / Wails / Tauri 四框架选型实录
Electron 在财务报表这类场景下几乎是"双重叠加"的惨:Chromium + Node 双运行时保底 150MB,前端再挂个 AG-Grid / Handsontable 渲染万行明细,JS Heap 再吃掉 1GB+。
2026 年桌面 GUI 的格局已经很清楚了——"轻量替代"这条线,Tauri 和 Wails 把坑踩得差不多了;而 Go 侧还有两条不太被人提的路:Fyne 的自绘派、Gio 的即时模式派。
先给结论:四条路的定位差别比想象中大
它们其实是两类技术路线:
WebView 混合派:UI 给前端(HTML/CSS/JS),后端跑原生语言,渲染借系统 WebView,不打包 Chromium
- Wails(Go 后端)
- Tauri(Rust 后端)
纯语言自绘派:UI 和渲染全自己来,不碰前端
- Fyne(Go,Material Design 风,像"Go 版 Flutter")
- Gio(Go,即时模式 + GPU,布局全手写)
路线一:WebView 混合派
Tauri(Rust 后端)
前端(React/Vue/Svelte) ←invoke()→ Rust 后端 → 系统 WebView
↑#[tauri::command] 宏
- 空应用 ~3-8MB(Electron 的零头)
- 渲染:Win=WebView2 / mac=WKWebView / Linux=WebKitGTK
- Tauri 2.0 已支持 iOS / Android,桌面 + 移动一套代码
- 安全模型:capability 权限白名单,文件/Shell 默认全关
- 代价:Rust 所有权 + 生命周期,新手第一个 cargo build 就会卡壳
Wails(Go 后端)
前端(React/Vue/Svelte) ←自动生成 JS Binding→ Go 后端 → 系统 WebView
- ~8-20MB,比 Tauri 略大(GC 运行时)
- Go 结构体 Bind() 后自动生成 TS 类型,前端调后端像调本地函数
- v3 alpha 中:多窗口、原生菜单、系统托盘补齐了 v2 的短板
- 硬伤:无移动端、生态插件比 Tauri 少一截、v3 还在 alpha
两者怎么挑
| 维度 | Tauri | Wails |
|---|---|---|
| 后端语言 | Rust | Go |
| 空包体积 | ~3-8MB | ~8-20MB |
| 编译速度 | 慢 | 快(5-7s 增量) |
| 移动端 | ✅ v2 已支持 | ❌ 桌面 only |
| 插件生态 | 100+ | 少一档 |
| 学习曲线 | 陡 | 平 |
团队语言决定 80% 的答案:Rust 栈 / 要移动端 → Tauri;Go 栈 / 内部工具快速出活 → Wails。IPC 性能差距工程里感知不到。
路线二:纯 Go 自绘派
Fyne
- Material Design 风格,API 像 Flutter 的 Go 版
- OpenGL 硬件加速,深色/浅色主题内置
- 跨平台最活跃的 Go GUI,v2.6 已支持 Wasm / iOS / Android 打包
- 中文输入法、复杂表格/树形组件仍然"够用不够爽"
- 调试靠 printf
Gio
- 即时模式(Immediate Mode)GUI + 自研渲染管线 + GPU 加速
- 布局全代码写,没有 JSX 那种舒服的声明式体验,学习曲线陡
- 性能是真狠——启动最快、内存最低、体积最小
- 适合:数据可视化、CAD、绘图工具、嵌入式屏
Gio 的取舍很极端:你想要"拖个按钮出来"就别选它,你想要"每帧 60fps 自定义绘制"它是 Go 侧独苗。
四框架一维速查
| Tauri | Wails | Fyne | Gio | |
|---|---|---|---|---|
| 后端语言 | Rust | Go | Go | Go |
| 要不要写前端 | 要 | 要 | 不要 | 不要 |
| 移动端 | ✅ | ❌ | ✅ | ✅ |
| 包体 | 最小 | 中 | 中 | 最小 |
| 学习曲线 | 陡 | 平 | 平 | 陡 |
| 代表场景 | 产商品牌 | 内部工具 | 配置面板 | 绘图/CAD |
社区 benchmark 参考(同硬件)
| 框架 | 启动时间 | 启动内存 | 包体 |
|---|---|---|---|
| Fyne | ~180ms | ~45MB | ~12MB |
| Gio | ~120ms | ~38MB | ~7MB |
| Wails | ~350ms | ~120MB | ~18MB |
选型决策树
- 团队是 Rust 栈 / 要移动端 / 做 toC 产品 → Tauri,v2 移动端是独一档
- 团队是 Go 栈 / 内部工具 / 想爽快点 → Wails,v3 出来后多窗口也能打了
- 纯 Go 单语言、不想碰前端、界面不复杂 → Fyne,Material 现成的
- 要极限帧率 / 自定义绘制 / 嵌入式 → Gio,但布局全手写要有心理准备
一个容易被忽略的点
Wails / Fyne / Gio 都是纯 Go、无 CGO(Fyne 的 OpenGL 驱动层除外一点点),GOOS=windows GOARCH=amd64 交叉编译一条命令出包,比 Tauri(Rust + 偶尔 C 依赖)顺很多。
反过来,Tauri v2 的移动端 + 多窗口 + capability 权限体系,Go 侧目前没人能对打——如果你是"桌面 + 以后可能上移动",Tauri 是唯一选项。