For AI agents: the complete documentation index is at llms.txt. Markdown versions of any page are available by appending .md to the URL path.

Rust 桌面 UI 框架 GPUI Kit 是什么

技术RustGPUI Kit

做桌面应用,常常被描述成一道二选一:Electron 上手快,但背着一个浏览器内核;走原生技术,性能好,可窗口、表格、编辑器全得自己造。

一、先看这道「二选一」

Electron 与原生路线对比

示意图:左边是 Electron 方案,右边是原生方案从零开始。两种路线都能到终点,但代价不同。

Electron 的逻辑很直接:用 Web 技术写界面,打包一个 Chromium,跨平台一致,生态成熟。代价也直接:安装包更大,内存占用更高,界面和系统之间隔着一层浏览器。

原生路线的逻辑同样直接:直接调用系统窗口和 GPU,性能和手感更接近系统应用。代价是,很多东西要从零开始——窗口管理、表格、文本编辑器、停靠布局、无障碍、测试,每一项都不便宜。

二、它不是把网页塞进窗口

Rust 直接绘制界面

示意图:Rust 编译成原生程序,GPU 逐帧绘制界面,不需要 WebView。

GPUI Kit 是一套用 Rust 直接画界面的桌面 UI 框架,底座是 Zed 编辑器的 GPUI 渲染引擎。按官方介绍,它不是在窗口里嵌一个 WebView,而是让 Rust 代码直接参与布局和绘制。

它把几件事收在同一个生态里:

  • 75+ 组件;
  • 一套代码,覆盖 macOS、Windows、Linux;
  • Apache-2.0 许可;
  • 底层 GPUI 来自 Zed,同样开源。

按官方文档,Longbridge 在使用 GPUI Kit。这个信息很重要,但它只能说明「有人把它放进真实产品」,不等于「所有场景都适合」。具体适不适合,还要看你的应用形态。

GPUI Kit 瞄准的不是所有桌面软件,而是交易终端、数据看板、开发工具这类信息密集、交互复杂的应用。控件的手感参考 macOS 和 Windows 的现代桌面设计,而不是给网页控件套一层皮。

信息密集型工作区

示意图:一个信息密集的工作区,左侧导航、中间表格与行情、右侧代码编辑器同时存在。

三、信息密集应用,难写的到底是哪几块

GPUI Kit 最想解决的,是信息密集型软件里那些「看起来简单、写起来很贵」的部分。

1. 数据表格

数据表格示意

示意图:虚拟列表只渲染可见行;画面中的 284,901 行是示意数据,不是性能基准。

官方文档提到,数据表格支持虚拟滚动、固定列、列宽调整、排序和单元格选择,量级到 10 万行。画面里用了 284,901 行做示意,但这是演示数据,不是 benchmark。

真正难的不是把数据画出来,而是:

  • 只渲染可见区域,滚动时不能抖;
  • 固定列和横向滚动要跟得上;
  • 排序、选择、列宽调整之后,状态不能乱;
  • 十万行数据进来,内存和布局不能崩。

这些细节,决定了表格是「能用」还是「敢用」。

2. 代码编辑器

代码编辑器示意

示意图:Rope 文本存储、Tree-sitter 高亮、LSP 诊断与补全在同一个编辑器里。

代码编辑器用 Rope 存文本,官方文档给出的量级是 20 万行。在这个量级下,还要做 Tree-sitter 高亮,以及 LSP 的诊断、补全和悬浮提示。

这几件事叠在一起,难点不在单个功能,而在「同时」:文本要能快速编辑,语法树要跟得上,语言服务器返回的结果要能落在正确的位置,滚动和重绘不能把光标位置弄丢。

3. Dock 布局

Dock 布局示意

示意图:面板停靠、标签拖拽、嵌套分割,布局可以序列化保存。

Dock 布局可以停靠面板、拖拽标签、嵌套分割,还能把布局序列化保存。对开发工具、交易终端这类多面板应用来说,这不是「锦上添花」,而是基本盘。

用户把面板拖来拖去,关掉再打开,布局要能恢复;窗口尺寸变了,分割比例要合理;标签在面板之间移动,状态不能丢。这些行为看起来是 UI,背后其实是状态管理。

四、性能不是口号,是一帧一帧算出来的

120 Hz 帧预算示意

示意图:120 Hz 下,一帧大约 8.3 ms;输入、布局、绘制、呈现都要在这段时间里完成。

120 Hz 屏幕下,一帧只有大约 8.3 毫秒。官方文档的原话很克制:「120 Hz 是一个帧预算,不是刷新承诺。」

GPUI 会按需更新,只处理发生变化的部分,而不是每一帧把整个界面重画一遍。但官方也提醒,实际流畅度取决于整个界面、平台调度和 GPU 工作,不是屏幕刷新率一个数字就能保证的。

无障碍和测试,也在工程细节里

AccessKit 示意

示意图:AccessKit 把角色、名称、状态、关系和动作暴露给辅助技术。

无障碍能力接进了交互层。AccessKit 会提供角色、名称、状态、关系和动作;控件需要稳定的 ID,角色本身并不自动带来键盘操作。

测试可以在 headless 窗口里驱动真实的鼠标和键盘,验证状态、焦点、布局和无障碍。对桌面应用来说,这一点很实际:很多问题不是「画错了」,而是「焦点丢了」「状态没同步」「键盘走不到」。

五、WASM 能跑,但官方说「展示 ≠ 交付」

WebAssembly 组件示例

示意图:组件示例可以通过 WebAssembly 在浏览器里运行,但官方标注主要用于展示。

组件示例还能通过 WebAssembly 在浏览器里跑。听起来像是「一套代码,桌面和 Web 都能交付」,但官方文档写得很清楚:

