pnpm
pnpm 是一个快速、高效的 JavaScript 包管理器,全称为 "Performant npm",由 Zoltan Kochan 开发。它的核心优势在于采用了独特的存储机制和依赖管理方式,解决了 npm 和 yarn 中的一些性能和磁盘空间问题。
pnpm安装需要 "node":">=18.12"
查看node版本
node -v
版本过小需要通过nvm安装高版本node
$ nvm ls
-> v8.17.0
v10.22.1
v12.18.4
v14.17.0
default -> v8.17.0
node -> stable (-> v14.17.0) (default)
stable -> 14.17 (-> v14.17.0) (default)
iojs -> N/A (default)
unstable -> N/A (default)
lts/* -> lts/hydrogen (-> N/A)
lts/argon -> v4.9.1 (-> N/A)
lts/boron -> v6.17.1 (-> N/A)
lts/carbon -> v8.17.0
lts/dubnium -> v10.24.1 (-> N/A)
lts/erbium -> v12.22.12 (-> N/A)
lts/fermium -> v14.21.3 (-> N/A)
lts/gallium -> v16.20.0 (-> N/A)
lts/hydrogen -> v18.16.0 (-> N/A)
选择高版本安装,安装好后node直接变成了 v18.16.0 如果切换别的版本 可以使用 nvm use v8.6.0
$ nvm install v18.16.0
Downloading and installing node v18.16.0...
Downloading https://nodejs.org/dist/v18.16.0/node-v18.16.0-darwin-x64.tar.xz...
############################################################################################################################################## 100.0%
Computing checksum with shasum -a 256
Checksums matched!
Now using node v18.16.0 (npm v9.5.1)
设置默认版本
# 将 v16.18.0 设为默认版本(替换为你的目标版本)
nvm alias default v16.18.0
pnpm 的核心特点:
- 高效的存储机制:
- 采用 内容寻址文件系统 存储依赖,相同版本的包只会在磁盘上保存一次
- 通过硬链接和符号链接(symlinks)管理依赖,大幅节省磁盘空间
- 安装速度通常比 npm 和 yarn 快 2-3 倍
- 严格的依赖管理:
- 严格遵循
node_modules的规范,避免了 "幻影依赖"(未在 package.json 中声明却能被访问的依赖) - 确保项目依赖的准确性,减少生产环境中的潜在问题
- 严格遵循
- 工作区支持:
- 原生支持 monorepo 项目结构,轻松管理多包项目
- 提供
pnpm workspace命令,简化多包之间的依赖管理和脚本执行
- 兼容性:
- 与 npm 命令兼容,大多数 npm 命令(如
install、run、publish等)都可以直接使用 - 支持
.npmrc配置文件,迁移成本低
- 与 npm 命令兼容,大多数 npm 命令(如
常用命令:
# 安装依赖pnpm installpnpm i
# 安装生产依赖pnpm add <package># 安装开发依赖pnpm add -D <package># 全局安装pnpm add -g <package># 运行脚本pnpm run <script>pnpm <script> # 简写形式# 移除依赖pnpm remove <package># 查看依赖树pnpm why <package># 清理缓存pnpm store prune
适用场景:
- 大型项目,希望减少磁盘占用和安装时间
- monorepo 项目(如使用 Turborepo、Nx 等工具的项目)
- 对依赖管理严格性有要求的团队
- 希望提升 CI/CD 构建速度的场景
pnpm 近年来增长迅速,已被 Vite、Vue、Nuxt 等知名项目采用,成为 npm 和 yarn 之外的一个优秀替代方案。
如何在pnpm中安装和使用包?
在 pnpm 中安装和使用包的流程与 npm 类似,但具有更快的速度和更高效的存储机制。以下是详细步骤:
- 安装 pnpm(如果尚未安装)
首先确保已安装 pnpm:
# 使用 npm 安装npm install -g pnpm# 或使用其他包管理器# curl -fsSL https://get.pnpm.io/install.sh | sh
- 基本包安装命令
安装生产依赖(会写入 package.json 的 dependencies)
pnpm add <包名># 例如:安装 lodashpnpm add lodash
安装开发依赖(会写入 package.json 的 devDependencies)
pnpm add -D <包名># 例如:安装 eslint 作为开发依赖pnpm add -D eslint
安装指定版本的包
pnpm add <包名>@<版本号># 例如:安装 react 18.2.0 版本pnpm add react@18.2.0
全局安装包
pnpm add -g <包名># 例如:全局安装 vitepnpm add -g vite
- 使用已安装的包
在代码中引入
安装完成后,就可以在项目代码中正常引入使用:
// 引入生产依赖import lodash from 'lodash';console.log(lodash.version);// 引入开发依赖(通常在构建/测试阶段使用)// 例如在配置文件中使用 eslint
运行包提供的命令
如果包提供了可执行命令(如 vite、eslint 等),可以通过 pnpm 运行:
# 直接运行(pnpm 会自动查找 node_modules 中的可执行文件)pnpm <命令名># 例如:运行 vite 开发服务器pnpm vite dev
# 或者在 package.json 的 scripts 中定义后运行pnpm run <脚本名>
- 其他常用命令
移除包
pnpm remove <包名># 例如:移除 lodashpnpm remove lodash
更新包
# 检查可更新的包pnpm outdated
# 更新所有包pnpm update
# 更新指定包pnpm update <包名>
查看包信息
# 查看包的依赖关系pnpm why <包名># 查看已安装的包版本pnpm list <包名># 例如:查看所有已安装的包pnpm list
pnpm 与 npm 命令高度兼容,大多数情况下可以直接将项目中的 npm 命令替换为 pnpm 使用,同时享受更快的安装速度和更高效的磁盘空间利用。