
一、快速入门
1.1 pnpm是什么🤔
pnpm(performant npm,意思是高性能的 npm)是一个快速、节省磁盘空间的 Node.js 包管理器,它向后兼容 npm,这意味着绝大多数 npm 命令在 pnpm 中可以直接使用。pnpm 的设计目标是解决传统包管理器在磁盘空间和安装速度上的瓶颈,通过内容寻址的方式存储包,所有版本的依赖会集中存储在系统的一个位置,然后通过硬链接的方式链接到项目中,对于模块的每个版本,磁盘上只保存一个副本,避免了重复安装。

1.2 核心差异对照表
| 工具名 | 核心定位 | 本质 / 所属关系 | 核心职责 |
|---|---|---|---|
| npm | Node.js 官方默认包管理器 | 随 Node.js 一同安装,官方标配 | 管理项目依赖(安装、卸载、更新、发布) |
| pnpm | 高性能第三方替代包管理器 | 第三方工具,需手动安装 | 同 npm 核心职责,优化性能与磁盘占用 |
| npx | Node 包执行工具 | 随 npm@5.2.0+ 自带,非包管理器 |
执行 Node 包的可执行文件,不管理依赖 |
npm 和 pnpm 是「包管理器」,负责 "存放和管理依赖";npx 是「执行工具」,负责 "运行依赖包",三者不是同一维度的工具!
| 特性 | npm | pnpm | npx |
|---|---|---|---|
| 主要用途 | 依赖管理、脚本运行 | 依赖管理(提速+省盘) | 一次性/临时命令 |
| 安装后是否留在硬盘 | 是 | 是(全局 store 硬链接) | 否(用完即删) |
| 是否解除"幽灵依赖" | ❌ 扁平 node_modules 易产生 | ✅ 严格依赖树 | --- |
| Monorepo 帮助 | 需自己配 workspace | 原生 workspace,体验最好 | --- |
| 速度排名 | 慢 | 最快 | 仅运行阶段快 |
| 是否可发布包 | ✅ | ✅ | ❌ |
| 是否需单独安装 | 随 Node 自带 | 需 npm i -g pnpm |
随 npm 自带 |
1.3 安装 pnpm
安装 pnpm 有多种方式,可以根据喜好和系统环境选择。
使用 npm 安装
这是最通用、最简单的方法。打开终端(Windows 用户可使用 PowerShell 或 CMD),运行以下命令。注意:需要先安装:Node环境(✅) 、npm环境(✅)。
bash
# 全局安装
npm install -g pnpm
执行上述命令会通过 npm 将 pnpm 安装到全局环境。安装完成后,运行以下命令检查版本。如果能正常显示版本号,说明安装成功。
bash
pnpm --version
使用独立脚本安装
对于 macOS 或 Linux 用户,可以使用以下脚本安装:
bash
# macOS/Linux
curl -fsSL https://get.pnpm.io/install.sh | sh -
# Windows (PowerShell)
iwr https://get.pnpm.io/install.ps1 -useb | iex
使用包管理器安装
bash
# macOS (Homebrew)
brew install pnpm
# Linux (使用包管理器)
# Arch Linux
sudo pacman -S pnpm
# Fedora
sudo dnf install pnpm
# Ubuntu/Debian
sudo apt install pnpm
1.4 pnpm 配置
配置镜像源(加速下载)
bash
# 查看当前源
pnpm config get registry
# 设置淘宝镜像源
pnpm config set registry https://registry.npmmirror.com/
# 设置华为云镜像
pnpm config set registry https://repo.huaweicloud.com/repository/npm/
# 设置腾讯云镜像
pnpm config set registry https://mirrors.cloud.tencent.com/npm/
# 设置官方源
pnpm config set registry https://registry.npmjs.org/
常用配置
bash
# 设置全局安装路径
pnpm config set global-dir ~/.pnpm-global
# 设置并发数(默认16)
pnpm config set fetch-concurrency 8
# 设置网络超时
pnpm config set network-timeout 60000
# 查看所有配置
pnpm config list
二、pnpm 包管理命令📦
2.1 安装依赖包
| 配置项 | 简要说明 |
|---|---|
| --save-prod、-P、-p | 生产依赖包,常用于项目必备依赖 |
| --save-dev、-D、-d | 开发依赖包,常用于项目构建、测试等场景 |
| --global、-g | 全局安装软件包 |
| --save-peer | 常用于项目插件、库模式等场景;不可省略 |
| 命令 | 简要说明 |
|---|---|
| pnpm install | 用于安装项目的所有依赖项 |
| pnpm add <package-name> | 安装生产依赖,自动保存到 dependencies |
| pnpm add -D <package-name> | 添加开发依赖,添加到 devDependencies |
| pnpm add -g <package-name> | 添加全局包 |
| pnpm add <package-name>@<version> | 安装指定版本 |
bash
# 安装 axios 默认添加至 dependencies
pnpm install axios
# 安装 axios 并将 axios 添加至 devDependencies
pnpm add axios --save-dev
2.2 更新依赖
| 命令 | 简要说明 |
|---|---|
| pnpm update | 更新所有依赖项,遵守 package.json 中指定的范围 |
| pnpm update <package-name> | 更新指定包到最新版本 |
| pnpm update --latest | 将所有依赖项更新到最新版本,忽略 package.json 中的版本范围 |
| pnpm upgrade <package-name> --global | 更新全局包 |
注意:pnpm不会自动下载依赖中使用的其他依赖,这涉及到依赖链的问题,pnpm 会先检查共享存储库,如果有该依赖则创建符号链接(即硬链接)定位到共享存储库中的依赖,不会重复的去下载。
2.3 删除依赖
| 命令 | 简要说明 |
|---|---|
| pnpm remove <package-name> | 移除依赖并自动更新 package.json |
| pnpm remove <package-name> --global | 移除全局包 |
2.4 查看依赖
| 命令 | 简要说明 |
|---|---|
| pnpm outdated | 查看过期依赖 |
| pnpm list | 查看依赖树 |
| pnpm list --depth 2 | 指定深度 |
| 只显示生产依赖 | 只显示生产依赖 |
| pnpm list -g | 查看全局包 |
三、脚本执行🏗️
3.1 运行脚本
bash
# 运行 package.json 中定义的脚本
pnpm run <script-name>
# 一些常见的简写
pnpm start
pnpm test
pnpm build
四、高级功能🚀
4.1 缓存管理
bash
# 查看存储状态
pnpm store status
# 清理未使用的包
pnpm store prune
# 查看存储位置
pnpm store path
4.2 性能优化
pnpm install 用于安装项目的所有依赖项,如下图所示。
bash
# 使用离线模式(如果已缓存)
pnpm install --offline
# 跳过锁文件生成(用于 CI/CD)
pnpm install --no-lockfile
# 预安装(下载但不链接)
pnpm fetch
4.3 安全检查
bash
# 审计依赖漏洞
pnpm audit
# 修复漏洞
pnpm audit fix
# 检查许可证
pnpm licenses list
五、总结
pnpm 通过底层存储机制的革新,为 JavaScript 开发者带来了更快的安装速度、更小的磁盘占用和更严格的依赖安全。其带来的不仅是性能提升,更是开发范式的进化,实现了对传统包管理工具的降维打击,标志着包管理工具从"依赖下载器"向"依赖运行时"的范式转变。
