GitHub Explorer
📰 公众号已发布 2026-07-22

GitHub 推荐:38K stars、单仓五端:Rust 全栈 UI 框架 Dioxus 怎么把 React DX 搬进 Rust

GitHub: https://github.com/dioxuslabs/dioxus

一句话总结

Dioxus 是 Rust 生态里唯一同时覆盖 Web(WASM)、Desktop(WebView/WGPU)、Mobile(iOS/Android)、SSR、LiveView 五种平台的 UI 框架,用一套 RSX + Signals + hooks 心智,把 React 的开发体验和 SolidJS 的细粒度响应式搬进了类型安全的 Rust。

值得关注的理由

  • 真正的「一份代码五端跑」:在 Rust 生态里,Leptos/Yew 只 Web、Slint/egui 不 Web、Tauri 是壳、Flutter 不是 Rust——Dioxus 是唯一把 Web + Desktop + Mobile + SSR + LiveView 都跑通的 Rust 框架,并且对 React 开发者零学习成本。
  • Subsecond Rust 热补丁:不改进程内存,靠 jump table indirection 把函数调用路由到新版本 dylib,是 2025 年 Rust DX 领域最硬核的工程创新之一。
  • 全职公司 + Apache 2.0 + 大厂背书:Dioxus Labs 2023 年起全职运营(VC + FutureWei 赞助),README 露出 Airbus/ESA/Cognition/YC/Futurewei logo,已发布多个生产级 .ipa/.apk,可信度远超普通个人开源项目。

项目展示

Dioxus Header

Dioxus 五端统一架构的视觉门面,「One codebase, every platform.」 的标志性表达。

Flat Splash

桌面应用示例——同一份 RSX 渲染为原生窗口应用。

Fullstack WebSockets

全栈 WebSocket 架构演示:服务端函数 + 实时双向通信。

Android and iOS

iOS + Android 原生应用展示——WebView 与原生 UI 的混合渲染。

▶️ Dioxus 官方 Tour 视频(10 分钟体验全平台开发流程)

项目画像

维度数据
GitHubhttps://github.com/dioxuslabs/dioxus
Star / Fork37,994 / 1,784
Watcher192
代码行数145,871 行(Rust 83.9%、JSON 6.9%、CSS 3.0%、TOML 2.6%、TS 1.2%、JS 0.9%、Swift/Kotlin 各 0.4%,HTML 0.2%)
项目年龄66.3 个月(首提交 2021-01-14,最近 2026-07-20)
总 commit7,170
贡献者469 人(主作者 jkelleyrtp 48.6%,与 ealmloff 合计 61.5%)
开发阶段稳定维护(近 30 天 4 commit、近 90 天 44 commit,进入低强度维护期)
开发模式职业项目(周末占比 17.4%,工作日 82.6%)
热度定位大众热门(Rust UI 框架头部,与 Yew/Leptos 同梯队)
许可证MIT + Apache-2.0 双许可(从早期自研许可证迁回,已消除争议)
质量评级代码 优秀 / 文档 优秀 / 测试 充分
最新版本v0.8.0-alpha.0(共 49 个 tag、40 个 Release)
子 crate 数48+(典型 Cargo workspace 多 crate 拆分)

作者视角:为什么存在这个项目

创始人/作者背景

Jonathan Kelley(jkelleyrtp) 是 Dioxus Labs 的创始人和全职核心维护者,2023 年 5 月起全职投入(博文《Going fulltime on Dioxus》)。从代码贡献集中度看,jkelleyrtp 占 48.6%,加上联合维护者 Evan Almloff(ealmloff) 合计达 61.5%,但 469 名贡献者总数说明这是一个围绕双核心构建的健康社区,不是个人副业。

