核心功能
针对 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