包管理提速:pnpm + Workspace + Changesets 搭建版本体系

多包项目如果还用 npm install 单仓库维护,效率会被拖垮。今天教你用 pnpm + Workspace + Changesets 搭出一套"既快又有版本管理"的包管理体系:依赖安装提速、包间共享、自动生成 changelog、自动发版,一条龙服务。

🎯 目标

  • 依赖安装和磁盘占用更省(pnpm)。
  • 项目内多个包共享依赖(Workspace)。
  • 自动生成版本号、changelog、发包命令(Changesets)。

🧱 初始化 pnpm Workspace

pnpm-workspace.yaml

yaml 复制代码
packages:
  - 'apps/*'
  - 'packages/*'

执行:

bash 复制代码
pnpm install
  • pnpm 使用内容寻址存储,依赖只安装一次。
  • pnpm list --depth 0 查看依赖树。

📦 包互相引用

packages/utils/package.json

json 复制代码
{
  "name": "@my-org/utils",
  "version": "0.0.0",
  "main": "dist/index.js"
}

主应用引用:

json 复制代码
{
  "dependencies": {
    "@my-org/utils": "workspace:*"
  }
}
  • workspace:* 表示使用当前仓库内的最新构建。

🧰 Changesets 安装

bash 复制代码
pnpm install -D @changesets/cli
pnpm changeset init

生成 .changeset 文件夹。

新增改动:

bash 复制代码
pnpm changeset
  • 选择需要发版的包、选择版本(patch/minor/major)。

  • 自动生成变更文件:

    md 复制代码
    ---
    '@my-org/utils': minor
    ---
    新增日期格式化工具

🚀 发版流程

  1. pnpm changeset version:根据变更文件更新 package.json 版本。
  2. pnpm install:同步 lockfile。
  3. pnpm changeset publish:使用 npm token 自动发布。

在 CI 中:

yaml 复制代码
- run: pnpm changeset version
- run: pnpm install --frozen-lockfile
- run: pnpm changeset publish
  • 可以在 PR 合并后自动发 Beta 包。

⚙️ 与 Turborepo 配合

  • Changesets 创建 release 标签。
  • Turborepo 的 pipelines 自动根据版本变化构建对应包。
  • 远程缓存 + pnpm store 让构建更快。

🧯 常见坑

问题 现象 解决
pnpm 与 npm 脚本不兼容 有些脚本默认用 npm 在 CI 中使用 pnpm,对第三方脚本加 --
发版失败 npm token 权限不足 在仓库 secrets 中设置 NPM_TOKEN,权限至少 publish
包版本混乱 手动改版本号 使用 Changesets 统一管理,禁止手动修改
Git 提交变更文件冲突 多人创建 changeset 合并时保留所有变更文件,执行 pnpm changeset version 解决

🏁 小练习

  1. 搭建一个包含主应用 + 组件库的 workspace,尝试共享依赖。
  2. 为组件库新增功能,使用 Changesets 自动生成版本并发包到 npm 测试仓库。
相关推荐
winfredzhang5 分钟前
用 wxPython + ECharts + 阿里矢量地图,做一个可离线兜底的上海雨量看板
前端·javascript·echarts
索西引擎16 分钟前
【React】Immer.js 在现代 Redux 生态中的角色:不可变性保障的工程化实现与开发体验优化
前端·javascript·react.js
kisshyshy18 分钟前
《川剧变脸 × React 状态管理?我在浏览器里跑了个端侧大模型》
前端·react.js·架构
只一19 分钟前
端侧AI实战第二章:React组件工程化 + 事件系统 + 可复用进度条(WebGPU模型加载底座)
前端·react.js
大卫陈28 分钟前
微信小程序虚拟支付实战:从「支付能力被限制」到沙箱调通的全过程
前端·后端
武子康29 分钟前
vLLM 0.25.1:服务没有报错,为什么仍会生成垃圾 Token(5 级正确性门禁 + 自动回滚条件)
前端·人工智能·后端
jyp2012110732 分钟前
Vue3 Diff 算法
前端·vue.js
胡萝卜术36 分钟前
抽象的三级跳:从原生 DOM 到 React 组件树,我们到底在解决什么问题?
前端·javascript·面试
黄敬峰39 分钟前
从零理解React:事件、组件与响应式——一个WebGPU Demo的前端笔记
前端·面试
weedsfly1 小时前
从类继承到自定义 Hook:模板方法模式的前端演进
前端·javascript·面试