Dioxus:用 Rust 一套代码打通 Web / 桌面 / 移动的全栈框架

📅 2026/7/24 3:50:43 👁️ 阅读次数 📝 编程学习
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 应用的主力渲染后端。


边界与局限(不该无条件鼓掌的地方)

  1. 移动端"first-class"有水分dx serve --platform android可以跑起来,但 iOS/Android 的 Native UI 组件(如原生导航栏、系统弹窗)仍需手动调 JNI/Objective-C。移动体验与 Flutter 或 React Native 的成熟度有明显差距。

  2. 热补丁有硬限制:struct 字段变更后不自动迁移状态;阻塞在 IO 的代码无法被 patch。在复杂业务逻辑里,这意味着热更不总是"无缝"的。

  3. 生态护城河薄:UI 组件库数量远少于 Web 生态。官方的 Primitives 库(仿 Radix UI)只有 28 个基础组件,距离生产级 Design System 还很远。

  4. 团队门槛是真实约束:Rust 的招聘难度是客观存在的。Tauri 允许前端工程师用已有 React 技能,这一点在商业项目里往往比技术纯粹性更重要。

  5. "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 保证文档与代码同步)。


延伸思考

  1. Blitz(WGPU 渲染器)一旦成熟,Dioxus 与 Flutter 的竞争关系会如何演变?Dart 和 Rust 在跨端 Native 渲染上的路线几乎相同,但 Rust 的系统编程优势是否真的能转化为 UI 框架的胜势?

  2. Subsecond 热补丁技术如果从 Dioxus CLI 剥离为独立 crate,会对整个 Rust 开发工具链产生什么影响?这可能是比 Dioxus 本身更有价值的副产品——给任意 Rust 应用带来接近动态语言的开发体验。

  3. "全团队必须会 Rust"这个门槛,在 AI 辅助编码普及后是否会显著降低?如果 LLM 能大幅降低 Rust 的上手成本,Dioxus 当前最大的推广障碍会在多大程度上消失?


📚 参考来源

  1. GitHub - DioxusLabs/dioxus: Fullstack app framework for web, desktop, and mobile. · GitHub