
这 9 个方案里,有 3 个出生还不到两个月。
摘要
把 Electron、Tauri、Wails、MyGo、Flutter、GPUI、Rune、Native Shell、PyQt 放在一起,按技术栈、渲染方式、成熟度和热度逐个对比,最后给出一张按团队背景选型的速查表。
背景:跨平台客户端又热闹起来了
前几年聊跨平台桌面,基本就是「Electron 太重,换 Tauri」。到 2026 年底,局面变了:
- Web 路线里,Electron 仍是生态霸主,Tauri、Wails、MyGo 的网页模式改用系统 WebView,继续变轻;
- 自绘路线早有 Flutter 打底,GPUI、Rune、MyGo 的原生模式又因为 Zed 编辑器 1.0 的成功,被更多人认真看待;
- 原生控件路线(Native Shell)重新出现,而且一套代码覆盖桌面 + 手机 + Web;
- 还有一个新变量:AI 写 UI。Rune 和 Native Shell 都把「让 AI agent 能写、能看、能测界面」写进了设计目标。
下面的数据统一取自 2026-11-08 的 GitHub、PyPI 和 crates.io。
先看全景:一张表
| 方案 | 语言 / 技术栈 | 界面怎么画 | 平台 | GitHub Stars | 成熟度 |
|---|---|---|---|---|---|
| Electron | JS/TS + Chromium + Node.js | 内置 Chromium | 桌面 | 12.4 万 | 非常成熟(v45) |
| Tauri | Rust 后端 + 任意 Web 前端 | 系统 WebView | 桌面 + iOS/Android | 11.2 万 | 稳定(2.12),3.0 alpha |
| Wails | Go 后端 + 任意 Web 前端 | 系统 WebView | 桌面 | 3.7 万 | v3.1,v3 刚正式发布 |
| PyQt / PySide | Python + Qt | Qt 控件(自绘) | 桌面 | ---(Qt 近 30 年) | 非常成熟 |
| Flutter | Dart | 自带引擎自绘 | 桌面 + iOS/Android + Web | 18.1 万 | 非常成熟(3.47) |
| GPUI | Rust | GPU 自绘 | 桌面(+WASM 实验) | Zed 9.4 万 / GPUI Kit 2 万 | 引擎成熟,API 未稳定 |
| MyGo | 纯 Go | WebView 或 GPU 自绘,可混用 | 桌面 | 5,408 | v0.8,诞生 6 周 |
| Rune | Rust | GPU 自绘 | 桌面 + Web | 5,157 | pre-release,诞生 2 周多 |
| Native Shell | Rust 内核 + TSX / Rust | 各平台原生控件 | 桌面 + iOS/Android + Web | 2,112 | v0.4,诞生 3 周多 |
逐个看
1. Electron:生态最大的「老大哥」
是什么:把 Chromium 浏览器内核和 Node.js 一起打包进应用,界面就是一个网页,主进程用 Node.js 调用系统能力。VS Code、Slack 这些大家每天在用的桌面软件都是它做的。
技术栈:JavaScript / TypeScript + HTML/CSS + Node.js。
js
// main.js
const { app, BrowserWindow } = require("electron");
app.whenReady().then(() => {
const win = new BrowserWindow({ width: 800, height: 600 });
win.loadFile("index.html");
});
app.on("window-all-closed", () => {
if (process.platform !== "darwin") app.quit();
});
优势:
- 三个平台用的是同一个 Chromium,渲染结果一致,前端代码几乎不用为平台差异分支;
- 生态最大:npm 包随便用,打包、签名、自动更新(Electron Forge、electron-builder)都有成熟方案;
- 前端团队零门槛,招人最容易。
劣势:
- 每个应用都自带一份 Chromium + Node.js,安装包和内存占用是 9 个方案里最重的一档;
- 主进程、渲染进程、预加载脚本的分层和安全配置(上下文隔离、IPC 白名单)需要认真设计,否则容易留下安全隐患;
- 不支持移动端。
热度与成熟度 :12.4 万 Stars,2013 年起步,当前 v45.2.3(2026-11-04)。最成熟、最稳妥,体积和内存不是硬约束时,它依然是很多团队的默认答案。
2. Tauri:WebView 路线的事实标准
是什么:Rust 写后端逻辑,前端随便用 React、Vue、Svelte,界面跑在操作系统自带的 WebView 里(macOS 的 WKWebView、Windows 的 WebView2、Linux 的 WebKitGTK)。
技术栈:Rust + HTML/CSS/JS。
rust
// src-tauri/src/lib.rs
#[tauri::command]
fn greet(name: &str) -> String {
format!("Hello, {}!", name)
}
#[cfg_attr(mobile, tauri::mobile_entry_point)]
pub fn run() {
tauri::Builder::default()
.invoke_handler(tauri::generate_handler![greet])
.run(tauri::generate_context!())
.expect("error while running tauri application");
}
ts
// 前端
import { invoke } from "@tauri-apps/api/core";
const msg = await invoke<string>("greet", { name: "Ada" });
优势:
- 不捆绑浏览器内核,安装包和内存都远小于 Electron;
- 2.0 起同一套工程能出 iOS、Android;
- 权限(capability)模型做得细,插件生态是同类里最全的。
劣势:
- 三个平台的 WebView 内核不一样,CSS 兼容、字体渲染、性能都要分别测,Linux 上的 WebKitGTK 最容易出问题;
- 后端要写 Rust,对纯前端团队有门槛。3.0 alpha 新增了可选的 CEF(内置 Chromium)运行时,正是为了解决内核不一致,但代价是安装包明显变大。
热度与成熟度 :11.2 万 Stars,接近 Electron 的 12.4 万;稳定线 2.12.5(2026-10-21),3.0 还在 alpha。生产可用,首选级别。
3. Wails:Go 版的 Tauri
是什么:思路和 Tauri 几乎一样,只是后端换成 Go。Go 结构体的方法会被自动生成为前端可调用的 JS/TS 绑定。
技术栈:Go + 任意 Web 前端 + 系统 WebView。
优势:
- Go 团队零学习成本,编译快,后端并发和网络库现成;
- v3 带来多窗口、系统托盘、新的绑定生成器,补齐了 v2 最常被吐槽的短板。
劣势:
- 同样受三平台 WebView 差异困扰;
- 不支持移动端;
- v3.0.0 在 2026-10-26 才正式发布,v2 → v3 有迁移成本,社区教程大多仍是 v2 写法。
热度与成熟度 :3.7 万 Stars,2018 年起步,v2 已有大量生产应用。稳定可用,Go 团队的默认选择,新项目可直接上 v3。
4. MyGo:Go 生态的新挑战者
是什么:前端圈知名开源作者 egoist 在 2026-09-26 开的新项目,口号是「用 Go 写桌面应用,原生 UI 或 Web 前端都行」。窗口界面有两种写法,同一个应用、甚至同一个窗口里都能混用:
- 网页模式:和 Wails 类似,用系统 WebView,前端通过自动生成的 TypeScript 客户端调用 Go;
- 原生模式 :用 Go 的
ui包写界面,MyGo 自己在 GPU 上绘制,没有 HTML、没有 JS、没有 WebView。
go
type Greeter struct{}
// Greet returns a greeting.
func (Greeter) Greet(name string) string { return "Hello, " + name }
func main() {
mygo.Bind(Greeter{})
mygo.App.WhenReady(func() {
mygo.NewWindow(mygo.WindowOptions{Title: "Hello", URL: "/"})
})
if err := mygo.App.Run(); err != nil {
log.Fatal(err)
}
}
ts
import { Greeter } from "./mygo"; // 自动生成
document.body.textContent = await Greeter.greet("Ada");
优势:
- 纯 Go、不用 cgo,在一台机器上就能交叉编译出三个平台的包,而 Wails 在 macOS、Linux 上要靠 cgo 接 WebView,交叉编译这两个平台得借助 Docker;
- 产物是一个几 MB 的 Go 二进制;
- 打包发布链路很全:dmg、Windows 安装器、deb、签名公证、带增量更新的自动升级都内置。
劣势:
- 诞生约 6 周,版本 v0.8.3,API 随时可能变;
- 原生 UI 的控件数量、复杂场景的稳定性还没经过大规模验证;
- 要求 Go 1.27.3 以上。
热度与成熟度 :6 周 5,400 多 Stars,增速很猛;适合尝鲜和内部工具,重要产品先观望。
5. Flutter:从手机打到桌面的自绘框架
是什么:Google 出品的 UI 框架,不用 WebView,也不用系统控件,而是自带渲染引擎把每一个像素自己画出来。移动端起家,一套 Dart 代码可以出 iOS、Android、Web、Windows、macOS、Linux 六个平台;Ubuntu 的新版安装器就是用 Flutter 写的。
技术栈:Dart + Flutter 引擎(Skia / Impeller)。
dart
import 'package:flutter/material.dart';
void main() {
runApp(const MaterialApp(
home: Scaffold(body: Center(child: Text('Hello'))),
));
}
优势:
- 平台覆盖最广,手机和桌面能共用绝大部分代码;
- 自绘带来的像素级一致,动画流畅,热重载开发体验好;
- 组件丰富,Material 和 Cupertino 两套风格开箱即用,pub.dev 生态庞大。
劣势:
- 要学 Dart,团队技术栈多一门语言;
- 桌面端插件和第三方库明显少于移动端,菜单、托盘、多窗口等桌面能力常要靠社区插件或自己写平台代码;
- 控件是「画」出来的,不是系统原生的,在桌面上细看会有「不像本地应用」的感觉。
热度与成熟度 :18.1 万 Stars,是 9 个方案里最高的;当前稳定版 3.47.9(2026-10-29)。成熟可用,尤其适合同时要做手机和桌面的团队。
6. GPUI:Zed 编辑器背后的 GPU 引擎
是什么:Zed 团队为自家编辑器打造的 Rust UI 框架,整个界面像游戏一样直接用 GPU 绘制,不经过 WebView,也不用系统控件。Zed 在 2026-04-29 发布 1.0;GPUI 作为 Zed 仓库里的一个 crate,采用 Apache-2.0 协议,并发布到了 crates.io。
技术栈 :Rust,GPU 渲染;配套组件库首推长桥开源的 GPUI Kit(原名 gpui-component),提供 75+ 组件、WASM 支持、无障碍和无头 UI 测试,长桥自家的桌面交易客户端就是用它写的。
优势:
- 性能天花板高,Zed 本身就是最好的证明:大文件、长列表、高刷新率都很顺;
- 有真实的大型商业产品在跑(Zed、长桥桌面端);
- 内存占用远低于 WebView 方案。
劣势:
- 文档少,很多用法要读 Zed 源码;
- crates.io 上的 gpui 还停在 0.2.2,API 跟着 Zed 主线变,组件库常常要从 git 拉;
- 只能写 Rust,招人和上手成本最高;不支持移动端。
热度与成熟度 :GPUI 本身没有独立仓库,Zed 仓库 9.4 万 Stars,GPUI Kit 近 2 万。引擎成熟、API 不稳定,适合对性能有极致要求、团队熟悉 Rust 的产品。
7. Rune:为 AI 写 UI 而生的 Rust 框架
是什么:Anomaly(AI 编程工具 opencode 背后的团队)在 2026-10-22 开源的 Rust UI 框架,自带 GPU 渲染器、文字排版、布局和弹簧动画,支持 macOS、Windows、Linux 和 Web(WASM)。开源两周就在 Hacker News 上拿到 177 分。
它最特别的一点:每个应用都能无头运行,AI agent 可以把界面渲染成 PNG、导出元素树、用脚本模拟输入,自己检查自己写的 UI。README 里甚至直接给了一段让 coding agent 用 Rune 写应用的提示词。
rust
fn view(s: &State, _: &mut Cx<State>) -> El {
let t = tok::theme(true);
let label = text(if s.on { "Lights on" } else { "Lights off" })
.font(type_::TITLE).color(t.text);
col().w_full().h_full().center().gap(16.0).fill(t.bg).child(label)
}
优势:
- 声明式 API 简洁,自带动画和组件库 rune-kit;
- 「AI 可验证」的设计思路领先,适合让 agent 大量生成界面的团队;
- MIT 协议。
劣势:
- 官方明确写着 pre-release,没有发布版本,只能 pin 某个 dev 提交;
- 不接受 PR,只收 issue,社区参与方式受限;
- 无障碍深度、输入法、无 GPU 环境下的表现,社区仍在追问。
热度与成熟度 :两周多 5,100+ Stars。目前是实验品,适合关注、不适合押注。
8. Native Shell(NSH):一套代码,各平台真原生
是什么 :长桥在 2026-10-14 开源的 Rust UI 框架,主打「Build once, native everywhere」。和 Flutter、GPUI、Rune 自己画界面不同,它调用每个平台自己的原生控件:iOS 用 UIKit,Android 用原生 View,macOS 用 AppKit,Windows 用 Win32 + Direct2D,Linux 用 GTK 4,Web 输出 HTML,甚至还能渲染到 GPUI 窗口和终端里。
技术栈:Rust 内核;界面可以用 Rust 写,也可以用 TSX 写(编译成 QuickJS 字节码),布局是 flexbox/grid,样式用 Tailwind 类名,响应式是 Solid 风格的信号。
优势:
- 本文 9 个方案里唯一一个桌面 + iOS + Android + Web 全覆盖、且用原生控件的,外观、输入法、无障碍天然贴合系统;
- 可以嵌进已有的原生 App;
- 支持运行时下发签名的 TSX 模块,在沙盒里运行,适合插件和 AI 生成的界面。
劣势:
- 诞生 3 周多,v0.4.0,生态几乎为零;
- 各平台原生控件行为不一致,跨平台像素级一致比自绘方案难;
- 最低系统要求偏高:macOS 14、iOS 15、Android 9、GTK 4.14。
热度与成熟度 :2,100 Stars,背后有长桥做 GPUI Kit 的经验。思路最有野心,但现在只适合跟进观察。
9. PyQt / PySide:最老牌的稳妥选择
是什么:Python 对 Qt 的绑定。Qt 是 1995 年就发布的 C++ 跨平台框架,控件、图表、多媒体、数据库一应俱全。PyQt6 由 Riverbank 维护,PySide6 是 Qt 官方绑定,两者当前都是 6.12.0。
python
import sys
from PyQt6.QtWidgets import QApplication, QPushButton
app = QApplication(sys.argv)
btn = QPushButton("Hello")
btn.clicked.connect(lambda: print("clicked"))
btn.show()
sys.exit(app.exec())
优势:
- 成熟度碾压:控件最全,有可视化设计器 Qt Designer,资料和问答海量;
- 写数据分析工具、科研软件、内部工具时,能直接用 Python 的 numpy、pandas 生态。
劣势:
- 协议要注意:PyQt6 是 GPL,闭源商用要买商业授权;想要更宽松的 LGPL,就换 PySide6;
- 打包靠 PyInstaller / Nuitka,安装包大、启动慢,源码保护弱;
- 界面风格偏传统,做成现代化 UI 要花不少样式功夫。
热度与成熟度 :最成熟,但在新项目里的势头不如 WebView 和 Rust 系。
还有哪些值得一提
| 方案 | 技术栈 | 一句话 | Stars |
|---|---|---|---|
| Compose Multiplatform | Kotlin | JetBrains 出品,Android 团队最顺手 | 1.9 万 |
| Avalonia | C# / .NET,自绘 | WPF 的跨平台继承者,.NET 团队首选 | 3.2 万 |
| Slint | Rust / C++ / JS,声明式 DSL | 1.x 稳定,嵌入式设备也能跑 | 2.4 万 |
| Dioxus | Rust,类 React | 一套代码出 Web、桌面、移动端 | 4.0 万 |
面向人群:按团队背景选
- 前端团队,要小体积:Tauri;要绝对的渲染一致性,再考虑 Electron。
- Go 团队:要稳就用 Wails v3;想要单二进制、交叉编译、甚至不写前端,试试 MyGo。
- Rust 团队,追求极致性能:GPUI + GPUI Kit。
- Python / 数据 / 科研工具:PySide6(协议宽松)或 PyQt6。
- 一套代码同时上手机和桌面:今天选 Flutter 或 Tauri 2;明天值得盯的是 Native Shell。
- 让 AI 大量生成界面:关注 Rune 和 Native Shell 的 agent 友好设计,先在小项目里试。
我的看法
三条路线的分化会越来越明显:Web 路线(Electron、Tauri、Wails)赢在生态和开发效率;自绘路线(Flutter、GPUI、Rune、MyGo 原生模式)赢在性能和一致性;原生控件路线(Native Shell)赢在系统体验和移动端覆盖。
两个月内冒出三个新框架,说明「Electron 太重」这个老问题还没被彻底解决,也说明 AI 正在改变 UI 框架的设计标准:能不能被 agent 写好、测好,正在变成新的竞争点。但对要上线的产品来说,成熟度仍然是第一位的。新框架先放进内部工具里试,比直接押上主力产品稳妥得多。
你的下一个桌面项目,会继续用 Electron / Tauri 这种 Web 方案,还是转向 Flutter、GPUI 这类自绘框架,或者赌一把原生控件?