nvm 完全指南:Node.js 多版本管理与环境配置实战
2026/9/14 13:56:57 网站建设 项目流程

1. 为什么必须用 nvm 管理 Node.js 版本

先聊个实际场景。你电脑里装了一个 Node.js 16,项目 A 跑得好好的,结果项目 B 必须用 Node 18 才能启动,因为依赖了新版特性;项目 C 更离谱,锁定在 Node 14,升级就报错。这时候如果你只有一个全局 Node,只能在卸载重装之间来回折腾,装一次十几分钟,装完还不一定干净,环境变量、npm 缓存、全局包残留一堆问题。

用 nvm(Node Version Manager)就是干这个的。它是一个”多版本共存、随时切换“的工具,能让同一台电脑装多个 Node.js 版本,不同项目用不同版本,切换过程只要一条命令。你不需要卸载现有的 Node,也不用手动配环境变量,nvm 统一管着所有版本,改完立刻生效。

从 2010 年 Node.js 出现到现在,版本迭代非常快,从 0.x 到 4、6、8、10、12、14、16、18、20、22,每个大版本都有 breaking changes。尤其是 Node 18 开始原生支持 fetch、Test Runner 这些新特性,很多老项目又停留在 14、16 上,版本割裂问题越来越严重。作为前端或者后端开发者,装 nvm 基本是标配,就像 Python 开发者装 pyenv、Ruby 开发者装 rvm 一样,属于开发环境的第一块基石。

这个教程覆盖的内容包括:nvm 在 Windows / macOS / Linux 下的下载安装方式、如何用 nvm 安装和切换 Node.js 版本、npm 的全局配置、以及我实际使用中踩过的各种坑和排查方法。无论你是刚入门的新手,还是已经吃过版本切换亏的老手,看完都能直接把环境搭好。

2. nvm 下载与安装(Windows 篇)

2.1 下载前先分清两个“nvm”

这里有个容易懵的地方:搜 nvm 会出来两个项目。

一个叫nvm(GitHub 上 creationix/nvm,现在叫 nvm-sh/nvm),是给 macOS / Linux 用的,脚本安装,不支持 Windows 原生运行。

另一个叫nvm-windows(GitHub 上 coreybutler/nvm-windows),这是专门给 Windows 做的版本,安装包是 .exe 或 .zip,功能类似但实现方式完全不同。

所以你在 Windows 上第一步就是认准nvm-windows,别拿 macOS 的安装命令往 PowerShell 里硬贴,会直接报错。新版的 nvm-windows 也支持通过 winget 安装,但为了稳定可控,我更推荐手动下载安装包。

2.2 下载安装包的具体步骤

打开 GitHub 上 coreybutler/nvm-windows 的 Releases 页面,找最新的 release。往下拉,会看到 Assets(安装资源)区域,通常有这几个文件:

文件用途
nvm-setup.exe图形界面的安装程序,适合大多数人,一路下一步就行
nvm-noinstall.zip绿色版,解压就能用,需要手动配环境变量
nvm-setup.zip也是安装版,但以 zip 形式提供

我建议选nvm-setup.exe。它能自动把环境变量配好,省去后面一堆手动操作。下载的时候注意看版本号,比如 1.1.12 之类,别下载到古老的 0.x 版本,功能差很多。

我自己习惯用稳定版,不要追最新版的 beta,因为 nvm-windows 的 beta 版本偶尔会有切换失效的问题。选最新的正式 release 就好。

2.3 安装过程中的三个关键选择

双击 nvm-setup.exe 之后,安装向导会问几个问题,这些选择直接决定你后面好不好用。

第一个是nvm 的安装目录。默认是C:\Users\你的用户名\AppData\Roaming\nvm,我建议改成D:\nvmE:\nvm这种简单路径。原因有两个:一是默认路径带空格和中文用户名的情况下,某些老版本 Node 或 npm 工具解析路径会出问题;二是改到其他盘之后,重装系统或者清理 C 盘缓存都方便。路径里不要有中文、不要有空格,这是铁律。

