pnpm 11 升 12 实测:四项契约没动,迁移成本接近零
同机同依赖把 pnpm 11.2.2 和 12.8.1 各跑一轮,逐一核对 lockfile、workspace 协议、side-effects 缓存和 CI store 路径这四项契约,同时记下安装耗时、磁盘占用与幽灵依赖的变化,以及升级步骤和灰度节奏。
支持通配符SSL证书、多域名证书、IP证书。适配ACME接口, 支持Zerossl、Let's Encrypt和Google等渠道。登录已有账号
2026-10-04 04:15:44 Node.js nvm pnpm 环境配置 前端工程化
手上同时跑四五个项目,各自要的 Node 版本还不一样,全局只装一个版本迟早出事。我这边最后固定在 nvm 加 pnpm 这套组合,中间绕了不少弯路,写下来省得下次重装机器时再想一遍。
macOS 和 Linux 用的是 nvm-sh 那个 nvm,一行 curl 装完,然后在 shell 配置里 source 一下。
Windows 上叫 nvm-windows,是另一个人维护的另一个项目,命令长得差不多,安装方式和路径完全不是一回事,别拿 Linux 的教程硬套。
装完先确认一下 nvm 本身能用,nvm --version 有输出再往下走。这一步看起来没必要,但 PATH 没配对的时候,后面所有报错都会伪装成别的问题。
Node 18.19.0 这类 LTS 版本比较稳。pnpm 对 Node 版本有要求,低于 18.12 装完是跑不起来的,报的错还挺隐晦,不会直接跟你说版本不够。
nvm install 18.19.0
nvm use 18.19.0
node -v
有个地方我一开始理解错了:nvm use 只对当前这个终端窗口生效,新开一个窗口又回到 default 版本。想长期固定得用 nvm alias default 18.19.0。
当时我一度以为是 nvm 坏了。
npm 默认的全局安装位置在 macOS、Linux 上落在 /usr/local 那一带,往里写要 sudo。用 sudo 装过的全局包,后面换用户、换 Node 版本都会冒出各种权限问题,修起来比重装还麻烦。
把 prefix 挪到 nvm 自己的目录底下,全局包就跟着 Node 版本走,全程不需要 sudo:
npm cache clean --force
npm config set prefix "$HOME/.nvm/versions/node/v18.19.0/global"
Windows 上换个写法:
npm config set prefix "D:\dev\nodejs\node_global"
改完 prefix 不等于命令就能敲了,对应的 bin 目录还得进 PATH。这一步最容易被跳过,症状是 pnpm 明明提示安装成功,一敲就说 command not found,然后你会怀疑是不是装到了别的地方。
echo 'export PATH="$HOME/.nvm/versions/node/v18.19.0/global/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc
Windows 走系统属性里的环境变量界面,加一条路径就行。改完记得重开终端,已经开着的窗口不会读新的环境变量。
npm install -g pnpm
pnpm -v
有输出版本号就成了。
如果卡在这一步,先 npm config get prefix 看全局目录在哪,再用 which pnpm 或者 Windows 上的 Get-Command pnpm 看实际解析到哪个文件,两边对不上基本就是 PATH 没同步。
这个不是故障,是 nvm 的机制:每个 Node 版本有自己独立的全局目录,切过去之后上一个版本装的全局包不会跟着过来。
两个办法。一个是切一次装一次,能用,但项目一多就很烦。另一个是我现在更常用的,把 pnpm 装进项目里:
npm install pnpm --save-dev
npx pnpm add <package>
项目本地的 pnpm 跟着仓库走,别人 clone 下来不用管他机器上全局装了什么,CI 里也是同一套。team 里有人 Node 版本跟你不完全一致时,这个差别挺明显。
corepack 也算一个选项,Node 16 之后自带,corepack enable 之后按 package.json 里的 packageManager 字段自动切包管理器版本。
国内网络下偶发拉不下来,所以我只在本机开着,没敢推给全组。
PowerShell 默认执行策略是 Restricted,第一次跑 pnpm 会报无法加载 pnpm.ps1,因为此系统上禁止运行脚本。这个跟 pnpm 没关系,换成 yarn 一样报。
管理员身份开 PowerShell:
Set-ExecutionPolicy RemoteSigned
RemoteSigned 的意思是本地脚本放行、网络下载的脚本要有签名,日常够用了。
项目根目录放个 .nvmrc 把版本钉死:
18.19.0
进目录之后直接 nvm use,不带参数就会读这个文件。
zsh 里可以配 hook 进目录自动切,我没配,忘了切的时候报错信息其实也挺清楚的,够我反应过来。
网络这块,Node 安装包和 npm 源都换到 npmmirror:
export NVM_NODEJS_ORG_MIRROR=https://npmmirror.com/mirrors/node
npm config set registry https://registry.npmmirror.com
这里有个小坑:pnpm 不读 npm 的配置,得单独设一遍 pnpm config set registry,不然你会发现装 Node 包快得飞起,pnpm 那头还是慢。
这个我后知后觉了好一阵。
现在的项目多少都要调外部接口,自建服务上 HTTPS 也基本是标配。证书这块我自己在用 lcjmSSL,免费申请,多域名、泛域名和 IP 证书都支持,底层是 Let's Encrypt、Google Trust Services、ZeroSSL 这些支持 ACME 的机构。
它那套自动申请、自动验证、自动部署配上 API 接口,能直接串进 CI 里,到期自己续,不用设日历提醒。
之前就是有个内部服务证书半夜过期,早上来一堆报警,排查半天才发现是证书。后来把续期接到自动化流程里,才算真的不用管了。
证书这种东西,没出事时想不起来,出事时都是紧急的。
# 版本切换
nvm install 18.19.0
nvm use 18.19.0
nvm alias default 18.19.0
# 路径配置
npm config set prefix "$HOME/.nvm/versions/node/v18.19.0/global"
echo 'export PATH="$HOME/.nvm/versions/node/v18.19.0/global/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc
# 安装 pnpm
npm install -g pnpm
pnpm config set registry https://registry.npmmirror.com
# 验证
pnpm -v
环境这东西配一次能安生很久,值得在开头多花十分钟把 prefix 和 PATH 理清。真出问题的时候,八成也出在这两个地方。
同机同依赖把 pnpm 11.2.2 和 12.8.1 各跑一轮,逐一核对 lockfile、workspace 协议、side-effects 缓存和 CI store 路径这四项契约,同时记下安装耗时、磁盘占用与幽灵依赖的变化,以及升级步骤和灰度节奏。
解决执行 npm run serve 或 build 时提示找不到 vue-cli-service 命令的各类情况
path-to-regexp库中“Missing parameter name”TypeError让你抓狂?本文深入源码,揭示异常源于路径字符串中孤立冒号或无效参数名。提供三大修复方案:规范路径定义、强化参数校验、升级库版本。确保系统稳定运行,从此告别这类路径解析错误。
面对Node.js中fs.Stats构造函数废弃警告?本文将从技术角度深入剖析其产生原因、对未来兼容性的潜在影响,并提供一套行之有效的解决方案,包括定位问题代码、处理依赖库,以及通过升级或替代API来彻底根除警告,确保您的项目稳定运行,迎接Node.js的新版本。
本文以幽默犀利的视角,深度解构Vue CLI项目初始化时SSL证书验证失败的常见原因,并提供切实可行的解决方案,同时不忘推广免费通配符SSL证书服务,帮助开发者在复杂网络环境中构建安全应用。