nvm 是什么?为什么需要它?

nvm 是什么?

nvm,全称 Node Version Manager,是一个用于管理多个 Node.js 版本的命令行工具。简单来说,它让你能够在同一台机器上轻松地安装、切换、管理不同版本的 Node.js。如果你是一名开发者,需要维护多个项目,而这些项目又依赖于不同版本的 Node.js,那么 nvm 将是你的救星。

它不仅仅管理 Node.js 本身,还会一并管理每个 Node.js 版本所对应的 npm(Node Package Manager)版本,确保你的开发环境的一致性和隔离性。

为什么需要 nvm?

在日常的软件开发中,你可能会遇到以下场景,而这些正是 nvm 诞生的理由:

  • 项目兼容性问题: 你的旧项目可能依赖于 Node.js 14.x,而新项目却要求 Node.js 18.x 或更高版本。直接升级系统全局的 Node.js 版本会导致旧项目无法运行,反之亦然。nvm 允许你在不同的项目目录中轻松切换所需的 Node.js 版本,互不干扰。
  • 测试与调试: 作为库或框架的开发者,你可能需要在不同的 Node.js 版本下测试你的代码,以确保广泛的兼容性。nvm 让这一过程变得轻而易举。
  • 团队协作: 团队成员可能使用不同的操作系统或开发环境,统一 Node.js 版本可以减少因环境差异导致的问题,提高协作效率。
  • 避免全局安装冲突: 有些全局安装的 npm 包可能只兼容特定版本的 Node.js。通过 nvm,每个 Node.js 版本都有其独立的全局 npm 包安装目录,有效避免了版本冲突。

nvm 从哪里来?如何安装?

nvm 的获取与安装地点

nvm 主要面向 macOS 和 Linux 用户。它的源代码托管在 GitHub 上,你可以通过官方提供的安装脚本来便捷地获取和安装。

安装完成后,nvm 会将其自身安装在你的用户主目录下的一个隐藏文件夹中,通常是 ~/.nvm。所有通过 nvm 安装的 Node.js 版本也会存储在这个目录下。

nvm 的安装步骤

安装 nvm 并不复杂,通常只需要一行命令。

前提条件:

  • 确保你的系统上安装了 curlwget 工具。
  • 确保你有互联网连接以下载 nvm 和 Node.js。

脚本安装(推荐):

打开你的终端(Terminal),执行以下任一命令:

使用 curl 安装:


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

