一个专业的前端如何在国内安装 `pnpm`

545 阅读3分钟

the-nutcracker-ballet.jpeg

本文以 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与编程艺术”——