pnpm

pnpm

快速且节省磁盘空间的 Node.js 包管理器,用硬链接跨项目共享依赖

核心功能

针对 npm 「同一个依赖在每个项目里各存一份」和「扁平 node_modules 能引用未声明依赖」两个问题设计:依赖统一放进内容可寻址存储,安装时硬链接到项目里。适合本机有大量 Node 项目、或维护 monorepo 的前端与 Node.js 团队。

功能亮点

磁盘占用大幅降低

100 个项目用同一版本依赖时只存一份文件,其余靠硬链接共享

增量式存储

依赖升级只把变动的那几个文件写入存储,而不是重新克隆整个包

严格的依赖边界

默认非扁平结构,未在 package.json 声明的包无法被代码 require 到

CI 友好的锁文件校验

CI 环境默认启用 --frozen-lockfile,锁文件与清单不一致时直接失败

临时执行包命令

pnpm dlx create-vue my-app 可在不安装依赖的前提下跑脚手架

适用场景

• 本机有大量 Node 项目时,用共享存储把重复依赖占用的磁盘空间压下来
• 管理 monorepo,在工作区根目录一条 pnpm install 装好所有子项目依赖
• CI 流水线中用 --frozen-lockfile 保证依赖与锁文件严格一致

安装配置

bash
独立脚本 —— POSIX (macOS / Linux):
curl -fsSL https://get.pnpm.io/install.sh | sh -

独立脚本 —— 没有 curl 时用 wget:
wget -qO- https://get.pnpm.io/install.sh | sh -

独立脚本 —— Windows (PowerShell):
Invoke-WebRequest https://get.pnpm.io/install.ps1 -UseBasicParsing | Invoke-Expression

Corepack(Node.js 自带,需先更新 Corepack):
npm install --global corepack@latest
corepack enable pnpm

npm:
npm install -g pnpm@latest-11

Homebrew:
brew install pnpm

winget:
winget install -e --id pnpm.pnpm

Scoop:
scoop install nodejs-lts pnpm

Chocolatey:
choco install pnpm

升级:
pnpm self-update

说明:不走独立脚本或 @pnpm/exe 时,pnpm 11 需要 Node.js v22 及以上。

使用方法

bash
pnpm install                 # 安装项目全部依赖(别名 pnpm i)
pnpm i --frozen-lockfile     # 不更新锁文件,锁文件过期则失败(CI 默认行为)
pnpm i --prod                # 跳过 devDependencies
pnpm i --offline             # 只用本地存储里的包安装
pnpm i --lockfile-only       # 只更新锁文件,不写 node_modules
pnpm i --dry-run             # 预演安装,不落盘
pnpm add sax                 # 添加到 dependencies
pnpm add -D sax              # 添加到 devDependencies
pnpm add -O sax              # 添加到 optionalDependencies
pnpm add -g sax              # 全局安装
pnpm add sax@3.0.0           # 指定版本
pnpm add debug -w            # 往工作区根包添加依赖
pnpm add sax --filter <包选择器>   # 只对工作区中匹配的包操作
pnpm dlx create-vue my-app   # 不安装成依赖,直接运行包命令
pnpm self-update             # 升级 pnpm 自身

关键指标

尚未核验对标产品,此处只列本工具自身指标,不做对比结论。

指标pnpm
价格免费
开源
上手难度入门

相关工具

同类工具

优点

  • 依赖存在内容可寻址存储里并以硬链接接入项目,同版本依赖跨项目零额外占用
  • 升级依赖时只向存储写入变化的文件,100 个文件里改了 1 个就只加 1 个
  • 默认非扁平 node_modules,杜绝「用了没声明的依赖,换环境就崩」这类隐患
  • CI 环境自动开启 --frozen-lockfile,锁文件不同步会直接报错而非悄悄改写

缺点

  • 不用独立脚本或 @pnpm/exe 时依赖 Node.js 环境,pnpm 11 要求 Node.js v22 及以上
  • 默认基于软链接的目录结构对个别工具链不友好,需要改 nodeLinker 为 hoisted 兜底
  • Windows 上用独立脚本安装时可能被 Microsoft Defender 拦截,官方更推荐用 npm 或 Corepack