Jonathan 的背景透射在 Dioxus 的技术选型里:他明显熟悉编译器/动态链接器(Subsecond 的 jump table indirection 直接借鉴 LLVM/dlsym 思路)、游戏引擎图形栈(Blitz/Vello/WGPU 的整合路径)、React 生态 JSX/虚拟 DOM 经验(借 SolidJS 的细粒度 signals 补 VDOM diff 短板)、编译期反射/proc-macro(把 bundler 的「编译期资源处理」搬到 linker metadata + CLI 后处理,绕过 build.rs 的 IDE 痛点)。这不是一个普通的 web 框架作者——他把 Rust 生态里多个高门槛基础设施领域的能力揉到了一起。

问题判断

Jonathan 在 README 和官方博文中反复表达一个判断:「现代 App 开发需要学十几个工具是反人类的」。具体痛点:

  • Tauri 是壳,仍需搭配 React/Svelte/Vue 前端——没解决「一个团队写多端」的本质问题;
  • Flutter/Dart 离开 Web 生态,桌面/Web 表现弱;
  • React/Electron 体积大、与系统集成弱;
  • Yew/Leptos 只解决 Web 一端,桌面/移动仍要另起炉灶;
  • WASM-split、Rust 热补丁 这一类基础设施在 2022 年前后 Rust 生态几乎不存在。

时机上,2021 年 Rust GUI/WASM 工具链足够成熟(wasm-bindgen、wry、wgpu 起步);0.7(2025-09)抓住浏览器 WebView/原生渲染两条腿收敛的窗口;0.8 alpha 引入 Subsecond 解决 Rust 开发循环痛点——踩准 Rust 「production-ready UI」 的拐点。

解法哲学

  • 简单 vs 大而全:明确拒绝「十几个工具」的现代 App Dev 叙事,追求单仓单 framework 覆盖五平台;选「薄壳 + 多种 Renderer + 一套核心抽象」路径。
  • 性能 vs 易用:易用性看齐 React/Solid(rsx!/hooks/signals/JSX);性能靠 template-based diff(编译期模板)+ signals 细粒度更新 + Generational Box Copy 语义。
  • 开放 vs 封闭:完全开源、Apache 2.0(早期自研许可证争议后迁回),用 Dioxus 站本身作为 dogfood(「我们的文档站用 Dioxus 跑」),并把外围组件库/标准库拆到 dioxus-community Org,鼓励第三方电池式扩张。
  • 明确不做什么:不替代底层 GUI 工具包(Slint/egui);不抢系统壳(Tauri/Electron)而是抢「应用层框架」;不动语言——保留 Rust,避免引入 DSL。

战略意图

Dioxus Labs 是 VC 资助的公司,README 「full-time core team」 自述靠 FutureWei/Satellite.im/GitHub Accelerator 资助,长期目标「自给自足 via enterprise tools」——典型 open-core + 服务 的可持续模式(Dioxus Deploy 已有雏形)。开源策略上,核心 framework 完全开源 Apache 2.0,商业化靠托管/企业版,而不是限制开源能力。平台护城河层面,把「热补丁(Subsecond)+ WASM-split + 编译期 asset bundling + 跨平台 native+webview renderer + 服务端函数 + 文档站 dogfood」做成一个互相喂数据的整体,单点切入很难凑齐。

核心价值提炼

创新之处

