pnpm依赖管理:从零开始的实践手册

一、快速入门

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 用于安装项目的所有依赖项,如下图所示。

image

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 开发者带来了更快的安装速度、更小的磁盘占用和更严格的依赖安全。其带来的不仅是性能提升,更是开发范式的进化,实现了对传统包管理工具的降维打击,标志着包管理工具从"依赖下载器"向"依赖运行时"的范式转变。

相关推荐
张风捷特烈1 小时前
状态管理大乱斗#08 | MobX 源码评析 - 透明魔法
android·前端·flutter
mCell1 小时前
HTML:AI 时代的通用表达层
前端·html·aigc
mobº1 小时前
Vue3 +TypeScript 项目总结
前端·javascript·typescript
counterxing4 小时前
我整理了一个免费开发资源目录,还做成了 CLI 和 MCP
前端·agent·ai编程
子兮曰11 小时前
Bun v1.3.14 深度解析:Image API、HTTP/3、全局虚拟存储与五十项变革
前端·后端·bun
kyriewen12 小时前
今天,百年巨头一次砍了9200人,而一个离职科学家的实话让全网睡不着觉
前端·openai·ai编程
问心无愧051312 小时前
ctf show web 入门42
android·前端·android studio
kyriewen12 小时前
老板逼我上AI,我偷偷在浏览器里跑LLaMA,省下20万API费
前端·react.js·llm
Beginner x_u12 小时前
前端八股整理(手写 02)|数组转树、数组扁平化、随机打乱一个数组
前端·数组·数组转树·数组扁平化