Changesets 适合解决什么发布问题?组件库如何做版本管理?
简化版
Changesets 用来管理多包仓库或组件库的版本变更、changelog 和发布流程。开发者在功能 PR 中声明本次变更影响哪些包、属于 major/minor/patch,合并后统一生成版本提交并发布,避免人工改版本和漏写更新日志。
详细版
组件库发布常见问题:
- 多个包之间版本依赖复杂。
- 人工修改 version 容易冲突。
- changelog 容易漏写。
- breaking change 没有显式记录。
- CI 发布流程不稳定。
Changesets 典型流程:
- 开发者运行
changeset选择影响包和版本类型。 - PR 中提交
.changeset/*.md。 - 主分支合并后,CI 生成版本 PR。
- 版本 PR 合并后发布 npm。
- 自动生成 changelog。
面试答题重点是:版本管理要和代码评审、语义化版本、发布自动化连起来。
完整版教学
一、组件库发布为什么容易乱
业务应用通常只有一个版本,组件库或 monorepo 可能有多个包:按钮包、图标包、主题包、工具包。一次改动可能只影响 @ui/button,也可能影响所有包。人工维护版本很容易漏改、乱改或产生冲突。
Changesets 的思路是把“这次改动对版本的影响”前移到开发 PR 中记录。代码评审时不只看实现,也看版本类型是否合理。
功能 PR
├─ 代码修改
└─ changeset 文件:影响包 + patch/minor/major + 说明
二、语义化版本是发布语言
Changesets 依赖语义化版本规则:patch 表示修 bug,minor 表示兼容新增能力,major 表示破坏性变更。版本号不是装饰,它告诉使用者升级风险。
例如当前版本 1.4.2:修复按钮 disabled 样式可发 1.4.3;新增 loading 属性可发 1.5.0;删除 type="primary" 改成 variant="primary" 应发 2.0.0。如果破坏性变更只发 patch,使用者自动升级后就会炸。
| 版本类型 | 含义 | 示例 |
|---|---|---|
| patch | 兼容修复 | 修复样式错位 |
| minor | 兼容新增 | 新增组件属性 |
| major | 破坏变更 | 删除旧 API |
三、changeset 文件让变更可审查
开发者运行 Changesets 命令后会生成一个 Markdown 文件,里面记录影响包、版本类型和 changelog 文案。这个文件跟着 PR 一起 review,团队可以及时纠正版本类型。
---
"@acme/button": minor
---
新增 loading 属性,支持按钮提交中的加载态。
这样做比合并后一口气回忆“这周改了什么”可靠得多。每个变更都在发生时记录,changelog 自然更准确。
四、多包依赖需要自动联动
如果 @ui/button 升级后 @ui/pro-form 依赖它,发布工具要处理内部依赖版本。否则用户安装 pro-form 可能仍然引用旧 button。Changesets 能根据 workspace 依赖关系更新相关包。
数字例子:一个组件库有 30 个包,人工检查依赖联动很容易漏。只要漏 1 个内部依赖版本,用户安装后就可能出现“文档说有新属性,实际包里没有”的错配。
五、固定版本和独立版本要按项目选择
多包发布有两种思路:所有包统一版本,或每个包独立版本。统一版本简单,适合组件强绑定;独立版本更精细,适合包之间变化频率差异大。Changesets 更常支持独立版本,但团队要先定策略。
| 策略 | 优点 | 缺点 |
|---|---|---|
| 统一版本 | 用户理解简单 | 小改动也牵动所有包 |
| 独立版本 | 版本更精细 | 依赖和发布更复杂 |
六、发布要和 CI 权限绑定
成熟流程通常不允许开发者本地随手 npm publish。版本 PR 合并后,由 CI 使用受控 token 发布,保证构建、测试、版本生成、npm 发布和 git tag 在同一流程内完成。失败时也更容易追踪。
发布心法:版本号是给使用者看的风险提示,changelog 是给未来排障的人看的证据链。
七、常见误区与追问
- 误区:Changesets 只是自动改 version。 它更重要的是把版本影响和 changelog 纳入 PR 流程。
- 误区:修复任何问题都发 patch。 如果修复改变了公开 API 行为,可能需要 minor 或 major。
- 误区:组件库可以本地手动 publish。 正式库应通过 CI 发布,控制权限和可追溯性。
- 追问:如何判断 major? 删除 API、改变默认行为、类型不兼容等让使用者必须改代码的变更应为 major。
- 追问:多包依赖如何联动? 发布工具根据 workspace 关系更新内部依赖版本。
- 追问:changelog 文案怎么写? 写用户能感知的变更,不写“修改代码”这类内部描述。
八、加强记忆
Changesets 用“PR 记录版本影响,CI 统一发布”来记。开发时声明影响包和 semver 类型,合并后自动生成版本与 changelog,再由 CI 发布。它让组件库发布从手工记忆变成可审查、可追踪、可回滚的流程。