ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

nvm完全指南:Node.js多版本安装切换与实战配置

nvm完全指南:Node.js多版本安装切换与实战配置 1. 为什么你需要一个 Node.js 版本管理器先聊聊最核心的问题Node.js 版本管理这件事到底是怎么成为刚需的。我刚入行那会儿开发机上只装了一个 Node.jsnpm、cnpm 全往全局塞日子过得也算安稳。直到第一次接手老项目package.json里写的还是engines: { node: 8.0.0 },而我的开发机已经冲到了 Node 14跑起来直接一串语法报错。更痛苦的是同一台机器上还要维护两三个不同年限的项目有的依赖原生模块、有的依赖旧版 APINode 版本一不对编译不过、启动闪退、依赖树崩溃这些破事能连环上演一整天。后来我试过手动下载不同版本的安装包装完一个再卸一个来回折腾半天最后还是绕回了nvm。它解决的问题很直白在一台机器上安装多个 Node.js 版本随时切换互不干扰。你不需要再为这个项目该用哪个 Node发愁也不需要为了一个新项目去动你现有的开发环境。还有一个很多人忽略的好处切换 Node 版本不仅仅影响node命令还影响 npm、npx、全局工具链。比如某个老项目必须用 npm 6另一个新项目要 npm 10nvm 能把这些配套的工具版本一起管好而不是让你单独去降级 npm。一句话总结只要你的工作里出现过一次这个项目跑不起来可能是 Node 版本问题nvm 就是你该装的东西。2. nvm 是什么和 n、fnm 这些工具比好在哪里nvm的全称是Node Version Manager一个用于管理多个 Node.js 版本的工具。它的工作原理很简单把不同版本的 Node.js 分别下载到一个统一目录下然后通过修改 PATH 环境变量的指向让你当前终端里使用的node、npm命令落到指定版本上。但这里要特别提一个容易混淆的点Linux/macOS 上的 nvm 和 Windows 上的 nvm 不是同一个程序。Linux/macOS 上说的 nvm是nvm-sh/nvm一个 Shell 脚本用.nvmrc、source这些机制工作。Windows 上广泛使用的是coreybutler/nvm-windows一个用 Go 写的独立程序虽然命令风格长得像但底层实现完全不同。这两个项目经常被混为一谈网上很多 Windows 教程抄 macOS 的安装方式结果第一步就卡住。我用过几款同类工具把感受整理成一张对比表工具跨平台安装复杂度镜像配置日常体验nvmnvm-sh仅 macOS/Linux中等需要改 shell 配置支持环境变量镜像命令经典资料多nvm-windows仅 Windows低直接装 exe支持 settings.txt 配置最贴近 nvm 习惯nmacOS/Linux低需额外手段命令简单但功能弱fnm全平台低Rust 写的支持速度快但资料相对少Volta全平台低支持自动切版本但理念不同我自己在 Windows 和 macOS 上都长期用 nvm 系原因很简单资料多、团队协作时别人也容易上手、踩过的坑都有现成答案。它不是最快的也不是最现代的但它是最不容易出错的那个选择。3. 安装 nvm 前的准备工作和完整安装流程3.1 安装前必须处理的三件事如果你机器上已经装了 Node.js第一件事不是下载 nvm而是先把已安装的 Node.js 卸载干净。这里说的干净不只是控制面板卸载还包括检查这几个位置系统 PATH 里残留的C:\Program Files\nodejs\或/usr/local/bin/node这类路径npm 全局目录里的缓存和配置Windows 下是%APPDATA%\npm和%APPDATA%\npm-cachemacOS/Linux 下是~/.npm目录某些 IDE 或终端工具里配置的 Node 解释器路径为什么必须卸载因为 nvm 管理版本的方式是接管 PATH如果你之前安装的 Node.js 路径还残留在 PATH 里切换版本时会发现怎么切都切不过去——系统永远优先找到旧的那个。我见过不止一个朋友装完 nvm 后执行node -v显示的还是旧版本号排查半天最后发现是旧的全局路径没删干净。第二件事想清楚你要用哪个终端。Windows 下建议用 Windows Terminal PowerShell 或者 Git Bash尽量不要用老的 cmd因为 nvm-windows 在某些 cmd 环境下的输出和路径解析偶尔会有显示问题不是说不能用是容易让新手误判。macOS 下建议提前确认你用的是 bash 还是 zshnvm 安装脚本会自动识别但装完后建议重启终端或重开一个窗口。第三件事确认网络环境能正常访问 Node.js 的下载源。国内网络直接访问官方源常常速度很慢甚至超时。建议提前准备好镜像地址如果你不方便配镜像后面安装版本时大概率会卡在下载进度条上。我用的是淘宝镜像源这个后面专门讲。3.2 Windows 安装 nvm-windows 实操Windows 下推荐使用nvm-windows注意下载版本。我当前用的版本是v0.40.8安装包是nvm-setup.exe。一定要从 GitHub Releases 页面下载别去第三方站点下整合包里面塞了什么你根本不知道。安装过程比普通软件多一个步骤选择 nvm 的安装目录。默认是C:\Users\你的用户名\AppData\Roaming\nvm我建议你改到一个简单、无空格的路径比如C:\nvm。为什么因为后面你会在各种命令行里跟这个路径打交道路径越短你敲命令越省心也避免一些极端情况下程序对空格路径的解析问题。下一步会问 Symlink 目录这个指的是切换版本后系统从哪里找到 node 命令默认是C:\Program Files\nodejs。这一步很多人会困惑——我明明用 nvm 管理了为什么还要指定一个 nodejs 目录简单解释一下nvm-windows 的方式是你执行nvm use 18.20.4后它会在C:\Program Files\nodejs这个位置创建一个符号链接指向对应版本的真实路径你的 PATH 里只需要保持C:\Program Files\nodejs这一条就能自动跟随版本切换。所以这个目录一定不能删也最好保持默认。安装完成后验证是否成功的标准命令在终端里依次执行nvm version node -v npm -v正常情况下nvm version会输出类似0.40.8的版本号。node -v和npm -v这时候可能会提示找不到命令这不用慌因为还没有安装任何 Node 版本属于正常现象。如果nvm version也提示找不到大概率是安装时 PATH 没刷新重开一个终端窗口再试还不行就去检查环境变量里有没有NVM_HOME和NVM_SYMLINK这两条。3.3 macOS/Linux 安装 nvm 实操macOS 和 Linux 用的是nvm-sh/nvm安装方式是一段脚本curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash脚本会检测你当前的 shell 并自动往配置文件里写入内容比如.bashrc、.zshrc或.profile。执行完脚本后需要重新加载配置source ~/.zshrc # 或者 source ~/.bashrc然后验证nvm --version这里有个小坑需要注意每次新开终端窗口时nvm 命令可能会消失。原因是安装脚本写入的配置在某些终端模拟器里没有被正确加载。检查你 shell 的配置文件里是否有这么一段export NVM_DIR$HOME/.nvm [ -s $NVM_DIR/nvm.sh ] \. $NVM_DIR/nvm.sh如果没有手动把这两行加到配置末尾再 source 一次。这也是为什么很多人安装 nvm 后明明第一步成功重启终端却发现 nvm 不存在了——实际上不是卸载了是没加载。4. 配置镜像源与全局环境让 nvm 用得顺手4.1 设置镜像源解决下载慢和版本不可用装好 nvm 只是第一步真正让人抓狂的是nvm install的时候。默认情况下nvm 从 Node.js 官方源下载这个下载速度在国内环境常常让人绝望——一个 20 多 MB 的安装包能下载十分钟。更麻烦的是下载失败后 nvm 会把错误信息抛给你新手这时候还以为是 nvm 坏了。配置镜像源的方法在 Windows 和 macOS/Linux 上不一样。Windowsnvm-windows找到 nvm 安装目录下的settings.txt文件打开后添加两行node_mirror: https://npmmirror.com/mirrors/node/ npm_mirror: https://npmmirror.com/mirrors/npm/然后保存关闭新开一个终端窗口生效。macOS/Linuxnvm-sh直接设置环境变量export NVM_NODEJS_ORG_MIRRORhttps://npmmirror.com/mirrors/node/建议把这行写到.zshrc或.bashrc里否则只在当前终端生效。设置完重新加载配置执行nvm ls-remote看能不能正常列出远程版本。如果能列出来说明镜像通了。我用镜像源的最大感受是下载速度从不知道能不能下完变成毫无感知。镜像源和官方源的内容基本一致包括每个版本的 LTS 标识、npm 版本信息日常使用完全没区别。4.2 安装第一个 Node.js 版本并验证镜像配置好后就可以安装 Node.js 了。命令格式是nvm install 版本号版本号有两种写法nvm install 18会自动安装 18.x 系列的最新版本nvm install 20.11.1会安装精确版本。我建议生产环境项目用精确版本本地测试可以用大版本号。nvm install 20.11.1 nvm use 20.11.1 node -v npm -v这里有一个常见疑问我刚才明明 install 了 20.11.1为什么用node -v看到的还是之前的版本答案是 install 并不等于 use。nvm 安装完一个新版本后默认不会自动切换过去你还需要显式执行nvm use。Windows 下可能还会提示已使用 nvm use 但 node 还是老版本这种情况检查管理员权限——nvm-windows 切换版本时需要创建符号链接没有管理员权限经常会失效务必以管理员身份打开终端。4.3 设置默认版本与全局配置每次新开终端如果你不想手动nvm use就设置一个默认版本nvm alias default 20.11.1设置之后新终端会自动使用这个版本。Windows 下的 nvm-windows 也可以执行同样的命令行为一致。这里涉及一个很容易被忽略的点npm 全局包的安装位置问题。默认情况下npm 全局包会安装到当前 Node 版本目录下的node_modules里。也就是说你切换 Node 版本后之前全局安装的工具就消失了——因为新版本的 node_modules 目录是空的。这是 nvm 管理方式带来的必然结果不是 bug。解决思路有几种每个版本重装一次切到对应版本后执行npm i -g 包名重新安装。适合全局包数量少的场景。修改 npm 的 prefix 配置让全局包统一装到一个固定目录比如C:\npm-global。执行npm config set prefix C:\npm-global然后把该目录加到 PATH。这样可以做到全局包与 Node 版本解耦切换版本后工具不受影响。但带来的牺牲是某些工具内部可能依赖 Node 运行时版本脱离版本目录后逻辑可能会变。写一个小脚本来批量安装我自己的方案是在.npmrc里维护一个global-packages.txt清单换版本后跑一行命令全部重装。省事、可预测。npm ls -g --depth0 | awk {print $2} global-packages.txt # 换版本后 cat global-packages.txt | xargs npm install -g哪种方案适合你取决于你的工具链复杂度。如果只是装了nodemon、pm2这种轻量工具重装一次成本很低如果装了十几二十个包建议用第三种方案。4.4 用 .nvmrc 锁定项目 Node 版本这是我认为 nvm 最被低估的功能之一。很多团队项目里写着Node 版本要求 18.x但新人入职不知道怎么看、怎么切。其实 nvm 支持在项目根目录放一个.nvmrc文件内容就是一个版本号echo 18.20.4 .nvmrc这样团队成员切到项目目录后执行nvm usenvm 会自动读取.nvmrc并切换到对应版本如果本机没有这个版本nvm use会提示你安装你还可以配合nvm install自动装。虽然有些终端工具如 Volta 能做到进入目录自动切版本但用.nvmrc的好处是不依赖任何插件或扩展文本文件到处通用。我习惯把.nvmrc纳入版本管理这样团队所有人共享同一份 Node 版本约束从源头上减少我这跑得好好的你那就报错的扯皮问题。5. 常用命令梳理与真实使用场景这里把 nvm 的高频命令整理一遍基本都是日常必用的。命令作用常用场景nvm ls列出本机已安装的所有版本确认当前有哪些版本可用nvm ls-remote列出远程所有可安装版本查版本号、看 LTS 版本nvm install version安装指定版本新项目需要新版本时nvm uninstall version卸载指定版本清理不用的版本nvm use version切换当前终端使用的版本日常切换nvm alias default version设置默认版本新终端默认使用nvm current查看当前使用版本快速确认环境nvm which version查看某版本安装的真实路径排查路径问题这几个命令覆盖了 90% 的日常操作。下面说几个具体的真实使用场景帮你理解这些命令怎么组合。场景一老项目需要低版本 Node接手一个古董项目要求 Node 10。你不需要卸载新版本只需要nvm install 10.24.1 nvm use 10.24.1然后你会发现 npm 也跟着变成了 npm 6依赖也能正常安装了。切换回新项目时再nvm use 20.11.1即可。场景二想快速测试一个包在多个 Node 版本下的兼容性比如你在维护一个 npm 库需要验证它是否兼容 Node 14/16/18/20。安装好这些版本后写个循环for v in 14.21.3 16.20.2 18.20.4 20.11.1; do nvm use $v node -v npm test done这在本地就能验证多版本兼容性不用开多个虚拟机或者容器效率提升非常明显。场景三不同项目自动切版本配合.nvmrc在每个项目根目录放对应的版本文件然后在终端里执行nvm use。虽然还是需要手动执行但至少不再需要记哪个项目用哪个版本了。还有一个非常实用的小技巧给常用版本起别名。如果你经常在两个版本之间来回切可以nvm alias old 14.21.3 nvm alias new 20.11.1接下来nvm use old和nvm use new就能快速切换少敲一长串版本号减少出错概率。6. 实操过程从零开始完整配置一遍这一节我把从安装到可用的完整流程过一遍每一步都写清楚操作和验证方式你可以照着敲。6.1 Windows 完整配置流程第一步卸载已有 Node.js。控制面板里卸载然后检查 PATH 里是否有C:\Program Files\nodejs残留有就删掉。第二步安装 nvm-windows v0.40.8。从 GitHub Releases 页面下载nvm-setup.exe安装目录选C:\nvmsymlink 目录保持默认C:\Program Files\nodejs。第三步验证安装。nvm version第四步配置镜像源。打开C:\nvm\settings.txt添加node_mirror: https://npmmirror.com/mirrors/node/ npm_mirror: https://npmmirror.com/mirrors/npm/第五步安装 Node.js LTS 版本并设为默认。nvm install 20.11.1 nvm use 20.11.1 nvm alias default 20.11.1 node -v npm -v第六步验证全局工具链可用。比如安装一个常用工具测试一下全局包是否正常npm install -g nodemon nodemon --version6.2 macOS 完整配置流程第一步卸载已有 Node.js。如果之前是用 Homebrew 安装的执行brew uninstall node同时检查~/.npmrc和/usr/local/lib/node_modules是否还有残留。第二步安装 nvm。curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash source ~/.zshrc nvm --version第三步配置镜像源。echo export NVM_NODEJS_ORG_MIRRORhttps://npmmirror.com/mirrors/node/ ~/.zshrc source ~/.zshrc第四步安装 Node.js LTS 版本并设为默认。nvm install 20.11.1 nvm use 20.11.1 nvm alias default 20.11.1 node -v npm -v6.3 配置后的目录结构说明理解 nvm 的目录结构有助于排查问题。Windows 下nvm 安装目录C:\nvm里每个版本一个文件夹比如v20.11.1、v18.20.4。而真实 Node 的安装路径其实是C:\Program Files\nodejs这个符号链接指向当前使用的版本目录。用nvm which 20.11.1可以查看具体路径。macOS 下类似所有版本都在~/.nvm/versions/node/下比如~/.nvm/versions/node/v20.11.1/bin/node。这个结构说明了两个问题不要手动往C:\Program Files\nodejs或~/.nvm里塞文件容易把目录搞坏。排查node 版本不对问题时先执行nvm which 版本看路径指向哪里再检查 PATH 里是否有其他 Node 路径排在了 nvm 前面。7. 常见报错与排查技巧实录7.1 nvm could not be found or does not exist. exiting. no installations recognized这个报错在 Windows 上特别常见。我第一次遇到时还以为 nvm 坏了后来排查发现是执行了 nvm 无法识别的命令或参数通常发生在输入了nvm install -lts这种不存在的参数nvm-windows 不认-lts只认--lts或者直接给版本号想安装一个不存在的版本号比如nvm install 23如果镜像源里还没有这个版本nvm 就会提示找不到某些命令在 nvm-windows 里行为不同比如nvm ls-remote在旧版本里不支持解决办法先仔细检查命令拼写然后用nvm ls-remote查出真实存在的版本号再安装。另外确认 nvm 的版本不是太老——有些报错在旧版本上无解升级到新版本就正常了。7.2 Error installing 24.21.0: node.js v24.21.0 is not yet released or is not available这个报错我也遇到过通常有两个原因版本号根本不存在有些新版本号你可能是在某个博客或者小道消息上看到的还没正式发布。镜像源没有同步官方源已经发布了但镜像源更新有延迟。比如 Node.js 官方刚发布某个版本npmmirror 镜像可能还没同步完这时候执行nvm install就会报not yet released。排查方法先执行nvm ls-remote查看当前可用的版本列表确认版本号确实存在如果确认存在但安装报错检查镜像源配置是否生效可以临时切回官方源试一下下载。还有一个隐蔽原因nvm 版本太老不认识新的版本号格式。Node.js 偶尔会调整命名习惯老版本 nvm 可能解析不了新版本号。解决方法是升级 nvm 本身。7.3 切换版本后 node 还是旧版本这个问题的原因集中在两点旧 Node 的残留路径安装 nvm 前没卸载干净PATH 里还有/usr/local/bin或C:\Program Files\nodejs的直连路径且优先级比 nvm 的路径高。在 Windows 下用where node、macOS 下用which -a node查看所有找到的 node 路径逐一排查。权限问题仅 Windowsnvm-windows 创建符号链接需要管理员权限。如果你不用管理员身份打开终端nvm use可能不会生效。解决办法是右键以管理员身份运行终端。7.4 切换版本后 npm 全局包不见了前面说过这不是 bug而是 nvm 的设计使然。每个版本的全局包互相隔离切换版本后自然看不到另一个版本的全局包。处理方法参考第 4.3 节我建议你按全局包重装脚本的方式处理。7.5 npm 下载慢或卡在 idealTree 阶段很多人用 nvm 切换版本后接着就被 npm 下载依赖卡住。这个问题的根源通常不是 nvm而是 npm 默认源访问不稳定。用 npmmirror 的 npm 源解决npm config set registry https://registry.npmmirror.com建议把这条写入全局配置npm config set registry它只影响 npm不影响 nvm 下载 Node 本身。注意它和 4.1 节配置的npm_mirror是两码事npm_mirror管的是 nvm 下载 npm 包时用的地址registry管的是 npm install 依赖时用的地址。7.6 .nvmrc 文件不起作用执行nvm use后nvm 没有按要求切换版本。可能原因.nvmrc内容有换行或空格错位可以用cat -A .nvmrc检查不可见字符执行nvm use时所在目录不对nvm 只会在当前目录向上查找.nvmrcnvm 版本太老对.nvmrc的支持不完善8. 最后的实战心得用 nvm 这几年最大的体会是它不是让你多装几个版本这么简单而是重新定义了你在 Node 生态里的工作方式。以前我处理版本问题靠猜、靠搜、靠卸载重装现在靠一条nvm use解决了非常多的低级问题。最后再分享一个小技巧定期清理你不用的 Node 版本。用nvm ls查看已安装版本把那些几个月都没用过的版本卸掉。版本装多了不会影响性能但会让磁盘占用变高而且nvm ls列表一长反而干扰你判断当前到底该用哪个。我现在的习惯是每个大版本只保留一个稳定版比如 16、18、20 各留一个 LTS其他一律清理掉清爽又省心。另外强烈建议你花十分钟把.nvmrc用起来在自己负责的项目里都加上这个文件。它不能帮你自动切换版本但能在你未来某天面对一堆项目时让你少一次到底是哪个版本来着的思考。如果你正在被 Node.js 版本问题折磨别犹豫把 nvm 装上按文章里的流程走一遍你会发现这个困扰你几个月的问题十分钟就解决了。
返回列表