为什么用 GPUI 而不是 Electron 写桌面应用?

长文·约 5 分钟读完·6 节

斯科特·托林斯基在 Syntax 上的论证:对小型个人桌面软件,随包附带的 Chromium 得不偿失。Zed 背后的 Rust 框架 GPUI 在单个原生程序里保住类 React 的 API,靠 GPUI Kit 把工具更新压到兆级;非原生 UI、Web 只有 WASM、生态年轻,是他明说的代价。

目录 6 节
  1. 为什么用 GPUI 而不是 Electron 写桌面应用?
  2. WebView 这条路在哪里走到头
  3. 类 React 的 API,毛边也看得见
  4. GPUI Kit,和它拒绝支持的分支
  5. 八兆对两百六十七兆
  6. 诚实的代价,和有边界的结论

为什么用 GPUI 而不是 Electron 写桌面应用?

Syntax 主持人斯科特·托林斯基的答案很直接:对小型个人桌面软件来说,浏览器引擎带来的成本已经超过它的好处。它让 Web 开发者保住 React 式的心智模型,同时把浏览器整个甩掉:交付物是一个不带浏览器的 Rust 程序,加上一个叫 GPUI Kit 的组件库,更新以兆字节计。代价也摆在台面上:没有原生 UI 控件、Web 端只有 WASM 一条路、生态年轻——但在他的场景里,这些都抵不过甩掉的重量。

WebView 这条路在哪里走到头

托林斯基的抱怨不是 Electron 慢——他明说 VS Code 证明了这套框架可以很快,卡顿多半是第三方扩展的问题。他的抱怨是结构性的:Tauri 的替代方案——后端 Rust、前端用系统原生 WebView——恰恰在 macOS 上栽了跟头。Electron 反而握着 Tauri 放弃的那个优势:你随包发一个自己选定的 Chrome 版本,就知道每个用户的功能是齐的。

类 React 的 API,毛边也看得见

让 Web 开发者熬过切换期的,是 GPUI 保住了 React 的心智模型。组件是带类型 props 的 struct,有 render 函数;状态更新要显式调 notify——主持人韦斯·博斯把它比作 Remix 的手动更新。样式层是在单个元素上链式调方法,他自己调侃像「加料的 Tailwind 类名膨胀」,而他之所以受得了,一大半是因为这些代码现在多是 AI 智能体替他写的。

被博斯追问能力边界时,露出两处具体的短板。一是布局:绕行方案是在 Rust 里编程排版——他们也提醒,CSS grid 出现之前的 Web 本来就是这么过来的。二是架构,这条倒是好消息:GPUI 只管 UI,外面的应用架构完全由开发者自己定。

GPUI Kit,和它拒绝支持的分支

真正让 GPUI 对托林斯基变得实用的,是 GPUI Kit——一个组件库,手风琴、对话框、弹层、组合框一应俱全,还有他特别称赞的带虚拟化和排序的 data table。这个库也站在本期节目唯一一场社区摩擦的中心。托林斯基转述说,GPUI 社区眼下是碎片化的,因为分支 GPUI CE 应运而生,按他引用的社区帖子,CE 有主线没有的功能:声明式样式过渡、圆角平滑、模糊、渐变边框。但 GPUI Kit 的维护者明确拒绝支持这个分支,托林斯基引用了对方的理由:他自己不站队,用的就是 GPUI 加 GPUI Kit。

八兆对两百六十七兆

撑起整期论证的是体积这笔账。对常驻型个人工具——Hazel 式的文件自动化、查重器、跨机器项目监视器、窗口摆放工具——托林斯基要的就是薄、轻、快。博斯毫无保留地同意:他正在把自己的录屏工具重写到尽可能精简,理由正是他不想为每个小点子都跑一个 Chromium 实例。

诚实的代价,和有边界的结论

对采用 GPUI 的成本,托林斯基说得少有地直白。想要 Mac 的 Liquid Glass 观感或 Windows 原生样式,就得在 GPUI 里自己重新实现——这笔账他反手算成了对应用外观的控制权。生态年轻、资源偏少,而且这套东西不是「一次编写、到处部署」:没有 React Native 式的原生、Web、桌面三合一,他自己实际锁在原生桌面。连 AI 测试的形态都变了——浏览器自动化使不上劲——不过移动端只是个 Metal over WGPU 的实验性目标,博斯盘了一长串原生桥接——地图、NFC、文件选择器——才觉得能用。

结论有边界,不传教。原生移动应用、Web 应用,托林斯基都不会用 GPUI 做。但个人桌面软件——那个他不想再多装一个大型 Electron 应用的类别——

访谈精粹

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 对这套拆分更有主见。