GPUI Kit 的 WebAssembly 支持主要用于在浏览器里展示和试用组件;仓库还没有把 WebAssembly 验证为完整的应用分发路径。

换句话说,WASM 现在是「展示」,不是「交付」。如果你需要的是完整的 Web 产品,还是应该按 Web 的技术栈来规划;如果你需要的是桌面应用,GPUI Kit 才是它的主场。

六、五层架构,一个入口

五层架构示意

示意图:gpui、gpui-kit、gpui-base、gpui-component、gpui-shell 五层,应用入口只有一个依赖。

架构上,GPUI Kit 分成五层,但应用入口只有一个依赖:gpui-kit。它把 gpui、base、component 和默认资源重新导出。

五层分别是:

  • gpui:UI 运行时,负责窗口、元素、布局、渲染与平台;
  • gpui-kit:应用入口,一个依赖,重新导出整套;
  • gpui-base:无样式行为层,提供焦点、浮层、虚拟化、无障碍等行为;
  • gpui-component:完整组件库,75+ 组件、主题、表格、编辑器;
  • gpui-shell:可选的 JavaScript 扩展层。

七、Component 还是 Base:开箱即用,还是自己掌控

Component 与 Base 对比

示意图:左边 gpui-component 提供现成组件和交互细节,右边 gpui-base 只给行为,像素归你。

想开箱即用,就用 gpui-component:75+ 组件、明暗主题、交互细节都齐了。适合快速做出一个完整的产品界面。

想自己掌控视觉,就在 gpui-base 上复用焦点、浮层、虚拟化和无障碍行为,像素归你。适合有成熟设计系统、需要品牌差异化的团队。

一句话:同一套行为,可以要现成的外观,也可以自己画。

八、gpui-shell:Rust 宿主,JavaScript 按项授权

gpui-shell 能力授权示意

示意图:Rust 宿主与扩展脚本在同一个进程;能力逐项授权,默认什么都不给。

需要 JavaScript 扩展时,再加 gpui-shell。

它的设计有几个关键点:

  • 宿主仍然是 Rust;
  • 能力逐项授予,默认什么都不给;
  • 脚本在同一个进程里画真实界面;
  • 保存即热更新,不用 fork,也不用发新版本。

示意图里列出的能力示例包括 fs.read、fs.write、network.hosts、clipboard.write、process.exit、fs.execute。这些开关不是装饰:文件读写、网络访问、剪贴板、进程退出、执行外部进程,每一项都对应真实权限。默认关闭、按需打开,是这套扩展模型里最重要的安全边界。

九、一条原则:行为属于基础层,视觉属于应用

行为与视觉的分层

示意图:焦点、浮层、虚拟化、无障碍、键盘属于基础层;色彩、字体、间距、图标、品牌属于应用。

GPUI Kit 的原则可以概括成一句话:

行为属于基础层,视觉属于应用。

焦点、浮层、虚拟化、无障碍、键盘,这些是「行为」,应该在基础层里做好;色彩、字体、间距、图标、品牌,这些是「视觉」,应该由应用决定。

这条边界决定了组件能复用多少,也决定了设计系统能走多远。很多组件库的问题,不是组件不够多,而是把行为和视觉绑死在了一起:想换皮,得改组件;想改行为,得复制组件。

把边界划清楚,组件才能真正复用。

十、它适合谁,不适合谁

适合:

  • 交易终端、数据看板、开发工具、监控台这类信息密集、交互复杂的桌面应用;
  • 已经有 Rust 技术栈,或愿意投入 Rust 的团队;
  • 对性能、原生手感、安装包体积有要求的桌面产品;
  • 需要表格、编辑器、停靠布局、无障碍和 headless 测试这些「硬骨头」的项目。

不一定适合:

  • 内容站点、简单表单、以展示为主的轻应用;
  • 团队里没有 Rust 经验,且项目周期很紧;
  • 强依赖 Web 生态和第三方前端库的产品;
  • 需要完整 Web 交付路径的产品——WASM 目前主要是展示,不是交付。

还要补一句:GPUI Kit 目前是 v0.9.0,仍处于 0.x 阶段。选它之前,建议先用一个真实页面做原型,评估迁移成本、团队学习曲线和长期维护,而不是只看演示效果。

十一、怎么开始

从 Cargo 依赖开始

示意图:在 Cargo.toml 里加入 gpui-kit,一个依赖带入匹配的 GPUI、组件与默认资源。

安装只需要在 Cargo 配置文件里加上 gpui-kit:

[dependencies]
gpui-kit = "0.9.0"

然后:

use gpui_kit::*;

官方文档给出的前置条件是 Rust 1.92+,以及对应平台的构建依赖(Xcode、Visual Studio 或 Ubuntu 依赖)。文档、组件画廊和完整 API 都在 gpui-kit.com。

如果你想快速判断它适不适合自己,可以按这个顺序:

  1. 先读官方文档的安装和架构页;
  2. 跑一个最小示例,确认平台依赖和构建链没问题;
  3. 用你产品里最难的一屏做原型——最好是表格、编辑器或多面板布局;
  4. 检查无障碍树、键盘焦点和 headless 测试能不能满足要求;
  5. 再决定要不要扩大使用范围。

最后

GPUI Kit 不是要让所有人立刻换框架。它更像是给原生桌面开发多了一个认真考虑的选择:如果你厌倦了「Electron 的包体和内存」和「从零造轮子」之间的二选一,它至少提供了一条新的中间路线。


参考

  • 本文根据 gpui-kit.com 官方文档(v0.9.0)与同名介绍视频整理;产品功能、版本和平台支持以官方文档为准。