📚 现代前端开发 目录
阶段2:工程化
第 9 / 35 课

包管理:npm与pnpm

高效管理项目依赖

📖 核心概念

💻 代码实现

package.json与依赖管理 ✅ json
{
  "name": "@myorg/frontend-app",
  "version": "1.0.0",
  "type": "module",
  "description": "Modern frontend application",
  "scripts": {
    "dev": "vite",
    "build": "tsc && vite build",
    "preview": "vite preview",
    "test": "vitest",
    "test:coverage": "vitest --coverage",
    "lint": "eslint . --ext .ts,.tsx",
    "format": "prettier --write \"src/**/*.{ts,tsx,css}\"",
    "prepare": "husky install",
    "release": "standard-version"
  },
  "dependencies": {
    "react": "^18.3.0",
    "react-dom": "^18.3.0",
    "react-router-dom": "^6.20.0",
    "zustand": "^4.4.0",
    "framer-motion": "^10.16.0"
  },
  "devDependencies": {
    "typescript": "^5.3.0",
    "vite": "^5.0.0",
    "@vitejs/plugin-react": "^4.2.0",
    "vitest": "^1.0.0",
    "eslint": "^8.55.0",
    "prettier": "^3.1.0",
    "husky": "^8.0.0",
    "@types/react": "^18.3.0"
  },
  "peerDependencies": {
    "react": "^18.0.0"
  },
  "overrides": {
    "lodash": "^4.17.21"
  },
  "engines": {
    "node": ">=18.0.0",
    "pnpm": ">=8.0.0"
  },
  "packageManager": "pnpm@8.12.0"
}
pnpm与monorepo ✅ bash
# pnpm workspace配置
# pnpm-workspace.yaml
# packages:
#   - 'apps/*'
#   - 'packages/*'

# 常用pnpm命令
pnpm init                          # 初始化项目
pnpm add react                     # 添加依赖
pnpm add -D typescript             # 添加开发依赖
pnpm add -w eslint                 # 添加到workspace根目录
pnpm remove lodash                 # 移除依赖
pnpm update --interactive          # 交互式更新
pnpm outdated                      # 检查过时的包
pnpm audit                         # 安全审计
pnpm why react                     # 查看依赖链
pnpm store prune                   # 清理缓存

# Monorepo项目结构
# my-monorepo/
# ├── pnpm-workspace.yaml
# ├── package.json
# ├── apps/
# │   ├── web/          # 主应用
# │   └── admin/        # 管理后台
# └── packages/
#     ├── ui/           # 共享组件库
#     ├── utils/        # 工具函数
#     └── config/       # 共享配置

# 在apps/web中使用packages/ui
# apps/web/package.json:
# {
#   "dependencies": {
#     "@myorg/ui": "workspace:*"
#   }
# }

# 常用workspace命令
pnpm -r run build                  # 所有包构建
pnpm --filter @myorg/ui build      # 构建特定包
pnpm --filter web... build         # 构建web及其依赖
pnpm -r --parallel test            # 并行测试所有包

🔍 包管理进阶与安全

锁文件与依赖确定性

锁文件(pnpm-lock.yaml)确保团队成员和CI环境安装完全相同的依赖版本。以下是锁文件管理的最佳实践:

依赖安全审计

安全审计流程 ✅ bash
# 检查已知漏洞
pnpm audit

# 自动修复可修复的漏洞
pnpm audit --fix

# 查看依赖树
pnpm list --depth=3

# 检查某个包为什么被安装
pnpm why lodash

# 检查过时的包
pnpm outdated

# 使用overrides强制指定版本
# package.json:
# "overrides": {
#   "lodash": "^4.17.21",
#   "semver": "^7.5.0"
# }

# .npmrc 配置
# shamefully-hoist=true
# strict-peer-dependencies=false
# auto-install-peers=true

Monorepo工作流

pnpm workspace为monorepo提供了强大的支持,以下是常用工作流:

🎯 练习任务

🏆 成就解锁
依赖管家 — 掌握现代包管理工具,高效组织项目依赖