2023年,Rust生态里冒出一个实验性项目,叫Xilem。它想做一件事:把React、SwiftUI那套"声明式UI"的玩法,原封不动搬进系统级编程语言。
听起来像把跑车引擎塞进拖拉机——理论上能跑,但没人知道会不会散架。
先搞清楚:Masonry是砖,Xilem是房子
这个项目其实分两层。底层叫Masonry,负责 retained widget tree(保留式控件树)——说白了,就是传统GUI框架那套"画完东西记得留着"的机制。事件处理、更新渲染、脏区重绘,全在这层搞定。
Xilem则在Masonry上面搭了一层反应式抽象。用户写代码时面对的是轻量级的 view tree(视图树),状态一变,框架自动算出最小变更集,同步到Masonry的实体控件上。
官方文档有个直白建议:如果你不确定该用哪个,选Xilem。想省事的应用开发者选Xilem;想造轮子的人,才去碰Masonry。
这种分层设计在Rust UI圈不算多见。多数项目要么像egui那样 immediate mode(即时模式),每帧全量重画;要么像iced那样 retained mode(保留模式),但API偏命令式。Xilem试图两头占:底层保留性能,上层声明式开发。
技术债来得比预期早
项目仓库里有个细节值得玩味。Cargo配置里强制开了 split-debuginfo="unpacked",理由是"依赖太多,target文件夹会炸"。
这是Rust生态的通病。Xilem依赖wayland、vulkan-loader、libxkbcommon这些系统库,Linux用户得先装一堆dev包。Fedora和Ubuntu的安装命令写满了README,NixOS用户倒是有个flake,但文档特意注明:"我们不保证这玩意能用,出问题自己修。"
更微妙的是MSRV(最低支持Rust版本)。文档写到这里突然断了,像被人按了删除键。实验性项目的标准待遇:连"我们承诺维护到哪个版本"都懒得写完。
但代码是实的。to_do_mvc示例跑起来长这样:一个经典待办事项应用,窗口边框、输入框、列表项,全是原生渲染,没有WebView。cargo run --example to_do_mvc 一键启动,对想快速验货的人足够友好。
后端分裂:Web还是原生?
Xilem有个设计选择会让架构师皱眉——它同时支持两个后端。
一个是Masonry后端,走原生窗口、GPU加速、系统级事件循环。另一个是Web后端,把同样的视图树编译成WASM,跑在浏览器里。
这种"一份代码,两处运行"的野心,React Native和Flutter都试过。区别在于Xilem用Rust写,没有垃圾回收,内存布局可控。代价是编译慢、调试痛苦、生态碎片化。
GitHub上有个第三方项目叫xilem-chess,作者Stefan Salewski拿它做了个国际象棋界面。截图显示棋盘渲染、棋子拖拽、回合记录,功能完整。这是Xilem目前少有的公开案例——官方示例之外,真实用户愿意押注的产物。
社区在吵什么
Rust UI框架的江湖从来不缺玩家。egui占着"简单快"的生态位,Tauri用Web技术栈收割前端开发者,Slint走商业化路线卖许可证。Xilem的差异化筹码是"原生性能+现代架构",但这个组合的市场需求到底多大,没人说得清。
一个观察:Xilem的API设计明显借鉴Elm架构。Model-Update-View的消息循环,函数式状态管理,跟Rust的所有权模型倒是契合。但Elm在Web端的失败案例(性能瓶颈、调试困难)会不会在原生领域重演?
仓库的ARCHITECTURE.md文件值得细读,如果你打算贡献代码的话。它解释了为什么视图树要设计得"轻量"——每次状态变更都重建整棵树,靠diff算法优化,这跟React的虚拟DOM如出一辙。但原生UI的控件创建成本远高于DOM节点,diff算法的开销能不能被渲染优化抵消,是悬而未决的工程问题。
实验性项目的诚实之处在于,它不把"生产就绪"挂在嘴边。README里找不到"里程碑""革命性"这类词,只有冷静的层级划分:Masonry是工具包,Xilem是框架,你按需求自取。
这种克制反而让技术评估变得容易。你不用猜作者有没有夸大,看代码结构、依赖清单、示例完整度,自己下结论。
cargo add xilem 就能开始实验。但你会把它用在什么项目上?
热门跟贴