Chakra UI/Zag 项目迁移指南:从 v0 到 v1 的全面升级
2025-07-08 06:28:38作者:裘旻烁
前言
Chakra UI/Zag 作为一个跨框架的组件库,经过多年的迭代和优化,终于迎来了 v1 版本的重大更新。本次升级聚焦于性能优化和包体积缩减两大核心目标,通过采用各框架原生的响应式机制,实现了显著的性能提升。
升级概览
性能提升亮点
- 渲染性能:组件渲染速度提升 1.5-4 倍
- 包体积:核心包体积缩减 98%,从 13.78KB 降至 1.52KB
- API 简化:统一了组件控制逻辑,降低了使用复杂度
主要变更点
1. useMachine API 重构
旧版用法:
const [state, send] = useMachine(avatar.machine({ id: useId() }))
新版用法:
const service = useMachine(avatar.machine, { id: useId() })
关键变化:
- 不再返回
[state, send]
元组,而是返回service
对象 machine
现在是直接传递的对象而非函数
类型提示: 对于泛型组件(如 Combobox),需进行类型断言:
useMachine(combobox.machine as combobox.Machine<Item>)
2. 受控/非受控模式统一
值控制
旧版:
useMachine(numberInput.machine({ value: "10" }), {
context: { value: "10" }
})
新版:
useMachine(numberInput.machine, {
defaultValue: "10", // 默认值
value: "10" // 受控值
})
展开状态控制
旧版:
useMachine(dialog.machine({ open: true }), {
context: { open: true, "open.controlled": true }
})
新版:
useMachine(dialog.machine, {
defaultOpen: true, // 默认状态
open: true // 受控状态
})
3. 类型定义变更
<component>.Context
重命名为 <component>.Props
4. Toast 组件重构
新版采用 store 模式管理 toast 状态:
const toaster = toast.createStore({ /* 配置 */ })
const service = useMachine(toast.group.machine, { store: toaster })
// 使用 store 管理 toast
toaster.create({ title: "Hello", description: "World" })
性能对比数据
我们通过 10,000 个组件实例的压测,得到了以下性能提升数据:
组件 | 挂载时间提升 | 更新时间提升 |
---|---|---|
Avatar | 27% | 99% |
Accordion | 61% | - |
Dialog | 80% | - |
Tooltip | 82% | - |
Tabs | 6% | - |
重大修复
- Menu:修复右键菜单二次点击位置不更新问题
- Avatar:修复
api.setSrc
失效问题 - File Upload:修复目录模式下拖拽失效问题
- Carousel:
- 修复初始页不生效问题
- 修复分页指示器同步问题
移除的 API
-
通用移除:
- 移除
useActor
,统一使用useMachine
- 移除
open.controlled
属性
- 移除
-
分页组件:
- 移除
api.setCount
,改用count
属性
- 移除
-
选择类组件:
- 移除
api.setCollection
,改用collection
属性
- 移除
开发者注意事项
-
内部变更:
activities
重命名为effects
prop
、context
和refs
现在需要显式传递给机器watch
语法有重大变更,类似 React 的useEffect
-
核心机制:
createMachine
现在只是标识函数,实际逻辑转移到框架的useMachine
钩子中
升级建议
- 对于大型项目,建议分组件逐步迁移
- 使用全局搜索替换工具批量修改
useMachine
调用方式 - 特别注意 Toast 组件的 store 模式变更
- 对于性能敏感场景,建议重新测试关键路径
本次升级虽然带来了破坏性变更,但通过统一的 API 设计和显著的性能提升,将为开发者带来更好的开发体验和更优的运行时性能。