关于 pnpm
这项开发技能介绍如何用 pnpm 管理 JavaScript 和 TypeScript 依赖及工作区,涵盖包操作、单仓库工作流、锁文件和配置实践。
主要功能
- 01依赖安装与管理
- 02工作区和单仓库配置
- 03包筛选与任务执行
- 04依赖覆盖和 peer 设置
- 05发布工作区包
- 06锁文件与 CI 缓存实践
适用场景
- 01配置 pnpm 工作区
- 02在选定包中运行脚本
- 03管理内部工作区依赖
- 04为 CI 准备依赖安装
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ mindrally/ skills --skill pnpm安装后在 Claude Code 中输入/pnpm确认已加载。
详细介绍
pnpm 开发
你是 pnpm 专家。pnpm 是一款适用于 JavaScript 和 TypeScript 项目的包管理器,速度快且节省磁盘空间。
核心原则
- 始终使用 pnpm(而非 npm 或 yarn)管理包
- 利用 pnpm 严格的依赖解析机制,提升安全性
- 使用内容寻址存储,节省磁盘空间
- 保持锁文件(
pnpm-lock.yaml)一致
安装和设置
- 全局安装 pnpm:
npm install -g pnpm - 或使用 corepack:
corepack enable && corepack prepare pnpm@latest --activate - 在
package.json中指定 pnpm 版本:{ "packageManager": "[email protected]" }
工作区配置
创建 pnpm-workspace.yaml 以设置 monorepo:
packages:
- 'apps/*'
- 'packages/*'
- 'tooling/*'
- 使用 glob 模式定义工作区包的位置
- 所有匹配到的、包含
package.json的目录都会成为工作区包
依赖管理
- 安装依赖:
pnpm install - 将依赖添加到指定工作区:
pnpm add lodash --filter @org/my-app pnpm add -D typescript --filter @org/my-lib - 对内部依赖使用工作区协议:
{ "dependencies": { "@org/shared-utils": "workspace:*", "@org/ui": "workspace:^" } } - 协议选项:
workspace:*- 任意版本,发布时会替换为实际版本workspace:^- 兼容版本workspace:~- 仅限补丁版本
筛选命令
在指定包中运行命令:
pnpm --filter @org/my-app dev
pnpm --filter "./apps/*" build
pnpm --filter "...@org/my-lib" test # Include dependents
pnpm --filter "@org/my-lib..." build # Include dependencies
- 筛选模式:
--filter <package-name>- 指定包--filter "./path/*"- 按路径筛选--filter "...<pkg>"- 包及其依赖它的包--filter "<pkg>..."- 包及其依赖项
脚本和任务运行
- 在多个工作区中运行脚本:
pnpm -r run build # Run in all packages pnpm -r --parallel run dev # Run in parallel pnpm -r --stream run test # Stream output - 为常见操作定义根级脚本:
{ "scripts": { "build": "pnpm -r run build", "dev": "pnpm --filter @org/web dev", "lint": "pnpm -r run lint", "test": "pnpm -r run test" } }
依赖提升
在 .npmrc 中配置提升:
# Strict mode - no hoisting
hoist=false
# Selective hoisting
public-hoist-pattern[]=*eslint*
public-hoist-pattern[]=*prettier*
# Shamefully hoist everything (not recommended)
shamefully-hoist=true
- 优先使用严格模式,以实现更好的依赖隔离
- 对需要扁平
node_modules的工具使用公共提升
对等依赖
在 .npmrc 中配置对等依赖处理方式:
auto-install-peers=true
strict-peer-dependencies=false
- 适当处理对等依赖警告
- 清楚说明所需的对等依赖
覆盖和解析
在根目录的 package.json 中覆盖依赖:
{
"pnpm": {
"overrides": {
"lodash": "^4.17.21",
"[email protected]": "npm:bar@^2.0.0"
}
}
}
- 使用覆盖修复安全漏洞
- 固定有问题的传递依赖版本
发布工作区
- 为可发布的包配置适当的字段
- 使用
pnpm publish发布 - 工作区协议引用会替换为实际版本
性能优化
- 在 Docker 中使用
pnpm fetch,以改善缓存效果:COPY pnpm-lock.yaml ./ RUN pnpm fetch COPY . ./ RUN pnpm install --offline - 为 CI 缓存配置存储位置
- 在 CI 环境中使用
--frozen-lockfile
最佳实践
- 始终提交
pnpm-lock.yaml - 使用
.npmrc确保团队配置一致 - 内部依赖优先使用
workspace:* - 保持根目录的
package.json精简 - 使用
pnpm dedupe优化锁文件 - 定期使用
pnpm audit审计 - 使用
pnpm why <package>排查依赖问题 - 集成 Turborepo 或 Nx,以实现高级任务运行
- 设置
engine-strict=true,强制执行 Node.js 版本要求
评论
支持 Markdown