本文以 macOS 为例,但思路也适用于 Windows 系统。
对于 pnpm 我们有多种安装方式,可以使用现有的包管理器比如 npm npm i -g pnpm
但是 npm 一般是通过 nvm 安装的,如果 nvm 切换到其他 node.js 版本,则无法使用 pnpm(command not found: pnpm),还得继续安装一遍,颇为麻烦。
所以 pnpm 官方一般推荐通过 shell 脚本的方式安装,以下安装命令来自 pnpm 官网:pnpm.io/installatio…
curl -fsSL https://get.pnpm.io/install.sh | sh -
但是如果直接运行我们会发现超时以及报错。通过下载安装脚本 get.pnpm.io/install.sh 和搜索关键词 github 我们在 94 行发现:
archive_url="https://github.com/pnpm/pnpm/releases/download/v${version}/pnpm-${platform}-${arch}"
原因很清楚了国内无法访问 github,修复也很简单找一个 proxy 即可,这里我用的是 gh-proxy.com/ (2025-09-27 可用):
第一步:移除无用包
可选。主要是为了删除无用包,减少磁盘浪费,以及避免冲突。切换到曾经安装过 pnpm 的 node.js 版本。
nvm use 20
npm uninstall -g pnpm
第二步:替换成可用 proxy
将下载到本地的 install.sh 修改成如下:
archive_url="https://gh-proxy.com/https://github.com/pnpm/pnpm/releases/download/v${version}/pnpm-${platform}-${arch}"
然后执行:
sh install.sh
等待 10s 即可安装成功,并且 .zshrc 文件末尾将自动增加:
# pnpm
export PNPM_HOME="/Users/legend80s/Library/pnpm"
case ":$PATH:" in
*":$PNPM_HOME:"*) ;;
*) export PATH="$PNPM_HOME:$PATH" ;;
esac
# pnpm end
重新开一个 terminal 让更新后的 .zshrc 生效或者直接 source .zshrc 然后,
试试 pnpm -v 输出 10.17.1(2025-09-27)。
再试试 pnpx pnpx ydd -e -s -c=a hefty。
一样成功 🎉。
Windows 用户 C 盘问题
虽然 pnpm 已够高效,但谁都不希望占据 C 盘空间,pnpm i -g 全局安装以及 pnpx / pnpm dlx 临时安装的包默认都会存储在 C 盘,此乃 pnpm 默认机制,详见 pnpm v9.x 文档。
store-dir
- The location where all the packages are saved on the disk.
- Default:
- If the $PNPM_HOME env variable is set, then $PNPM_HOME/store
- If the $XDG_DATA_HOME env variable is set, then $XDG_DATA_HOME/pnpm/store
- On Windows: ~/AppData/Local/pnpm/store
- On macOS: ~/Library/pnpm/store
- On Linux: ~/.local/share/pnpm/store
文档内搜索 global-dir 同样发现 Windows 默认全局安装在 C 盘 ~/AppData/Local/pnpm/global
切换这二者磁盘只需修改 PNPM_HOME:
# ~/.zshrc
export PNPM_HOME="E:\pnpm"
记得重启 Terminal!
验证:
❯ pnpm list -g
Legend: production dependency, optional only, dev only
E:\pnpm\global\5
dependencies:
@gauseen/gum 1.0.5
@nestjs/cli 11.0.7
@typescript/native-preview 7.0.0-dev.20260122.2
bun 1.3.5
degit 2.8.4
diff-so-fancy 1.4.3
pinme 1.1.5
tree-node-cli 1.6.0
yarn 1.22.22
通过查询文档 pnpx 临时安装的包目录默认也在 C 盘:
cache-dir
The location of the cache (package metadata and dlx). Default:
- On Windows: ~/AppData/Local/pnpm-cache
- On macOS: ~/Library/Caches/pnpm
- On Linux: ~/.cache/pnpm
设置到其他磁盘,这里没有提到环境变量故只能使用命令行:
❯ pnpm config set cache-dir "F:\legend80s\pnpm-cache"
验证:
❯ pnpm config get cache-dir
F:\legend80s\pnpm-cache
或最真实验证,即让某个包“崩溃”这样就能打印出堆栈,堆栈内必定包含其安装目录:
❯ pnpx ydd -x # 给 ydd 包增加不支持的参数 `-x`
node:internal/util/parse_args/parse_args:107
throw new ERR_PARSE_ARGS_UNKNOWN_OPTION(
^
TypeError [ERR_PARSE_ARGS_UNKNOWN_OPTION]: Unknown option '-x'. To specify a positional argument starting with a '-', place it at the end of the command after '--', as in '-- "-x"
at checkOptionUsage (node:internal/util/parse_args/parse_args:107:13)
at node:internal/util/parse_args/parse_args:381:9
at Array.forEach (<anonymous>)
at parseArgs (node:internal/util/parse_args/parse_args:378:3)
at file:///F:/legend80s/pnpm-cache/dlx/j7z33gcrw77b3ywwepucs2rnmq/19c0c9c9fd2-59a4/node_modules/.pnpm/ydd@3.0.1/node_modules/ydd/src/utils/arg-parser.mjs:54:33
at ModuleJob.run (node:internal/modules/esm/module_job:343:25)
at async onImport.tracePromise.__proto__ (node:internal/modules/esm/loader:647:26)
at async asyncRunEntryPointWithESMLoader (node:internal/modules/run_main:117:5) {
code: 'ERR_PARSE_ARGS_UNKNOWN_OPTION'
}
Node.js v22.18.0
at file:///F:/legend80s/pnpm-cache/dlx/j7z33gcrw77b3ywwepucs2rnmq/19c0c9c9fd2-59a4/node_modules/.pnpm/ydd@3.0.1/node_modules/ydd/src/utils/arg-parser.mjs:54:33
看到 F:/legend80s/pnpm-cache 说明 pnpx 存储目录切换成功。其实其他目录无需环境变量通过 pnpm config set <key> 也能做到,且可避免环境变量设置后需重启终端方可生效问题。
—— 完 🎉 敬请关注 “JavaScript与编程艺术”——