按新颖度 × 实用性 × 可迁移性综合排序:

  1. Subsecond jump-table 热补丁 + ThinLink(5/4/4):不动进程内存,靠运行时更新 APP_JUMP_TABLE 把函数调用路由到新版本;同时用 ThinLink 大幅加速 Rust 增量编译。限制是仅 tip crate,库 crate 改动会被忽略。适用:游戏引擎、长跑服务端、桌面 App 的实时开发循环。
  2. Generational Box Copy 引用(4/5/4):用 generation 计数器做 Rust 安全 interior mutability + 失效检测,让 Signal<T> / Store<T> 像 Copy 一样自由传递,Owner Drop 时整体失效。任何需要「Copy 引用 + 自动失效」的状态容器都能套。
  3. Manganis 编译期 asset + 链接器符号 + CLI 后处理(4/5/4):asset!() 宏产出 __ASSETS__ 链接器符号,CLI 用 object/walrus 反向 patch 二进制;rust-analyzer 零负担、跨构建系统可移植。
  4. #[wasm_split] 图分割 WASM chunk(4/4/3):用 walrus + relocation 段建函数调用图,按 #[wasm_split(name)] 切片,自动抽出共享 chunk + JS runtime。适用:大型 WASM 应用首屏优化。
  5. Sledgehammer 二进制突变协议(3/5/3):浏览器/WebView/LiveView 三端共享一套紧凑二进制格式描述 DOM mutation(create_text_node、append_children、set_attribute、replace_with 等栈式操作),通过 WebSocket/JS 解释器消费。
  6. #[server] 宏生成双端 RPC stub + axum handler(3/5/4):同一函数同时编译为客户端 fetch stub 和服务端 handler,用 inventory::submit! 全局注册。RestEndpointPayload<T, E> 标准化 wire 协议。
  7. Dioxus.toml 统一权限配置 + Handlebars 模板映射(3/4/4):统一 high-level 权限(location/camera)→ 自动映射到 iOS Info.plist / Android Manifest 的原生标识。
  8. Subtree memoization for Solid-like perf(3/4/3):在 VDOM diff 时按子树做 memoization 跳过未变化的子树,逼近 SolidJS 细粒度(2022-12 博文《Making Dioxus (almost) as fast as SolidJS》)。

可复用的模式与技巧

直接可迁移到其他项目的设计模式和代码技巧:

  1. Trait 抽象 + 多 renderer 适配:WriteMutations 是普适的「一个 model N 个 view」模式,迁移到任何「一套组件多端渲染」项目。
  2. Generational Box 失效检测:用于任何「Copy 语义 + 自动回收」的状态管理。
  3. 链接器符号 + CLI 后处理:用于「编译期元数据 + 构建后处理」的所有资源/配置类元数据。
  4. 双端宏生成 RPC:#[server] 的「inventory::submit! 注册 + 宏生成 stub/handler」模式可移植到任何全栈框架。
  5. 模板编译期固化 + 动态节点池 diff:用于任何想要 Solid-like 性能的虚拟 DOM。
  6. Jump Table 热补丁:不修内存的「热重载」思路,对游戏引擎/server 都可借鉴。
  7. TOML 统一 + Handlebars 模板多平台 manifest:跨平台配置文件 + 模板替换的普适模式。

关键设计决策

值得学习的架构选择和 trade-off:

  1. 双层渲染管线:编译期生成静态 Template(TemplateNode::{Element, Text, Dynamic}),运行时只 diff Dynamic 节点。RSX 宏把 rsx! 编译成 static __TEMPLATE_ROOTS + 动态节点池,diff 时模板相同则只比 dynamic nodes、属性不同则只调 set_attribute。牺牲一些动态性(模板结构变化必须换 template id 整体替换),换取 Solid 级别的细粒度更新。
  2. WriteMutations trait 抽象 DOM 操作:每个 renderer 自己实现同一组件代码要跑在浏览器/WebView/原生 GPU/服务端字符串/WS 推送。增加一层 trait 间接(schema 必须稳定),但获得「一份 RSX 五端跑」。
  3. Subsecond 增量 patch dylib:工具链产出 .so/.dll 增量 patch dylib,运行时通过 dlsym/GetProcAddress 抓 main 真实地址算 ASLR 偏移,更新全局 APP_JUMP_TABLE(不改进程内存);patch 通过 devtools WebSocket 推过来。
  4. Manganis 用链接器符号 + CLI 后处理做编译期 asset 系统:解决传统 include_bytes!/build.rs 拖慢 rust-analyzer、绑死 Cargo、缓存脆弱的痛点;占位哈希 + volatile read 模式(怕优化器把符号读没了)。
  5. RSX 热重载和 Subsecond 是两套正交系统:改 rsx! body 但 Rust 表达式不变 → 「diff templates + 三池(dynamic text/nodes/attrs)贪心匹配」;改 Rust 代码 → 走 Subsecond jump table。

