GitHub 推荐:38K stars、单仓五端:Rust 全栈 UI 框架 Dioxus 怎么把 React DX 搬进 Rust
一句话总结
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 五端统一架构的视觉门面,「One codebase, every platform.」 的标志性表达。

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

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

iOS + Android 原生应用展示——WebView 与原生 UI 的混合渲染。
▶️ Dioxus 官方 Tour 视频(10 分钟体验全平台开发流程)
项目画像
| 维度 | 数据 |
|---|---|
| GitHub | https://github.com/dioxuslabs/dioxus |
| Star / Fork | 37,994 / 1,784 |
| Watcher | 192 |
| 代码行数 | 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) |
| 总 commit | 7,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-communityOrg,鼓励第三方电池式扩张。 - 明确不做什么:不替代底层 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」做成一个互相喂数据的整体,单点切入很难凑齐。
核心价值提炼
创新之处
按新颖度 × 实用性 × 可迁移性综合排序:
- Subsecond jump-table 热补丁 + ThinLink(5/4/4):不动进程内存,靠运行时更新
APP_JUMP_TABLE把函数调用路由到新版本;同时用 ThinLink 大幅加速 Rust 增量编译。限制是仅 tip crate,库 crate 改动会被忽略。适用:游戏引擎、长跑服务端、桌面 App 的实时开发循环。 - Generational Box Copy 引用(4/5/4):用 generation 计数器做 Rust 安全 interior mutability + 失效检测,让
Signal<T>/Store<T>像Copy一样自由传递,Owner Drop 时整体失效。任何需要「Copy 引用 + 自动失效」的状态容器都能套。 - Manganis 编译期 asset + 链接器符号 + CLI 后处理(4/5/4):
asset!()宏产出__ASSETS__链接器符号,CLI 用object/walrus反向 patch 二进制;rust-analyzer 零负担、跨构建系统可移植。 #[wasm_split]图分割 WASM chunk(4/4/3):用 walrus + relocation 段建函数调用图,按#[wasm_split(name)]切片,自动抽出共享 chunk + JS runtime。适用:大型 WASM 应用首屏优化。- Sledgehammer 二进制突变协议(3/5/3):浏览器/WebView/LiveView 三端共享一套紧凑二进制格式描述 DOM mutation(create_text_node、append_children、set_attribute、replace_with 等栈式操作),通过 WebSocket/JS 解释器消费。
#[server]宏生成双端 RPC stub + axum handler(3/5/4):同一函数同时编译为客户端 fetch stub 和服务端 handler,用inventory::submit!全局注册。RestEndpointPayload<T, E>标准化 wire 协议。Dioxus.toml统一权限配置 + Handlebars 模板映射(3/4/4):统一 high-level 权限(location/camera)→ 自动映射到 iOS Info.plist / Android Manifest 的原生标识。- Subtree memoization for Solid-like perf(3/4/3):在 VDOM diff 时按子树做 memoization 跳过未变化的子树,逼近 SolidJS 细粒度(2022-12 博文《Making Dioxus (almost) as fast as SolidJS》)。
可复用的模式与技巧
直接可迁移到其他项目的设计模式和代码技巧:
- Trait 抽象 + 多 renderer 适配:
WriteMutations是普适的「一个 model N 个 view」模式,迁移到任何「一套组件多端渲染」项目。 - Generational Box 失效检测:用于任何「Copy 语义 + 自动回收」的状态管理。
- 链接器符号 + CLI 后处理:用于「编译期元数据 + 构建后处理」的所有资源/配置类元数据。
- 双端宏生成 RPC:
#[server]的「inventory::submit!注册 + 宏生成 stub/handler」模式可移植到任何全栈框架。 - 模板编译期固化 + 动态节点池 diff:用于任何想要 Solid-like 性能的虚拟 DOM。
- Jump Table 热补丁:不修内存的「热重载」思路,对游戏引擎/server 都可借鉴。
- TOML 统一 + Handlebars 模板多平台 manifest:跨平台配置文件 + 模板替换的普适模式。
关键设计决策
值得学习的架构选择和 trade-off:
- 双层渲染管线:编译期生成静态
Template(TemplateNode::{Element, Text, Dynamic}),运行时只 diff Dynamic 节点。RSX 宏把rsx!编译成static __TEMPLATE_ROOTS+ 动态节点池,diff 时模板相同则只比 dynamic nodes、属性不同则只调set_attribute。牺牲一些动态性(模板结构变化必须换 template id 整体替换),换取 Solid 级别的细粒度更新。 WriteMutationstrait 抽象 DOM 操作:每个 renderer 自己实现同一组件代码要跑在浏览器/WebView/原生 GPU/服务端字符串/WS 推送。增加一层 trait 间接(schema 必须稳定),但获得「一份 RSX 五端跑」。- Subsecond 增量 patch dylib:工具链产出
.so/.dll增量 patch dylib,运行时通过dlsym/GetProcAddress抓main真实地址算 ASLR 偏移,更新全局APP_JUMP_TABLE(不改进程内存);patch 通过 devtools WebSocket 推过来。 - Manganis 用链接器符号 + CLI 后处理做编译期 asset 系统:解决传统
include_bytes!/build.rs 拖慢 rust-analyzer、绑死 Cargo、缓存脆弱的痛点;占位哈希 + volatile read 模式(怕优化器把符号读没了)。 - RSX 热重载和 Subsecond 是两套正交系统:改
rsx!body 但 Rust 表达式不变 → 「diff templates + 三池(dynamic text/nodes/attrs)贪心匹配」;改 Rust 代码 → 走 Subsecond jump table。
竞品格局与定位
竞品对比矩阵
| 维度 | Dioxus | Leptos | Yew | Tauri | Slint | egui |
|---|---|---|---|---|---|---|
| Stars | ~38k | ~18k | ~30k | 109k | ~18k | ~24k |
| 平台覆盖 | Web+桌面+移动+SSR+LiveView | Web+SSR | Web | 桌面(需前端) | 原生(含嵌入式) | 原生(即时模式) |
| 响应式模型 | 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 协议 |
| Signals | packages/signals/ | Generational Box Copy 引用实现 |
| Subsecond | packages/subsecond/ | Jump table 热补丁 + ThinLink |
| Manganis | packages/manganis/ | 链接器符号 + CLI 后处理 asset 系统 |
| 架构文档 | notes/architecture/00~12 | 13 篇自述架构演进 |
如果你要 fork 它
可以改进的方向:
- 提升 WASM bundle 体积:进一步优化 wasm-split 启发式(目前只切异步函数,可扩展到同步组件树)。
- Subsecond 库 crate 支持:扩展动态链接器 patch 到库 crate 而非仅 tip crate——这是 Subsecond 最大的体验瓶颈。
- 移动端原生组件库:Dioxus-community 已拆分但成熟度不够,可孵化 Material Design 3 / Cupertino 标准组件库。
- Dioxus.toml 扩展:增加更多 high-level 配置项(push 通知、deep link、background mode),进一步抽象平台差异。
- 持久化状态标准化: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 移动端权限 |