最近看到 shadcn/ui 把默认底层从 Radix 切到 Base UI,第一反应不是“迁移成本”,而是这件事标志开源组件库正在从“封装即正义”回归“原生语义优先”。古人说“药有单行者,有相须者”,成药方便,但真到要对症加减时,还是生药材更趁手。Radix 做得不坏,它用 headless 把无障碍、焦点管理和生命周期都包起来,对快速搭界面的人很友好;可这也意味着渲染行为、状态机和样式约束被藏进了黑盒,想微调一处,常常得绕过它预设的钩子。
Base UI 的姿态完全不同:它提供的是更贴近 HTML 原语的底层原语,把“是否添加某个行为”的开关交还开发者。shadcn 选它,骨子里是在主张控制权——组件库不该替你决定所有渲染细节,而是该像生药,给你配伍的自由,而不是一副成药。
这背后其实是现代前端一个挺深层的张力:我们享受了抽象带来的便利,却又越来越厌恶被抽象绑架。shadcn 走这一步,等于公开宣布“可组合性才是真正的开源自由”。过去几年,大家追捧把按钮、弹窗、下拉框打包成开箱即用的组件;现在风向变了,开发者想要的是能拆开、能重写、能追踪到 DOM 的零件。从这个角度看,Base UI 的兴起不是 Radix 的失败,而是开源 UI 生态的一次范式迁移。你们觉得,这种“原生优先”的潮流会不会成为下一轮组件库的默认形态?