为什么用 GPUI 而不是 Electron 写桌面应用?
斯科特·托林斯基在 Syntax 上的论证:对小型个人桌面软件,随包附带的 Chromium 得不偿失。Zed 背后的 Rust 框架 GPUI 在单个原生程序里保住类 React 的 API,靠 GPUI Kit 把工具更新压到兆级;非原生 UI、Web 只有 WASM、生态年轻,是他明说的代价。
为什么用 GPUI 而不是 Electron 写桌面应用?
Syntax 主持人斯科特·托林斯基的答案很直接:对小型个人桌面软件来说,浏览器引擎带来的成本已经超过它的好处。他开场就向 Electron、Tauri 和一切 WebView 桌面应用道别。GPUI——Zed 编辑器背后的 Rust UI 框架——被他描述为一个 GPU 加速、跨平台的 UI 框架。它让 Web 开发者保住 React 式的心智模型,同时把浏览器整个甩掉:交付物是一个不带浏览器的 Rust 程序,加上一个叫 GPUI Kit 的组件库,更新以兆字节计。代价也摆在台面上:没有原生 UI 控件、Web 端只有 WASM 一条路、生态年轻——但在他的场景里,这些都抵不过甩掉的重量。
WebView 这条路在哪里走到头
托林斯基的抱怨不是 Electron 慢——他明说 VS Code 证明了这套框架可以很快,卡顿多半是第三方扩展的问题。他的抱怨是结构性的:每个 Electron 应用都要随包带一份 Chromium。Tauri 的替代方案——后端 Rust、前端用系统原生 WebView——恰恰在 macOS 上栽了跟头。用他的话说,WKWebView 功能不丰富、不适合桌面应用,而且「谁家支持哪些特性」完全不可预测,因为没有随应用打包指定的引擎版本。Electron 反而握着 Tauri 放弃的那个优势:你随包发一个自己选定的 Chrome 版本,就知道每个用户的功能是齐的。
类 React 的 API,毛边也看得见
让 Web 开发者熬过切换期的,是 GPUI 保住了 React 的心智模型。托林斯基形容这是一种非常「Web」、恕他直言非常「类 React」的体验。组件是带类型 props 的 struct,有 render 函数;状态更新要显式调 notify——主持人韦斯·博斯把它比作 Remix 的手动更新。样式层是在单个元素上链式调方法,他自己调侃像「加料的 Tailwind 类名膨胀」,而他之所以受得了,一大半是因为这些代码现在多是 AI 智能体替他写的。
被博斯追问能力边界时,露出两处具体的短板。一是布局:两位主持人现场翻文档,发现「到处都是 flex」,没有 CSS grid。绕行方案是在 Rust 里编程排版——他们也提醒,CSS grid 出现之前的 Web 本来就是这么过来的。二是架构,这条倒是好消息:UI 和逻辑同住一个 Rust 程序,托林斯基指出,Electron 里那层跨进程 RPC 在这里整个消失了。GPUI 只管 UI,外面的应用架构完全由开发者自己定。
GPUI Kit,和它拒绝支持的分支
真正让 GPUI 对托林斯基变得实用的,是 GPUI Kit——一个组件库,手风琴、对话框、弹层、组合框一应俱全,还有他特别称赞的带虚拟化和排序的 data table。「感觉非常像 GPUI 界的 shadcn。」他说。这个库也站在本期节目唯一一场社区摩擦的中心。托林斯基转述说,GPUI 社区眼下是碎片化的,因为社区成员觉得 Zed 团队——也就是造出 GPUI 的团队——往框架里加的东西只服务于他们自己。分支 GPUI CE 应运而生,按他引用的社区帖子,CE 有主线没有的功能:声明式样式过渡、圆角平滑、模糊、渐变边框。但 GPUI Kit 的维护者明确拒绝支持这个分支,托林斯基引用了对方的理由:只有被真实应用验证过的项目,才会产生持续的真实需求,推动框架进步。他自己不站队,用的就是 GPUI 加 GPUI Kit。
八兆对两百六十七兆
撑起整期论证的是体积这笔账。托林斯基在用的 Mac 磁盘工具 DaisyDisk,这次自更新只有八兆。博斯补刀:多半还有个 Electron 版的 DaisyDisk,267 兆——每次更新都一大坨驻在硬盘上,后台还挂着一个 Chromium 进程。对常驻型个人工具——Hazel 式的文件自动化、查重器、跨机器项目监视器、窗口摆放工具——托林斯基要的就是薄、轻、快。博斯毫无保留地同意:他正在把自己的录屏工具重写到尽可能精简,理由正是他不想为每个小点子都跑一个 Chromium 实例。
诚实的代价,和有边界的结论
对采用 GPUI 的成本,托林斯基说得少有地直白。最大的缺点,他说,是 UI 元素非原生。想要 Mac 的 Liquid Glass 观感或 Windows 原生样式,就得在 GPUI 里自己重新实现——这笔账他反手算成了对应用外观的控制权。Web 目标编译成 WASM,他不认为它会用真正的 DOM。生态年轻、资源偏少,而且这套东西不是「一次编写、到处部署」:没有 React Native 式的原生、Web、桌面三合一,他自己实际锁在原生桌面。连 AI 测试的形态都变了——浏览器自动化使不上劲——不过他提到这些应用带一棵完整的无障碍树,他自己早期的 Jev 测试项目就是靠它做到不截图就点遍 GPUI 应用。移动端只是个 Metal over WGPU 的实验性目标,博斯盘了一长串原生桥接——地图、NFC、文件选择器——才觉得能用。
结论有边界,不传教。原生移动应用、Web 应用,托林斯基都不会用 GPUI 做。但个人桌面软件——那个他不想再多装一个大型 Electron 应用的类别——他的表态很干脆:「你要是问我,GPUI 就是正路。」
访谈精粹
5 组核心对谈- 问
GPUI 有没有把 Web 开发者习以为常的 CSS 能力都实现出来?
Wes Bos 提问11:23答Scott Tolinski 回答就斯科特的实际体验,样式层把他试过的东西都做出来了:阴影、透明度、纹理、背景、循环背景,还有弹簧动画,官方文档里给了旋转 SVG 的示例。样式写法是在单个元素上链式调方法,他自嘲这套东西像「Tailwind 类名膨胀」混上 jQuery 链式调用,文件因此很长。但这对他影响不大:大部分代码是 AI 智能体写的,而且写得不错。他不认为 GPUI 覆盖了 CSS 的全部,只是到目前为止想要的效果没有缺过。
- 问
GPUI 的布局既支持 flexbox 也支持 CSS grid 吗?
Wes Bos 提问12:52答Scott Tolinski 回答两人现场翻文档,只找到 flexbox,任何地方都没有 CSS grid,双方都承认这是 GPUI 当下的一个真实局限。斯科特补充:可以在 Rust 代码里自己量尺寸、用程序方式完成大部分排版,况且 CSS grid 出现之前 Web 开发者也一直这么做;韦斯则说真遇到类似需求,碰到的可能是 subgrid 式的缺口。一句话:现在布局只有 flex 可用。
- 问
用 GPUI 开发桌面应用,像视频处理这类重活需要独立后端进程吗,还是逻辑就写在同一个程序里?
Wes Bos 提问14:18答Scott Tolinski 回答不需要。GPUI 应用就是一个 Rust 程序:界面和业务逻辑在同一个代码库里,调函数就是直接调用,省掉了 Electron 里进程之间那层 RPC。斯科特特别强调 GPUI 只负责 UI——把它接到现有的 Rust 应用上,架构完全由你自己定;相比之下 Electron 对这套拆分更有主见。
- 问
小工具类的个人软件,为什么值得用 GPUI 做原生应用而不是套 Electron?
Wes Bos 提问22:48答Scott Tolinski 回答原生应用可以做到很小。斯科特举 DaisyDisk 为例:一次更新只有 8 MB——换成 Electron 版的同类工具,大概率要拖着 267 MB 的体积分发,还常驻内存。对文件自动化、文件查重这种要一直挂着的小工具,他要的就是薄、轻、快。韦斯完全认同:他不想为每个小点子都跑一个 Chromium 实例,也因此正把自己的录屏工具重写成精简的 GPUI 应用。
- 问
用 GPUI 开发桌面应用,主要的缺点有哪些?
Wes Bos 提问27:08答Scott Tolinski 回答最大的缺点是 UI 元素并非原生:macOS 的 Liquid Glass 观感、各平台的原生样式都不会免费送上门,要就得自己在 GPUI 里实现——这对一些人是劝退点,对想完全掌控外观的人反而是优点(他现在这套界面主题就故意做成「韦斯·博斯风」)。其次没有浏览器 DOM:上 Web 靠编译成 WASM,而不是走真正的 DOM。生态还年轻:组件库基本只有 GPUI Kit,资源少,斯科特靠 AI 智能体加一份 Rust 最佳实践 skill 来写代码。它也不是「一次编写、到处部署」的平台——做不到 React Native 那样一套代码同时出原生移动端、Web 和桌面端,他自己只用于原生桌面。测试同样没法用浏览器自动化,得走 computer use;他为此做了个早期项目,用 Jev 驱动 GPUI 的无障碍树来点击测试,省掉了截图环节。