竞品格局与定位

竞品对比矩阵

维度DioxusLeptosYewTauriSlintegui
Stars~38k~18k~30k109k~18k~24k
平台覆盖Web+桌面+移动+SSR+LiveViewWeb+SSRWeb桌面(需前端)原生(含嵌入式)原生(即时模式)
响应式模型Signals (细粒度)细粒度 (更纯)Agent+Msg取决于前端QML-like立即模式
DX 特色Subsecond 热补丁编译快成熟稳桌面生态大嵌入式上手快
学习曲线React 开发者友好中陡需前端栈中(QML DSL)低
Bundle 体积中等较小小系统 WebView (小)小小
商业化公司+Deploy 服务社区为主社区为主公司+生态公司商业支持社区为主

差异化护城河

技术护城河 + 生态护城河 + 信任护城河三层叠加:

  • 技术:Subsecond 热补丁 + 5 端统一抽象(WriteMutations)+ WASM-split + Manganis asset + 双端 RPC 宏,单点切入很难凑齐。
  • 生态:Apache 2.0(已消除早期自研许可证争议)+ 文档站 dogfood + Dioxus Labs 公司全职 + FutureWei/Airbus/YC/Cognition sponsor。
  • 信任:5 年迭代 + 469 贡献者 + 已发布多个生产级 .ipa/.apk + Krausest Benchmark 持续对标 JS 框架。

竞争风险

  • Web 端被 Leptos 分流:纯 Rust Web 性能党可能倾向 Leptos(SSR/SSG 更快、编译更快、社区文档更聚焦)。
  • 移动端产品化速度:Issue #3870(移动端权限系统长尾)若追不上 Flutter 成熟度会被边缘化——目前 Dioxus 的「全平台统一」叙事在移动端仍是 rough edges。
  • Subsecond 的 tip-crate 限制不解决:复杂多 crate 项目体验会落后 Tauri/Next.js,影响 DX 口碑。
  • 桌面被 Tauri 反包:Tauri 可与 Dioxus 嵌套使用(Dioxus 作为 Tauri 前端),但 Tauri 桌面生态/插件市集大、商业化更成熟,存在「用户直接选 Tauri + React」的简化路径。

生态定位

在整个技术生态中,Dioxus 扮演的角色是 「Rust 跨端全栈 framework」——不是最快的、不是最小的、不是最纯的,但是唯一一个把 web+desktop+mobile+SSR+hot-patch+asset bundling 全做齐的。目标用户是「想用 Rust 一次写多端」的团队,与「纯 Web 性能党」(Leptos)、「系统壳党」(Tauri)、「嵌入式 GUI 党」(Slint)、「工具调试党」(egui)错位竞争。

套利机会分析

  • 信息差:Dioxus 在中文社区的关注度与英文社区不对等。38k stars + Dioxus Labs 全职公司 + Subsecond 硬核创新,中文技术媒体尚未充分报道,存在 1-2 个月的信息差窗口。
  • 技术借鉴:Generational Box Copy 引用 + Manganis 链接器符号 + CLI 后处理 + Jump Table 热补丁,至少四个独立创新点可直接迁移到其他 Rust 项目,不必「用了 Dioxus 整套」才能借鉴。
  • 生态位:填补了「用 Rust 写跨端 App 而非 Web-only 也不是 GUI-only」的生态空白——Flutter 占据移动+桌面,React Native 占据移动,Tauri 占据桌面,但没有人能同时把 Web + Desktop + Mobile + SSR 跑在一份 Rust 代码里。
  • 趋势判断:Rust 在「production-ready UI」的拐点上(参考 WebAssembly、wgpu、WebView 生态成熟度),Dioxus 已 5 年持续迭代,后发优势在于公司化运营 + 资本支持 + Deploy 商业化闭环,而非单纯技术领先。Subsecond 是 2025-2026 年 Rust DX 的硬通货,Dioxus 抓住了这波。

