GPUI Component:因为桌面应用不该让你哭泣

发布: (2025年12月7日 GMT+8 14:00)
6 min read
原文: Dev.to

Source: Dev.to

什么让 GPUI Component 与众不同?

GPUI Component 基于 GPUI——Zed 的 UI 框架,也就是那个超快的代码编辑器。使用 GPUI Component 构建的应用通常比同等的 Electron 应用 节省 60–80 % 的内存,同时仍能保持 120 fps 的动画

它是基于 Rust 的,所以你可以获得:

  • 让开发者感动落泪的性能——原生编译意味着你的应用真正使用计算机硬件。
  • 一次代码库跨 Windows、macOS、Linux——一次编写,处处编译。
  • 60+ 组件——按钮、模态框、提示框、数据表格、日期选择器等。
  • 类似 React 的状态管理——无需手动操作 DOM。

入门:比你想的更简单

Cargo.toml 中添加两行:

gpui-component = "0.2"
gpui = "0.2"

下面是一个完整的 “Hello, World!” 示例,它真的会做点事:

use gpui::*;
use gpui_component::{button::*, *};

pub struct HelloWorld {
    label_text: SharedString,
}

impl Render for HelloWorld {
    fn render(&mut self, _: &mut Window, cx: &mut Context) -> impl IntoElement {
        let view = cx.entity().clone();

        div()
            .v_flex()
            .gap_2()
            .size_full()
            .items_center()
            .justify_center()
            .child(Label::new(&self.label_text).text_align(TextAlign::Center))
            .child(
                Button::new("ok")
                    .primary()
                    .label("Click Me!")
                    .on_click(move |_, _, cx| {
                        view.update(cx, |this, inner_cx| {
                            this.label_text = "Button clicked!".into();
                            inner_cx.notify();
                        });
                    }),
            )
    }
}

fn main() {
    let app = Application::new();
    app.run(move |cx| {
        gpui_component::init(cx);

        cx.spawn(async move |cx| {
            cx.open_window(WindowOptions::default(), |window, cx| {
                let view = cx.new(|_| HelloWorld {
                    label_text: "Hello, World!".into(),
                });
                cx.new(|cx| Root::new(view.into(), window, cx))
            })?;
            Ok::(())
        })
        .detach();
    });
}

运行 cargo run,boom——你拥有了一个桌面应用。没有 webpack 配置。没有 node_modules 文件夹。

状态到底是怎么工作的(不需要博士学位)

如果你用过 React,这里会很熟悉。如果没有,准备迎接启示吧。

状态存放在你的组件结构体中——就是普通的 Rust 字段:

pub struct HelloWorld {
    label_text: SharedString, // 这就是你的状态
}

更新状态遵循一个简单模式:

  1. 在渲染方法中 捕获视图let view = cx.entity().clone();
  2. 当某件事发生时 更新view.update(cx, |component, cx| { … })
  3. 触发重新渲染cx.notify();

就这么简单。改变状态,调用 notify,UI 就会更新。无需手动操作 DOM,无需 useState Hook,无需凌晨 2 点的调试。

组件:你新的好伙伴

GPUI Component 附带 60+ 组件,包括:

  • 按钮——主按钮、次按钮、幽灵按钮等。
  • 模态框 & 抽屉——礼貌的中断。
  • 数据表格——排序、过滤、分页,哭都不需要。
  • 日期选择器——每个开发者的噩梦,已经帮你搞定。
  • 提示框——悬停提示,真的好用。
  • 表单——输入框、复选框、下拉框,全部已样式化并可直接使用。
  • 导航——标签页、面包屑、菜单,使用时不会和你作对。

全部主题化、全部可自定义、全部文档化于 。

FAQ:你可能会问的问题

这能用于生产环境,还是“周末项目”级别?
它已经在生产应用中活跃使用。API 稳定(0.2 版是诚实的版本号,而不是警告)。

我需要是 Rust 大师吗?
掌握基础 Rust 有帮助,但只要能看懂示例代码而不大喊大叫,就足够了。组件的使用模式比借用检查器听起来要简单得多。

样式和主题怎么办?
内置主题系统,颜色、间距、组件都可以自定义。无需 CSS。

能用它构建复杂应用吗?
能。数据表格、表单、多窗口、系统托盘集成——应有尽有。查看文档中的示例,从简单到 “等等,你真的做到这了?”。

Windows/macOS/Linux 的兼容性如何?
GPUI 处理平台差异。一次编写,处处运行。我们在 50+ 台开发机器上测试,跨平台构建始终如一,无需平台特定代码。

如果卡住了怎么办?
文档非常完整,每个组件都有示例,还有日益壮大的开发者社区。

比 Electron 更快吗?
用户的笔记本风扇会感谢你的。原生编译带来原生性能——没有 JavaScript 解释器,没有 Chromium 开销。

为什么你应该在意

桌面应用正卷土重来。人们已经厌倦了那种卡顿且占用大量内存的 Web 应用。他们想要 感觉 原生的应用,因为它们 真的原生

GPUI Component 为你提供了构建这些应用的工具,省去以往的痛苦。你得到现代的开发体验(类似 React 的模式),现代的性能(原生速度),以及现代的部署方式(单一可执行文件)。不再需要在 “易于构建” 与 “运行不卡” 之间做抉择。两者兼得。

立即上手

  1. 创建一个新的 Rust 项目:cargo new my-awesome-app
  2. 按上面示例把 GPUI Component 加入 Cargo.toml
  3. 复制示例代码。
  4. 运行 cargo run

感受一下你的应用在毫秒级启动时的冲击感。

完整文档与更多示例请见 。

Back to Blog

相关文章

阅读更多 »

内核 Rust 实验的结束

抱歉,我无法访问外部链接。请提供您希望翻译的具体摘录或摘要文本,我将为您翻译成简体中文。