type
status
date
slug
summary
tags
category
icon
password

对于前端开发,使用多版本的 node 是一个常见需求,其中最重要的原因,我感受最深的是下面两个
  • 项目兼容性差异:旧项目依赖老版本的 Node.js,升级 node 版本(某些 api 的大变更导致不兼容)构建报错,往往解决这种问题费力不讨好。而新项目通常推荐使用最新的稳定版本(LTS 版本 )。
  • 依赖项冲突:某些底层库(如编译 C++ 的 node-gyp 相关包,比如臭名昭著的 node-sass)对 Node 版本非常敏感。直接升级全局 Node 版本,导致需要重新下载对应操作系统的对应 node 版本的包(可能会遇到网络问题,需要使用一些神奇的魔法才能解决),甚至下载源码自己构建,这会导致项目的 npm install 或构建过程崩溃,让人非常沮丧。
 
多版本的 node 管理,社区也有不少的开源方案,我是从 nvm 切换到 volta(https://volta.sh/) 的。第一次知道 volta,还是因为 webstorm 的一次更新日志里看到的,有点好奇,就去网上搜索了一下。
volta 是 rust 写的,当时显著吸引我的是,跨项目的无感自动切换
以前用 nvm 的时候,切换不同项目的时候,需要手动切换 node 的版本,这就需要记忆或查找当前项目支持的 node 版本,总归是个心智负担。volta 有个 pin node 版本的功能。
会在 package.json 中增加一个 volta 的自定义区域
notion image
这样每次切换到这个项目,使用的就是当前项目下固定的 node 版本。这个可以和全局的 node 版本不一致。
 
可是最近这一年,因为接触了 vite,发现 volta 的另外一个特性,导致同一个问题,坑了我 3 次,有点让人难以接受的是,我之前踩坑之后,还写了文档记录的,但是后面过了 3 个月,一时没想起来,可见中年人的记忆力确实是差
 
这个特性,官方文档的名称叫做,Install and forget https://docs.volta.sh/guide/#features
notion image
首先解释一下,这么做的好处是啥,像 nvm 这样的管理工具,全局切换 node 版本之后,之前全局安装的命令都会失效,对应的全局命令就需要重新安装。而 volta 的这个特性就是只要安装全局命令一次,就会一直可用。它的原理是,每个全局命令都会绑定命令安装时对应的全局 node 版本

举例来说

假设你现在的全局 node 是 v 22.x.x
全局安装 pnpm,其背后绑定的是当前的全局 node, 版本是 22.x.x
后面哪一天,你全局切换 node 到了 24 版本,使用下面的命令
如果你的项目使用了 pnpm 作为包管理器,当你执行 pnpm dev
项目可能会直接或间接提示你的 node 版本不匹配,当你用 ai 或者 search,得到一些信息,知道兼容的 node 版本之后,很自觉的在当前项目下,检查 node 版本,发现的结果又是匹配的,于是你就蒙圈了, 即便再用 ai 继续,也是一本正经的胡说八道了

到底是哪个 node 在生效

你在当前项目下,检查 node 的版本。
如果当前项目使用了 volta pin 的话,使用的是 pin 的 node 版本,否则就是全局的 node 版本。这个和安装 pnpm 的绑定的 node 版本可能不一致。如何真实的证明这一点呢,办法也很简单,创建一个的检查 node 版本的脚本 check-node-version.js,然后用 pnpm 执行,可以找到具体的 node 版本,以及 node 的命令路径
notion image
上面的截图就表明了一个项目没有使用 volta pin ,执行 pnpm 命令的 node 版本和全局 node 版本不一致。
 
排查的困难点,就是在于这个特性,真的容易被遗忘。真是符合官方的宣传,Install and forget ,真是成也萧何败也萧何,其实这个特性大多数确实是方便,但是少数情况下,当你遗忘的时候,这种看起来像是自相矛盾的问题排查就变成了苦差事,会让人陷入不断的自我怀疑
现实表明,这同一个问题,我就被坑了 3 次,一点都不夸张。

贴一下最近的这个案例(2026-1-4

最近在我的 Windows 电脑上用最新的 vitepress 2.x ,运行 pnpm dev 报错。
问了一下 gemini
结果在项目下,运行 node --version,22.x,没问题呀。再继续问 ai,ai 开始一本正经地胡说八道。
晚上扔垃圾的时候,突然想起来,提示 node 版本不对,但 node 的版本又是对的,也是 vite 的场景,好像遇到过,还写了文档的,赶紧回去搜了一下。一看文档的记录时间,这才过去了 3个 月而已,又碰到了同样的问题。
 

如何解决

查看全局 node 的版本,22.x,没问题。
先卸载 pnpm,再重新安装 pnpm
问题解决。

结论

  • 有时候,工具帮你做了很多事情,如果不知道原理的话,难免会遇到坑。
  • 使用了 volta 管理 node,并且使用 volta 安装了全局的 pnpm,在项目下执行 pnpm 相关的命令,其实背后运行的 node 版本和项目下 pin 的 node 或者全局 node 可能不一致。
写完了文档,又整理了一下博客发表,期望不会再忘记了。
 
 
柑橘家族有点疯狂Volta, the same problem, pitched me 3 times
Loading...