请注意:上述命令中的 v0.39.7 是撰写本文时的最新稳定版本号,建议访问 nvm 的 GitHub 仓库(https://github.com/nvm-sh/nvm/releases)查看最新的版本号并替换,以确保安装的是最新版本。

这个安装脚本会自动将 nvm 的加载脚本添加到你的 shell 配置文件中,例如 ~/.bashrc~/.zshrc~/.profile~/.bash_profile。它会检测你当前使用的 shell 类型,并将其配置写入正确的文件。这一步是至关重要的,因为它确保了每次你打开新的终端会话时,nvm 命令都能够被正确识别和执行。

验证安装:

安装脚本执行完毕后,你需要关闭当前终端并重新打开一个新的终端会话,或者手动加载你的 shell 配置文件,例如执行 source ~/.bashrcsource ~/.zshrc

然后,输入以下命令验证 nvm 是否安装成功:


nvm --version

如果成功,你应该能看到 nvm 的版本号,例如:0.39.7

如果提示 command not found,请仔细检查你的 shell 配置文件中是否已添加 nvm 的加载脚本,并且路径是否正确。

nvm 如何管理你的 Node.js 版本?核心命令详解

nvm 提供了直观且强大的命令行接口来管理 Node.js 版本。以下是使用频率最高的几个核心命令:

列出所有可安装的 Node.js 版本

想要知道 nvm 支持安装哪些 Node.js 版本?使用 ls-remote 命令:


nvm ls-remote

这个命令会列出所有可供安装的 Node.js 版本,包括 LTS(长期支持版)和最新的稳定版。列表可能会很长,你可以通过滚动查看或结合 grep 进行筛选。

安装特定版本的 Node.js

安装你需要的 Node.js 版本非常简单:


nvm install <version>

例如,要安装 Node.js 18.18.0 版本:


nvm install 18.18.0

要安装最新的 LTS 版本(推荐用于大多数项目):


nvm install --lts

或者直接安装最新的稳定版本:


nvm install node

当通过 nvm install 安装一个 Node.js 版本时,对应的 npm 版本也会随之安装。

查看已安装的 Node.js 版本

想知道当前机器上通过 nvm 安装了哪些 Node.js 版本?


nvm ls

这个命令会列出所有已安装的 Node.js 版本。它还会用箭头 -> 指示当前正在使用的版本,并用 (default) 标记出默认版本(即新开终端时会自动使用的版本)。


    v14.21.3
    v16.20.2
->  v18.18.0 (Current)
    v20.9.0
    default -> 18.18.0 (node -> v18.18.0)

上述输出表示当前正在使用的是 v18.18.0,并且默认版本也设置为 v18.18.0

切换 Node.js 版本

这是 nvm 最核心的功能之一。你可以随时切换到你需要的 Node.js 版本:


nvm use <version>

例如,要切换到 Node.js 16.20.2 版本:


nvm use 16.20.2

切换成功后,你可以通过 node -vnpm -v 命令来验证当前 Node.js 和 npm 的版本。

注意: nvm use 命令只对当前终端会话有效。当你关闭当前终端并重新打开时,如果你没有设置默认版本,它会回到你配置的默认版本。

项目特定的 .nvmrc 文件:

为了方便团队协作和项目管理,你可以在项目的根目录下创建一个名为 .nvmrc 的文件,并在其中指定该项目所需的 Node.js 版本号,例如:


echo "18.18.0" > .nvmrc

然后,当你在该项目目录下执行:


nvm use

nvm 就会自动读取 .nvmrc 文件并切换到指定的 Node.js 版本。如果该版本尚未安装,nvm 会提示你安装。这对于需要确保所有开发人员使用同一 Node.js 版本的项目非常有用。

设置默认 Node.js 版本

如果你希望每次打开新的终端会话时都自动使用某个特定版本的 Node.js,可以将其设置为默认版本:


nvm alias default <version>

例如,将 Node.js 18.18.0 设置为默认版本:


nvm alias default 18.18.0

你也可以将默认版本设置为最新安装的 LTS 版本:


nvm alias default node

要取消默认版本,可以执行:


nvm unalias default

卸载 Node.js 版本

当你不再需要某个 Node.js 版本时,可以将其卸载以节省磁盘空间:


nvm uninstall <version>

例如,卸载 Node.js 14.21.3 版本:


nvm uninstall 14.21.3

请注意,你不能卸载当前正在使用的 Node.js 版本。你需要先切换到其他版本,然后才能卸载。

在特定版本下执行命令

有时候你可能不想改变当前会话的 Node.js 版本,但又想用特定版本执行某个脚本。nvm exec 命令就是为此而生:


nvm exec <version> <command>

例如,用 Node.js 16.20.2 运行一个名为 my-script.js 的文件:


nvm exec 16.20.2 node my-script.js

这会在不切换当前 Node.js 版本的情况下,临时使用指定版本执行命令。

管理全局 npm 包

这是使用 nvm 时一个常见的疑问点。每个通过 nvm 安装的 Node.js 版本都有其独立的全局 npm 包目录。这意味着当你切换 Node.js 版本时,之前安装在另一个版本下的全局包不会自动迁移过来。

旧版本全局包的迁移:

nvm 提供了一个方便的选项,可以在安装新版本 Node.js 时,自动将某个旧版本的所有全局包重新安装到新版本下:


nvm install <new_version> --reinstall-packages-from=<old_version>

例如,从 Node.js 18.18.0 迁移所有全局包到新安装的 20.9.0 版本:


nvm install 20.9.0 --reinstall-packages-from=18.18.0

这会重新安装 18.18.0 版本下所有通过 npm install -g 安装的包。

手动重新安装全局包:

如果你忘记使用 --reinstall-packages-from 选项,或者想手动管理全局包,可以这样做:

  1. 切换到你之前安装了全局包的 Node.js 版本:

    nvm use <old_version>
  2. 列出所有全局安装的包:

    npm ls -g --depth=0

    这将显示所有顶层的全局包。
  3. 切换到新的 Node.js 版本:

    nvm use <new_version>
  4. 针对你在第二步列出的每个包,在新版本下重新安装:

    npm install -g <package-name>

    例如:npm install -g yarn

nvm 内部工作原理与常见疑问解答

nvm 如何实现版本切换?

nvm 的工作原理主要是通过修改你的 shell 环境变量 PATH 来实现的。

  • 当你安装 nvm 时,它会将一个函数(通常是 nvm.sh)添加到你的 shell 配置文件中。
  • 当你执行 nvm use <version> 命令时,nvm 会动态地将指定 Node.js 版本的安装路径(例如 ~/.nvm/versions/node/v18.18.0/bin)添加到你 PATH 环境变量的最前端。
  • 由于 PATH 环境变量是从左到右查找可执行文件的,系统会优先找到并使用 nvm 设置的 Node.js 路径,而不是系统中可能存在的其他 Node.js 版本。
  • 每个 Node.js 版本都会被 nvm 安装到独立的目录下,例如 ~/.nvm/versions/node/vX.Y.Z,从而实现版本间的隔离。

遇到问题怎么办?常见故障排除

“nvm: command not found”

这是最常见的问题,通常意味着 nvm 的加载脚本没有被正确执行。

  1. 重新打开终端: 关闭所有终端窗口,然后重新打开一个新的终端。这是因为 shell 配置文件通常只在新会话启动时加载。
  2. 手动加载配置文件: 如果重新打开终端无效,尝试手动执行你的 shell 配置文件:

    • 对于 Bash 用户:source ~/.bashrcsource ~/.bash_profile
    • 对于 Zsh 用户:source ~/.zshrc
  3. 检查配置文件: 使用文本编辑器打开你的 shell 配置文件(例如 ~/.bashrc),确保其中包含 nvm 的加载脚本(通常是几行包含 NVM_DIR[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" 的代码)。如果没有,你需要手动添加或重新运行安装脚本。
  4. PATH 路径问题: 确保 NVM_DIR 变量指向正确的 nvm 安装路径,通常是 $HOME/.nvm

安装后 node -v 仍是旧版本

这通常发生在 nvm 切换了版本,但你的当前终端会话没有刷新其 PATH 环境变量。

  1. 执行 nvm use <version> 后,确认输出信息是否表明切换成功。
  2. 尝试执行 hash -r 命令,这会清除 shell 的命令哈希缓存,强制它重新查找命令路径。
  3. 如果问题依旧,确保你没有在其他地方(例如 /usr/local/bin)手动安装了全局的 Node.js,这可能会导致冲突。可以尝试卸载全局安装的 Node.js。

全局包丢失问题

如前所述,当你切换 Node.js 版本时,全局 npm 包不会自动跟着切换。

  1. 使用 nvm install <new_version> --reinstall-packages-from=<old_version> 在安装新版本时迁移旧的全局包。
  2. 或者手动列出旧版本的全局包,然后在新版本下重新安装。

一般性建议: 遇到任何奇怪的问题时,首先尝试关闭并重新打开终端。如果问题持续,检查你的 shell 配置文件和 nvm 相关的环境变量设置。

nvm 自身如何更新?

nvm 自身也可以更新到最新版本。最推荐的方式是重新运行安装脚本。

  1. 首先,查找最新的 nvm 版本号(在 nvm 的 GitHub 仓库 releases 页面)。
  2. 然后,执行更新脚本(与安装脚本相同):

    curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/<最新版本号>/install.sh | bash

    或者

    wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/<最新版本号>/install.sh | bash
  3. 更新完成后,关闭并重新打开终端,然后通过 nvm --version 验证更新是否成功。

这种方法会用新版本的 nvm 脚本覆盖旧版本,同时保留你已安装的 Node.js 版本。

总结与提示

nvm 是一个极其强大且实用的工具,它极大地简化了 Node.js 版本的管理工作。通过本文的详细介绍,相信你已经掌握了 nvm 的安装、核心命令使用、以及常见问题的解决办法。

合理使用 nvm,可以让你在复杂的项目环境中游刃有余,避免因 Node.js 版本冲突带来的烦恼,从而更专注于代码本身的开发。养成在项目中使用 .nvmrc 文件的习惯,将进一步提升你的开发效率和团队协作体验。

现在,去享受多版本 Node.js 带来的便利吧!

nvm使用教程