第二个是Node.js 的安装目录。向导会让你选一个存放所有 Node 版本的文件夹,默认是C:\Program Files\nodejs。这个路径比较微妙,因为 nvm 切换版本的本质是改这个目录里的软链接。我实际测试下来,把 Node 版本目录也放在非系统盘更省心,比如D:\nodejs,避免权限问题。安装完成后你可以看到,这个目录的真实内容会被 nvm 不断替换成你正在使用的那个 Node 版本。

第三个选择是在安装完成后是否允许 nvm 自动修改 PATH 环境变量。这个一定要勾选,否则你得手动加,很麻烦。

2.4 安装完成后验证是否成功

安装完以后,打开一个新的命令行窗口(PowerShell 或 CMD 都行),输入:

nvm version

如果正常,会返回类似1.1.12的版本号。如果提示“nvm 不是内部或外部命令”,说明环境变量没生效,先关掉命令行窗口再重新打开,还不行就手动检查系统环境变量里有没有 nvm 的安装路径。

再输入nvm ls,正常情况下会显示No installations recognized或空列表,这表示现在还没有安装任何 Node 版本。到这里,nvm 本身就算装好了。

3. 使用 nvm 安装和管理 Node.js 版本

3.1 查可用版本和安装指定版本

nvm 装好后,第一件事就是安装一个 Node.js 版本。先看一下远端有哪些可装的版本:

nvm list available

这个命令会列出几百个版本号,包括 LTS(长期支持版)、Current(最新版)、以及各种老版本。通常我不会直接装最新的 Current,因为有些项目依赖的包还没来得及适配。开发环境首选 LTS 版本,稳定、坑少。

安装指定版本,命令格式是:

nvm install 18.20.4

这个版本号要写具体的小版本号。不像某些包管理器支持nvm install 18这种模糊匹配,至少在我用过的 nvm-windows 版本里,模糊匹配不一定好使。装的时候会下载对应的 zip 包并自动解压,速度取决于网络。

如果某个版本安装失败,卡在下载阶段,常见原因是网络问题。可以把 npm 镜像源换掉,但注意这是换 npm 的源,nvm 的下载源另说。nvm-windows 下载 node 是从 https://nodejs.org/dist/ 拉取的,国内访问偶尔不稳定,可重试几次,或用 nvm 的设置文件指定镜像,后面在常见问题部分我会详细讲。

3.2 切换和查看当前版本

装完多个版本后,查看本机装了什么版本:

nvm ls

输出会列出所有已安装的版本,当前正在用的那个版本前面会标一个*。例如:

* 18.20.4 (Currently using 64-bit executable) 20.11.1 16.20.2

切换版本用:

nvm use 18.20.4

执行完后,再运行node -v,会发现 node 的版本立刻变成了 18.20.4。这个“立刻生效”的背后机制是这样的:nvm-windows 并不是真的同时装着多个 node 可执行文件然后切换命令行入口,而是把你指定的 node 版本映射到之前安装时设定的那个nodejs目录上。系统 PATH 里的始终是D:\nodejs这个目录,nvm 只是把里面指向真实版本目录的快捷方式换掉。所以你打开任何一个新的命令行窗口,它访问的都是D:\nodejs,也就是你切换后的版本。

这里有个小坑:如果你在命令行窗口里执行了nvm use,但接着运行node -v显示的版本没变,大概率是那个命令行窗口是切换之前就打开的,而且 node 的路径已经被解析到内存里了。不用纠结,关掉窗口重新打开就正常。

3.3 卸载不需要的版本

版本装多了也占磁盘空间。到 node_modules 目录之外,Node 本体大约几十兆到一百多兆,装十几个版本就是好几个 G。清理用:

nvm uninstall 16.20.2

