爱意满满的作品展示区。
SunDoge

做了一个无 WebView 的桌面 GUI 框架 Wabou(SolidJS + Rust + Vello)

  •  1
     
  •   SunDoge · 7h 7m ago · 291 views

    项目地址: https://github.com/SunDoge/wabou

    背景

    当前 Rust GUI 开发现状:Tauri 带着浏览器内核,环境碎片化严重、内存重;纯 Rust GUI ( Iced/egui )省资源,但写复杂状态和联动极其痛苦,还没有 HMR 。

    因此我在尝试一个折中路线:界面用 SolidJS 写,底层的布局和渲染完全交给 Rust 原生,不嵌浏览器。

    架构与原理

    没有 DOM ,也没有 HTML/CSS 引擎。分工很简单:

    [SolidJS 2 (TSX) + 业务逻辑]
             ↓
        (QuickJS)
             ↓  二进制 Mutation 协议(微任务末尾批量推送)
    ================================
      Rust 原生运行时
      - 布局:Taffy (Flexbox/Grid)
      - 排版:Parley
      - 绘制:Vello Hybrid / wgpu
      - 窗口:Winit
    
    • 逻辑层:跑在内嵌的 QuickJS 里。Solid 的细粒度 Signal 变动只更新具体节点,不需要做任何虚拟 DOM diff 。

    • FFI:变动在单个 microtask 末尾打包成扁平的二进制指令,一次性推给 Rust 。

    • 渲染层:Rust 维护 Retained Tree ,Taffy 算布局,Parley 排版,最后交给 Vello 走 GPU 绘制。支持 Vite 毫秒级 HMR 。

    现状

    我用它跑了几个完整应用来压测协议与渲染稳定性:

    • Manga OCR:图片切片标注、后台 OCR 与本地翻译联动

    • Timestow:rustic 备份工具的快照浏览与还原客户端

    • Pi Agent:本地 LLM Agent 的桌面交互界面

    支持多窗口、透明窗口、中文 IME 输入、终端/代码编辑器 Widget 、自定义 WGSL Shader 、以及无头( Headless )离屏 PNG 测试。

    image image

    局限

    无 DOM 环境:虽然写 TSX ,但凡依赖 window 、document 或浏览器 API 的 npm 包都跑不了,只能用纯算法/工具类 JS 库。

    文字与 IME 还在踩坑:跨平台的文字 shaping 、光标定位、输入法候选框对齐还有不少边界 Bug 。

    跨平台支持:主力开发在 Linux 和 macOS ,Windows 仍有细节在补。

    快速尝试

    git clone https://github.com/SunDoge/wabou.git
    cd wabou
    bun install --frozen-lockfile
    bun run wabou doctor
    bun run dev
    

    (首次编译 Rust 依赖会比较慢)

    如果你也对“响应式前端语法 + 原生 GPU 渲染”这条路线感兴趣,欢迎试用。

    1 replies    2026-09-10 22:46:20 +08:00
    TripleZ
        1
    TripleZ  
       2h 27m ago
    支持!
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1378 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 84ms · UTC 17:13 · PVG 01:13 · LAX 10:13 · JFK 13:13
    ♥ Do have faith in what you're doing.