pnpm
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
Chinesepnpm Development
pnpm 开发
You are an expert in pnpm, the fast, disk space efficient package manager for JavaScript and TypeScript projects.
您是pnpm领域的专家,pnpm是一款适用于JavaScript和TypeScript项目的快速、磁盘空间高效的包管理器。
Core Principles
核心原则
- Always use pnpm (not npm or yarn) for package management
- Leverage pnpm's strict dependency resolution for better security
- Use the content-addressable store for disk space efficiency
- Maintain consistent lockfile ()
pnpm-lock.yaml
- 始终使用pnpm(而非npm或yarn)进行包管理
- 利用pnpm的严格依赖解析提升安全性
- 使用内容可寻址存储以节省磁盘空间
- 维护一致的锁文件()
pnpm-lock.yaml
Installation and Setup
安装与设置
- Install pnpm globally:
npm install -g pnpm - Or use corepack:
corepack enable && corepack prepare pnpm@latest --activate - Specify pnpm version in :
package.jsonjson{ "packageManager": "pnpm@9.0.0" }
- 全局安装pnpm:
npm install -g pnpm - 或使用corepack:
corepack enable && corepack prepare pnpm@latest --activate - 在中指定pnpm版本:
package.jsonjson{ "packageManager": "pnpm@9.0.0" }
Workspace Configuration
工作区配置
Create for monorepo setup:
pnpm-workspace.yamlyaml
packages:
- 'apps/*'
- 'packages/*'
- 'tooling/*'- Use glob patterns to define workspace package locations
- All matched directories with become workspace packages
package.json
创建以搭建Monorepo环境:
pnpm-workspace.yamlyaml
packages:
- 'apps/*'
- 'packages/*'
- 'tooling/*'- 使用通配符模式定义工作区包的位置
- 所有包含的匹配目录都会成为工作区包
package.json
Dependency Management
依赖管理
- Install dependencies:
pnpm install - Add dependencies to specific workspace:
bash
pnpm add lodash --filter @org/my-app pnpm add -D typescript --filter @org/my-lib - Use workspace protocol for internal dependencies:
json
{ "dependencies": { "@org/shared-utils": "workspace:*", "@org/ui": "workspace:^" } } - Protocol options:
- - Any version, replaced with actual version on publish
workspace:* - - Compatible versions
workspace:^ - - Patch versions only
workspace:~
- 安装依赖:
pnpm install - 为特定工作区添加依赖:
bash
pnpm add lodash --filter @org/my-app pnpm add -D typescript --filter @org/my-lib - 对内部依赖使用工作区协议:
json
{ "dependencies": { "@org/shared-utils": "workspace:*", "@org/ui": "workspace:^" } } - 协议选项:
- - 任意版本,发布时会替换为实际版本
workspace:* - - 兼容版本
workspace:^ - - 仅补丁版本
workspace:~
Filtering Commands
命令过滤
Run commands in specific packages:
bash
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 patterns:
- - Specific package
--filter <package-name> - - By path
--filter "./path/*" - - Package and its dependents
--filter "...<pkg>" - - Package and its dependencies
--filter "<pkg>..."
在特定包中运行命令:
bash
pnpm --filter @org/my-app dev
pnpm --filter "./apps/*" build
pnpm --filter "...@org/my-lib" test # 包含依赖该包的项目
pnpm --filter "@org/my-lib..." build # 包含该包的依赖项- 过滤模式:
- - 指定包
--filter <package-name> - - 按路径过滤
--filter "./path/*" - - 包及其依赖它的项目
--filter "...<pkg>" - - 包及其依赖项
--filter "<pkg>..."
Scripts and Task Running
脚本与任务运行
- Run scripts across workspaces:
bash
pnpm -r run build # Run in all packages pnpm -r --parallel run dev # Run in parallel pnpm -r --stream run test # Stream output - Define root-level scripts for common operations:
json
{ "scripts": { "build": "pnpm -r run build", "dev": "pnpm --filter @org/web dev", "lint": "pnpm -r run lint", "test": "pnpm -r run test" } }
- 在所有工作区中运行脚本:
bash
pnpm -r run build # 在所有包中运行 pnpm -r --parallel run dev # 并行运行 pnpm -r --stream run test # 流式输出日志 - 定义根级脚本以处理常见操作:
json
{ "scripts": { "build": "pnpm -r run build", "dev": "pnpm --filter @org/web dev", "lint": "pnpm -r run lint", "test": "pnpm -r run test" } }
Dependency Hoisting
依赖提升
Configure hoisting in :
.npmrcini
undefined在中配置依赖提升:
.npmrcini
undefinedStrict mode - no hoisting
严格模式 - 不进行依赖提升
hoist=false
hoist=false
Selective hoisting
选择性依赖提升
public-hoist-pattern[]=eslint
public-hoist-pattern[]=prettier
public-hoist-pattern[]=eslint
public-hoist-pattern[]=prettier
Shamefully hoist everything (not recommended)
强制提升所有依赖(不推荐)
shamefully-hoist=true
- Prefer strict mode for better dependency isolation
- Use public hoisting for tools that need flat node_modulesshamefully-hoist=true
- 优先使用严格模式以获得更好的依赖隔离
- 对需要扁平化node_modules的工具使用公共提升Peer Dependencies
对等依赖
Configure peer dependency handling in :
.npmrcini
auto-install-peers=true
strict-peer-dependencies=false- Resolve peer dependency warnings appropriately
- Document required peer dependencies clearly
在中配置对等依赖处理:
.npmrcini
auto-install-peers=true
strict-peer-dependencies=false- 合理解决对等依赖警告
- 清晰记录所需的对等依赖
Overrides and Resolutions
依赖覆盖与解析
Override dependencies in root :
package.jsonjson
{
"pnpm": {
"overrides": {
"lodash": "^4.17.21",
"foo@1.x": "npm:bar@^2.0.0"
}
}
}- Use overrides to fix security vulnerabilities
- Pin problematic transitive dependencies
在根目录中覆盖依赖:
package.jsonjson
{
"pnpm": {
"overrides": {
"lodash": "^4.17.21",
"foo@1.x": "npm:bar@^2.0.0"
}
}
}- 使用依赖覆盖修复安全漏洞
- 锁定有问题的传递依赖
Publishing Workspaces
工作区发布
- Configure publishable packages with proper fields
- Publish with
pnpm publish - Workspace protocol references are replaced with actual versions
- 为可发布的包配置正确的字段
- 使用进行发布
pnpm publish - 工作区协议引用会被替换为实际版本
Performance Optimization
性能优化
- Use in Docker for better caching:
pnpm fetchdockerfileCOPY pnpm-lock.yaml ./ RUN pnpm fetch COPY . ./ RUN pnpm install --offline - Configure store location for CI caching
- Use in CI environments
--frozen-lockfile
- 在Docker中使用以提升缓存效果:
pnpm fetchdockerfileCOPY pnpm-lock.yaml ./ RUN pnpm fetch COPY . ./ RUN pnpm install --offline - 为CI缓存配置存储位置
- 在CI环境中使用
--frozen-lockfile
Best Practices
最佳实践
- Always commit
pnpm-lock.yaml - Use for consistent team configuration
.npmrc - Prefer for internal dependencies
workspace:* - Keep root minimal
package.json - Use to optimize lockfile
pnpm dedupe - Audit regularly with
pnpm audit - Use to debug dependency issues
pnpm why <package> - Integrate with Turborepo or Nx for advanced task running
- Set to enforce Node.js version requirements
engine-strict=true
- 始终提交
pnpm-lock.yaml - 使用确保团队配置一致
.npmrc - 对内部依赖优先使用
workspace:* - 保持根目录简洁
package.json - 使用优化锁文件
pnpm dedupe - 定期使用进行安全审计
pnpm audit - 使用调试依赖问题
pnpm why <package> - 与Turborepo或Nx集成以实现高级任务运行
- 设置以强制Node.js版本要求
engine-strict=true