如果你想卸载当前正在使用的版本,会提示先切换到其他版本再卸载。这个设计是合理的,防止你把自己正在跑的版本删了导致环境崩溃。

3.4 nvm 常用命令速查表

命令作用
nvm install <version>安装指定版本 Node.js
nvm uninstall <version>卸载指定版本
nvm ls查看本地已安装的版本列表
nvm ls available查看远端可以安装的所有版本
nvm use <version>切换到指定版本
nvm current显示当前使用的版本
nvm alias default <version>设置默认版本,新开终端自动使用
nvm node_mirror <url>设置 Node 下载镜像
nvm npm_mirror <url>设置 npm 下载镜像

alias default这个命令值得多说一句。如果你不设置默认版本,每次打开新的命令行窗口,node 命令可能是无效的,因为 nvm 不知道该用哪个。设置一次:

nvm alias default 18.20.4

之后每次打开终端,node 自动就是 18.20.4。对于日常开发来说,这是必须做的一步。

4. 全局配置:npm 镜像、全局目录和环境变量

4.1 npm 默认源的问题

Node.js 装好之后,npm 是自带包管理工具。npm 官方源https://registry.npmjs.org/在国内速度很慢,尤其装大型依赖的时候,一个npm install卡个十几分钟很正常。解决办法是换成国内镜像。

查看当前 npm 源:

npm config get registry

永久换成淘宝镜像源:

npm config set registry https://registry.npmmirror.com

这里说明一下,淘宝原来源地址是https://registry.npm.taobao.org,后来改名为 npmmirror,新地址如上。如果你在网上搜到老的.taobao.org域名,建议换成新版,老的域名已停止服务。

4.2 全局安装包的目录设置

npm 默认会把全局安装的包放在 Node 安装目录下的node_modules里。因为 nvm 切换版本时D:\nodejs会被替换,你在旧版本下全局装的包,切到新版本后就会“消失”。这其实是理所当然的,因为每个版本的 node_modules 是独立的。但为了管理和复用,我建议把全局包的安装位置统一到自定义目录。

具体做法分三步。

第一步,在某个盘符下建立一个全局目录,比如D:\node_globalD:\node_cache

第二步,设置 npm 的 prefix 和 cache:

npm config set prefix "D:\node_global" npm config set cache "D:\node_cache"

第三步,把D:\node_global添加到系统环境变量的 PATH 里,不然全局安装的命令行工具无法直接在终端中使用。

设置完成后,执行:

npm install -g yarn

安装的 yarn 会出现在D:\node_global下,不会受 nvm 版本切换影响。这个方案的收益在长期使用后非常明显,你全局安装的pnpmtypescriptnodemon这些工具,换 Node 版本后依然能用,不需要重新装。

4.3 为每个 Node 版本独立配置 npm 也是可行的

如果你希望每个 Node 版本拥有自己独立的全局包,就不做目录重定向,直接用默认行为,切版本后重装一次全局包也行。这种方式更干净,但是麻烦。

我个人的推荐是:全局只装少量跨版本通用的工具(如 pnpm、nodemon、typescript 这类对版本不敏感的),项目级别的依赖一律通过项目内npm install安装,不搞全局。这样 nvm 切换版本后项目进入目录重新安装依赖即可,全局包往往不会引发兼容性问题。

4.4 验证配置是否生效

全局目录修改完,执行:

npm prefix -g npm config get registry npm config get cache

显示结果分别是你设置的D:\node_globalhttps://registry.npmmirror.comD:\node_cache就说明一切正常。然后试着全局装一个小工具:

npm install -g http-server http-server -p 8080

能正常启动,说明全局命令的 PATH 也配好了。这一步没做好的话,最常见的症状就是全局装完包却提示“xxx 不是内部或外部命令”。

5. macOS 和 Linux 下的 nvm 安装方式

5.1 脚本安装(推荐)

macOS 和 Linux 上用的 nvm 是nvm-sh/nvm,安装方式非常简单,打开终端,执行官方提供的安装脚本:

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash

或者用 wget:

wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash

这段脚本会把 nvm 仓库克隆到~/.nvm目录下,并自动往你的 shell 配置文件里写入几行加载 nvm 的命令。.bashrc.zshrc.profile都可能被修改,具体取决于当前 shell。

执行完后,关掉终端重新打开,输入:

nvm --version

如果提示 command not found,说明 shell 配置文件没有被正确加载。手动在~/.zshrc(zsh 用户)或~/.bashrc(bash 用户)末尾添加以下几行:

export NVM_DIR="$HOME/.nvm" [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"

保存后执行source ~/.zshrc重新加载。

5.2 安装指定版本 Node

macOS / Linux 下的 nvm 命令和 Windows 下很像,但功能更强。比如:

nvm install --lts

直接安装最新的 LTS 版本。也可以:

nvm install 20

这里允许只写大版本号,nvm 会自动帮你找这个系列下最新的版本。相比之下,nvm-windows 的模糊匹配支持就不如这个好。

切换版本和 Windows 一样:

nvm use 20

设置默认版本:

nvm alias default 20

macOS / Linux 下的 nvm 默认加载机制导致它在每个新终端都会自动激活 default 版本,所以只要你设置了 alias default,开箱即用的体验比 Windows 更好。

5.3 卸载 nvm(如果有需要)

macOS / Linux 下卸载 nvm 很简单,把~/.nvm目录删掉,然后清理 shell 配置里的 NVM_DIR 相关行即可。Windows 下则去“控制面板 → 程序和功能”找到 nvm 卸载,或者重新运行 nvm-setup.exe 选择卸载。

这里多提一句,很多开发者在卸载旧的 Node 版本时发现系统里还有残留。手动装的 Node.js 卸载后,注意清理这几个位置:C:\Program Files\nodejs(或自定义目录)、%APPDATA%\npm%APPDATA%\npm-cache%USERPROFILE%\.npmrc。而 nvm 接管之后,这些目录的实际数据都在 nvm 的管理范围内,不需要手动清理,避免了环境残留的问题。

6. 常见问题与排查技巧实录

6.1 “nvm 不是内部或外部命令”怎么办

装完 nvm-windows 后,终端输nvm version报错,是最多人遇到的情况。先别急着重装,按顺序排查:

  • 看安装目录下的nvm.exe是否存在,如果不存在说明安装没成功;
  • 打开系统环境变量,确认 Path 里有没有 nvm 安装目录;
  • 如果 Path 里面有但终端还是找不到,关掉终端重新开。环境变量是对之后启动的进程生效的,已打开的终端不会刷新;
  • 确认没有在 PowerShell 里开了管理员模式又用普通模式,两者环境变量可能不一致。

还有一个冷门坑:nvm 被安装在带空格的路径(比如C:\Users\John Doe\...),某些命令解析会出问题。因此我一直坚持安装路径不用空格、不用中文。

6.2 nvm install 下载很慢或直接失败

这个问题在国内网络环境下尤其常见。nvm-windows 从 nodejs.org 拉取压缩包,慢的话动辄几分钟到超时。

一个方案是修改 nvm 的配置文件。找到 nvm 安装目录下的settings.txt,添加或修改以下两行:

node_mirror: https://npmmirror.com/mirrors/node/ npm_mirror: https://npmmirror.com/mirrors/npm/

这样 nvm 下载 Node 时就会从 npmmirror 拉取,速度会快非常多。macOS / Linux 下的 nvm 可以用命令设置:

nvm node_mirror https://npmmirror.com/mirrors/node/ nvm npm_mirror https://npmmirror.com/mirrors/npm/

如果修改后还是失败,检查一下镜像地址是否有效,不要用已经淘汰的旧地址。

6.3 切换 Node 版本后 npm 不见了

这个现象在 Windows 上很典型。切换版本前 npm 正常,切完之后命令行输npm -v就提示找不到命令。

原因是 nvm-windows 的版本管理逻辑和一些手动安装的 npm 全局配置冲突。常见情形是:你之前手动装过 Node.js,npm 的全局路径还指向旧目录;或者 npm 的 prefix 被设置到了旧 Node 的目录下,切换后那个目录里的 npm 也跟着变了。

我推荐的解决办法是重新设置 npm 的 prefix 到统一目录,具体操作参考前面的 4.2 节。然后把系统 Path 中所有指向其他 Node 相关目录的条目清掉,只保留D:\nodejsD:\node_global这类统一路径。

6.4 “node:util does not provide an export named” 报错

这个报错我看到不少人在网上搜,尤其是 Node 16 升到 Node 18 之后。它通常是某个 npm 包使用了旧版本 Node 的模块导出方式,而新版本里这个接口被移除了。解决思路也不是去降 Node,而是检查是哪个包出现问题,升级那个包到兼容版本。

不过这里想提醒的是另一件事:如果你发现项目在 Node 18 下面报这类错,而项目本身指定了 engines 版本,那最好直接用 nvm 切回项目要求的 Node 版本,等依赖包修复后再回来。用 nvm 的好处就是这种切换只需要一条命令,不用卸载重装。如果你还没装 nvm,而是直接改系统 Node,碰见不兼容就得手动重装,耗时且容易出错。

6.5 安装时提示“access is denied”或权限不足

Windows 下权限问题主要集中在两个场景:一是 nvm 安装目录在 C 盘系统保护目录下,二是 Node 的安装目录在C:\Program Files里。解决方式就是安装 nvm 时选择非系统盘路径。如果已经装好了,最简单的方式是卸载重装,路径选D:\nvmD:\nodejs。不是非得折腾权限设置。

macOS / Linux 下如果遇到权限问题,检查~/.nvm的归属用户是否是你当前用户:

sudo chown -R $(whoami) ~/.nvm

6.6 卸载 Node.js 后重新用 nvm 安装还是报错

这种情况通常发生在从手动安装 Node 迁移到 nvm 时,旧的环境变量残留导致冲突。

彻底的清理步骤:卸载手动安装的 Node.js 应用;删除C:\Program Files\nodejs(或你手动安装时指定的目录);删除%APPDATA%\npm%APPDATA%\npm-cache;检查并清理系统环境变量中所有含 node 和 npm 的 Path 条目;确认.npmrc文件中的配置是否还引用旧目录。清理干净后,再执行 nvm 安装新版本,基本不会出幺蛾子。

7. 我的实操心得和最终建议

用 nvm 管 Node 版本这几年,我最大的体会是:开发环境的稳定性靠的不是记住一堆技巧,而是从一开始就把目录规划好。

一定要把 nvm 和 Node 版本目录放在非系统盘、无空格、无中文的路径下。很多人默认安装到 C 盘 AppData 里也能用,但后来装全局包、配镜像、清缓存,总会碰到路径解析的奇怪问题。我见过最离谱的案例是某位同事的用户名是中文,npm 全局包里的某个工具因为路径编码问题直接无法启动,换目录重装后一切正常。

设置好默认版本和镜像源之后,再花两分钟把全局包的 prefix 指到统一目录,这套环境就能稳定用上很久。后续每次 Node 出新 LTS 版本,你只需要nvm install <版本号>nvm alias default <版本号>两步,零成本升级。老项目需要旧版本时,一条nvm use 16.20.2就切过去了,完全不影响全局环境。

另外再分享一个小技巧:项目内最好加上.nvmrc文件,里面只写一个版本号,比如18.20.4。配合终端里的nvm useavn(自动切换工具),进入项目目录就自动加载对应版本,彻底告别“我这个项目用哪个版本来着”的困惑。nvm 本身是免费开源的工具,GitHub 星星数量足以说明它的可信度,放心用就是。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询