风险与不足

诚实评估:

  • WASM bundle 体积偏大:相比纯 Web 框架(Yew/Leptos),Dioxus 的 WASM 输出仍偏大,移动端弱网场景需 wasm-split 优化。
  • 文档覆盖仍存在盲区:尽管 docs/guide 修改 1,577 次、架构文档 13 篇,部分高级特性(Subsecond 配置、Manganis 复杂用法)文档深度不够。
  • 移动端成熟度低于桌面/Web:权限系统、平台 Channel、性能调优仍在补齐(#3870 移动端权限),短期无法挑战 Flutter 移动端地位。
  • Subsecond tip-crate 限制:复杂多 crate 项目体验受损,TLS 在库 crate 里不重绑,结构体布局不能改。
  • 贡献集中度高:双核心维护者占 61.5%,项目长期依赖 jkelleyrtp + ealmloff 的持续投入(核心人物风险)。

行动建议

如果你要用它

  • 场景匹配:需要 Rust 团队同时发布 Web+Desktop+Mobile 三端应用;想要 React DX 但要 Rust 类型系统;可接受 WASM/WebView/系统原生混部的工程团队。
  • 不建议场景:纯 Web 项目(选 Leptos 更快)、纯嵌入式 GUI(选 Slint)、纯桌面系统壳(选 Tauri 生态更成熟)、纯工具型调试 UI(选 egui 上手更快)。
  • 起步路径:examples/ 目录有 10 大类示例,先跑 01-app-demos 感受 RSX + Signals,再读 notes/architecture/ 13 篇架构文档理解 WriteMutations / GenerationalBox / Subsecond 三大支柱。

如果你要学它

重点关注的文件/模块:

模块路径学什么
VDOM 核心packages/core/src/virtual_dom.rs(503 次修改)双层渲染管线:template + dynamic node pool
Diff 算法packages/core/src/diff.rs(345 次修改)Subtree memoization 实现
节点数据packages/core/src/nodes.rs(368 次修改)Element/Template 结构设计
桌面入口packages/desktop/src/lib.rs(213 次修改)Wry WebView + Sledgehammer 协议
Web 入口packages/web/src/lib.rs(191 次修改)DOM mutation 协议
Signalspackages/signals/Generational Box Copy 引用实现
Subsecondpackages/subsecond/Jump table 热补丁 + ThinLink
Manganispackages/manganis/链接器符号 + CLI 后处理 asset 系统
架构文档notes/architecture/00~1213 篇自述架构演进

如果你要 fork 它

可以改进的方向:

  1. 提升 WASM bundle 体积:进一步优化 wasm-split 启发式(目前只切异步函数,可扩展到同步组件树)。
  2. Subsecond 库 crate 支持:扩展动态链接器 patch 到库 crate 而非仅 tip crate——这是 Subsecond 最大的体验瓶颈。
  3. 移动端原生组件库:Dioxus-community 已拆分但成熟度不够,可孵化 Material Design 3 / Cupertino 标准组件库。
  4. Dioxus.toml 扩展:增加更多 high-level 配置项(push 通知、deep link、background mode),进一步抽象平台差异。
  5. 持久化状态标准化:Issue #1426 长期讨论的痛点,可做「开箱即用」的状态持久化层(IndexedDB + SQLite + 文件系统)。

知识入口

资源链接
DeepWiki未收录
Zread.ai未收录
关联论文无(Dioxus 是应用框架,非研究项目;2022 年 「subtree memoization」 博文有技术深度但非学术论文)
在线 Demo无官方 Playground;官网 Tour 视频 https://www.youtube.com/watch?v=WgAjWPKRVlQ ;examples 目录提供大量可运行样例
架构文档notes/architecture/00_introduction.md ~ 12_* 共 13 篇
Issue 信号#4195 Subsecond + ASLR / #1426 持久化状态 / #418 Krausest Benchmark / #3870 移动端权限

相关报告