Dioxus:用 Rust 一套代码打通 Web / 桌面 / 移动的全栈框架
Dioxus:用 Rust 一套代码打通 Web / 桌面 / 移动的全栈框架
版本参考:主线 README + 0.7 正式发布说明(2025-09);交叉信源截止 2026-07
核心观点
Dioxus 的野心不是"做一个更好的 Yew",而是要复刻 React Native 在 JS 生态里扮演的角色——让 Rust 成为真正的全栈跨端语言。它的价值主张只有一句话:写一份 Rust + RSX 代码,dx bundle出 Web / macOS / Linux / Windows / iOS / Android 六个目标产物。
这件事在 2025 年前后才真正进入可用阶段,属于从"能跑"到"能用"的关键跨越期,不是范式突破,但在 Rust 生态里是一次重要的渐进里程碑。对标系是 Flutter(Dart 跨端)而非传统的 React/Vue。
关键信息速览
| 维度 | 具体值 |
|---|---|
| 语言 | 纯 Rust(UI 层 + 后端逻辑) |
| UI 描述 | RSX 宏(类 JSX 语法) |
| 状态管理 | Signals(细粒度响应式,类 SolidJS) |
| 后端集成 | 深度 axum 集成,Server Functions |
| 热更新 | dx serve --hotpatch(0.7 新增,subsecond 级别) |
| Web 包体积 | Hello World ~50 KB(与 React 相当) |
| 桌面包体积 | < 5 MB |
| 渲染后端 | WebView(稳定)/ WGPU Blitz(实验) |
| 许可证 | MIT / Apache-2.0 双协议 |
最核心的机制:RSX 宏 + Signals 的组合拳
Dioxus 真正巧妙的地方不是"跨端"本身,而是它如何让跨端在 Rust 里不显得别扭。
RSX 是一个编译期宏,把类 HTML 的声明式结构展开为纯 Rust 函数调用,零运行时开销。这一点比 Yew 早期的虚拟 DOM 实现更激进——Yew 在浏览器里还要跑完整的 vdom diff,Dioxus 的 diff 发生在更细粒度的 Signal 订阅上。
fn app() -> Element { let mut count = use_signal(|| 0); // Signal:只有订阅了它的节点才会重渲 rsx! { h1 { "High-Five counter: {count}" } button { onclick: move |_| count += 1, "Up high!" } button { onclick: move |_| count -= 1, "Down low!" } } }use_signal的实现借鉴了 SolidJS 的细粒度追踪:count变化时,只有引用它的h1节点重新渲染,而不是整棵组件树。这比 React 的 re-render 模型高效得多,在列表密集场景下优势明显(据 jishuzhan.net 的对比测试:10 万条列表渲染 Dioxus 89ms vs Tauri/WebView 264ms)。
0.7 的 hot-patching是另一个机制亮点:它通过显式的subsecond::call()同步点而非函数指针劫持来实现代码热替换,这使得 TCP 连接、事件监听器等资源可以在 patch 前安全清理——这是对"无状态重启热更"和"不安全内存 patch"两种极端的折中,工程上更务实。
历史脉络与横向对比
在 Rust UI 生态里,可以这样排列:
- Yew(2018):最早的 React-like 框架,只做 Web,虚拟 DOM,编译产物重。
- Leptos(2022):专注 Web 全栈,SSR 优先,Signal 响应式,Web 性能极佳,但不做桌面/移动。
- Tauri(2022):Rust 后端 + 任意 Web 前端,允许用 React/Vue/Svelte——让 Web 工程师渐进迁入,生态最成熟,打包体积最小(7.2 MB vs Dioxus 11.8 MB)。
- Dioxus(2021~今):全 Rust UI,跨 Web/桌面/移动,定位最激进。
Dioxus 比 Tauri 好在哪里:渲染性能(Rust 控制整个 UI 层,无 JS 桥)、代码统一性(一套语言无 IPC)、状态管理一致性。
Dioxus 比 Tauri 差在哪里:生态(Tauri 可直接用 npm 生态)、招聘难度(全团队必须会 Rust)、系统级功能集成(Tauri 有丰富插件)、包体积(大约大 60%)。
Dioxus 比 Leptos 的取舍:Dioxus 选择广度(跨端),Leptos 选择深度(Web SSR 极致优化)。如果你只做 Web,Leptos 的 SSR 能力更专业。
我自己的推演:接下来会怎样
0.7 里 WGPU/Blitz 原生渲染器是一个值得重点观察的信号——一旦 Blitz 稳定,Dioxus 就不再依赖系统 WebView,彻底摆脱 Windows WebView2 版本碎片化、macOS WKWebView 样式限制等历史包袱,这会让它在桌面端与 Flutter 形成真正的正面竞争。
但这件事不会在 2026 年内完成。Blitz 目前的状态是"CSS 布局有已知 bug、不支持所有 CSS 特性、JS 依赖页面无法处理",离生产可用还有相当距离。保守估计 2027 年前,WebView 仍是桌面 Dioxus 应用的主力渲染后端。
边界与局限(不该无条件鼓掌的地方)
移动端"first-class"有水分:
dx serve --platform android可以跑起来,但 iOS/Android 的 Native UI 组件(如原生导航栏、系统弹窗)仍需手动调 JNI/Objective-C。移动体验与 Flutter 或 React Native 的成熟度有明显差距。热补丁有硬限制:struct 字段变更后不自动迁移状态;阻塞在 IO 的代码无法被 patch。在复杂业务逻辑里,这意味着热更不总是"无缝"的。
生态护城河薄:UI 组件库数量远少于 Web 生态。官方的 Primitives 库(仿 Radix UI)只有 28 个基础组件,距离生产级 Design System 还很远。
团队门槛是真实约束:Rust 的招聘难度是客观存在的。Tauri 允许前端工程师用已有 React 技能,这一点在商业项目里往往比技术纯粹性更重要。
"50kb Hello World"比较有误导性:实际业务应用加上路由、状态、网络层后,WASM 产物会快速增长。0.7 引入的 WASM Bundle Splitting 是正确方向,但需要显式配置
#[wasm_split],不是自动的。
交叉验证
信源 1:jishuzhan.net《Tauri × Dioxus 架构对决》(2026-05)
这篇文章提供了具体的性能基准数据(打包体积、启动时间、内存占用、渲染性能),与原文的宣传方向部分吻合,但也揭示了原文未提及的短板:
- ✅ 认同:Dioxus 渲染性能有优势(10 万条列表 89ms vs Tauri 264ms)
- ✅ 认同:一套 Rust 代码跨端是核心价值
- ❌ 补充了原文回避的数据:Dioxus 打包体积(11.8MB)比 Tauri(7.2MB)大约 65%;内存占用 58MB vs 42MB;冷启动 156ms vs 128ms
- ❌ 明确指出设计工具集成弱、系统级插件不如 Tauri 完善,这些原文完全未提及
评价:信源可信度中等(数据来源未标注测试环境,但量级符合预期,具有参考价值)
信源 2:DioxusLabs 官方 0.7 Release Blog(2025-09-08)
这是官方一手资料,直接证实并细化了原文的若干声明,同时暴露了一些限制:
- ✅ 证实了热补丁功能确实在 0.7 落地,且耗时近一年开发
- ✅ 证实了 WGPU/Blitz 渲染器上线,但明确标注"work in progress"
- ❌ 官方亲口承认热补丁的三个硬限制(struct 字段变更不自动迁移、依赖
subsecond::call()同步点、阻塞 IO 无法 patch)——原文 README 对此只字未提 - 补充了 WASM Bundle Splitting、Stores 嵌套响应式状态等原文未详细说明的特性
评价:最可信的信源,官方 changelog 对自身限制描述相当诚实,值得直接参考。
个人启发
对 Rust 开发者:如果你有"用 Rust 写个小工具/面板"的需求,Dioxus 0.7 的入门体验已经足够顺滑(dx serve热更 + axum 后端集成是真实生产力)。推荐从桌面端开始,避开移动端的复杂配置。
对决策者/技术 Leader:在以下条件同时成立时才考虑 Dioxus:① 团队已有 Rust 积累;② 项目明确需要跨 Web + 桌面两端;③ 不急于上市(生态还在成熟中)。若只做 Web,Leptos 更专业;若有 Web 前端团队,Tauri 更务实。
对普通学习者:Dioxus 是学习 Rust 响应式 UI 编程的极佳实战项目——RSX + Signals 的心智模型比 React Hooks 更清晰,官方文档质量相当高(有 CI 保证文档与代码同步)。
延伸思考
Blitz(WGPU 渲染器)一旦成熟,Dioxus 与 Flutter 的竞争关系会如何演变?Dart 和 Rust 在跨端 Native 渲染上的路线几乎相同,但 Rust 的系统编程优势是否真的能转化为 UI 框架的胜势?
Subsecond 热补丁技术如果从 Dioxus CLI 剥离为独立 crate,会对整个 Rust 开发工具链产生什么影响?这可能是比 Dioxus 本身更有价值的副产品——给任意 Rust 应用带来接近动态语言的开发体验。
"全团队必须会 Rust"这个门槛,在 AI 辅助编码普及后是否会显著降低?如果 LLM 能大幅降低 Rust 的上手成本,Dioxus 当前最大的推广障碍会在多大程度上消失?
📚 参考来源
- GitHub - DioxusLabs/dioxus: Fullstack app framework for web, desktop, and mobile. · GitHub
