:pnpm 使用介绍)
一、什么是 pnpm作为 Node.js 开发者你一定听说过 npm 和 yarn它们是管理项目依赖的利器。但你是否遇到过node_modules文件夹巨大无比、安装速度缓慢、或者磁盘空间被迅速占满的烦恼这就是 pnpm 能解决的问题。pnpm是一个快速、节省磁盘空间的 Node.js 包管理器它通过内容寻址的方式存储包所有版本的依赖会集中存储在系统的一个位置然后通过硬链接的方式链接到项目中避免了重复安装。pnpm 的 slogan 是Fast, disk space efficient package manager快速、节省磁盘空间的包管理器。二、pnpm 的核心优势传统包管理器的问题想象一下你参与了公司 10 个不同的前端项目每个项目都依赖了lodash4.17.21。使用 npm 或 yarn这个 lodash 包会被完整地下载和存储 10 次在你电脑的 10 个不同的node_modules文件夹里——这造成了巨大的磁盘空间浪费。pnpm 的革命性方案pnpm 采用了一种聪明的方案机制说明全局存储当你安装一个包时pnpm 会将其内容存储在一个全局的、单一版本的仓库中通常位于~/.pnpm-store硬链接在项目的node_modules中pnpm 不会复制包的完整文件而是创建指向全局存储中那些文件的硬链接与源文件共享同一份磁盘数据符号链接组织为了保持node_modules的扁平化结构pnpm 会创建一套精密的符号链接软链接来组织依赖树pnpm 工作流程┌─────────────────────────────────────────────────────────────┐ │ 全局存储 │ │ (~/.pnpm-store) │ │ ┌─────────────────────────────────────────────────┐ │ │ │ lodash4.17.21 (唯一的一份物理文件) │ │ │ └─────────────────────────────────────────────────┘ │ └─────────────────┬───────────────────┬─────────────────────┘ │ │ 硬链接引用 硬链接引用 │ │ ┌─────────────────▼───────┐ ┌─────────▼─────────────────────┐ │ 项目 A │ │ 项目 B │ │ node_modules/ │ │ node_modules/ │ │ lodash → (硬链接) │ │ lodash → (硬链接) │ └─────────────────────────┘ └───────────────────────────────┘与 npm/yarn 的对比特性npm (v7) / yarnpnpm磁盘空间使用每个项目的依赖独立存储占用空间大所有项目共享依赖的单一副本空间占用极低安装速度较慢需要下载、解压、构建依赖树极快后续安装主要是创建链接node_modules 结构扁平化或半扁平化可能导致依赖提升和幻影依赖问题严格的非扁平化结构精准模拟依赖关系Monorepo 支持通过 Workspaces 支持但性能有瓶颈原生、高效的 Workspaces 支持包管理模型安装时拷贝文件到项目链接模型硬链接 符号链接安全性依赖可被项目脚本修改依赖文件为只读硬链接安全性更高三、安装 pnpm方法一使用 npm 安装推荐这是最通用、最简单的方法npm install -g pnpm验证安装是否成功pnpm --version # 输出类似8.15.0方法二使用独立脚本安装macOS / Linuxcurl -fsSL https://get.pnpm.io/install.sh | sh -Windows (PowerShell)iwr https://get.pnpm.io/install.ps1 -useb | iex四、pnpm 基本使用初始化项目# 交互式创建 package.json pnpm init # 快速创建带有默认值的 package.json pnpm init -y安装依赖# 安装所有依赖 pnpm install # 添加依赖包 pnpm add package-name # 添加开发依赖 pnpm add -D package-name # 添加全局包 pnpm add -g package-name # 安装指定版本 pnpm add package-nameversion更新依赖# 更新所有依赖 pnpm update # 更新指定包 pnpm update package-name # 更新到最新版本忽略 package.json 中的版本范围 pnpm update --latest删除依赖pnpm remove package-name运行脚本# 运行 package.json 中定义的脚本 pnpm run script-name # 常见简写 pnpm start pnpm test pnpm build五、npm 到 pnpm 命令对照表npm 命令pnpm 命令npm installpnpm installnpm install pkgpnpm add pkgnpm install pkg --save-devpnpm add -D pkgnpm install pkg --globalpnpm add -g pkgnpm updatepnpm updatenpm uninstall pkgpnpm remove pkgnpm run scriptpnpm run scriptnpx commandpnpm dlx commandnpm listpnpm listnpm outdatedpnpm outdatednpm auditpnpm audit六、配置文件.npmrcpnpm 支持通过.npmrc文件进行配置。在项目根目录创建此文件可以自定义 pnpm 的行为。常用配置示例# 设置国内镜像源淘宝 registryhttps://registry.npmmirror.com # 自动安装 peer dependencies auto-install-peerstrue # 严格模式 strict-peer-dependenciestrue # 提升依赖兼容某些工具 shamefully-hoisttrue # 指定 node_modules 目录结构 node-linkerhoisted # 设置存储目录 store-dir~/.pnpm-store查看和设置配置# 查看当前配置 pnpm config list # 设置配置项 pnpm config set key value七、Workspace 工作区Monorepopnpm 内置了强大的 monorepo 支持。配置文件在项目根目录创建pnpm-workspace.yamlpackages: - packages/* - apps/* - !**/test/**项目结构示例my-monorepo/ ├── pnpm-workspace.yaml ├── package.json ├── packages/ │ ├── package-a/ │ │ └── package.json │ └── package-b/ │ └── package.json └── apps/ └── web-app/ └── package.jsonWorkspace 命令# 在所有工作区包中安装依赖 pnpm install # 在指定工作区执行命令 pnpm --filter package-name command # 在所有工作区执行命令 pnpm -r command # 递归运行脚本 pnpm -r run build # 为工作区添加依赖 pnpm --filter package-name add dependency # 添加工作区内部依赖 pnpm --filter package-a add package-bworkspace:*Workspace 协议在工作区内引用其他包时使用workspace:协议{ dependencies: { package-a: workspace:*, package-b: workspace:^1.0.0 } }八、高级特性pnpm exec 与 pnpm dlx# 执行本地安装的包 pnpm exec command # 执行远程包类似 npx pnpm dlx create-react-app my-app # 使用特定版本 pnpm dlx create-react-applatest my-app查看依赖树# 查看依赖树 pnpm list # 指定深度 pnpm list --depth 2 # 只显示生产依赖 pnpm list --prod # 查看全局包 pnpm list -g查看过期依赖pnpm outdated审计依赖安全性pnpm audit # 自动修复安全问题 pnpm audit --fix清理缓存# 清理未使用的包 pnpm store prune # 查看存储位置 pnpm store path # 查看存储状态 pnpm store status导入 lockfile从其他包管理器迁移时# 从 package-lock.json 导入 pnpm import # 从 yarn.lock 导入 pnpm importPatch 包当需要临时修改某个依赖包时# 创建补丁 pnpm patch package-nameversion # 应用补丁后提交 pnpm patch-commit path九、本章小结知识点说明pnpm 是什么快速、节省磁盘空间的 Node.js 包管理器核心机制内容可寻址存储 硬链接 符号链接主要优势节省磁盘空间、安装速度快、安全性高安装方式npm install -g pnpm或独立脚本基础命令pnpm add、pnpm remove、pnpm update配置文件.npmrc自定义行为Monorepo通过pnpm-workspace.yaml原生支持官方资源pnpm 官方网站Fast, disk space efficient package manager | pnpmpnpm 中文文档Fast, disk space efficient package manager | pnpmpnpm GitHub 仓库GitHub - pnpm/pnpm: Fast, disk space efficient package manager · GitHub