📌 项目地址nvm-sh/nvm | ⭐ 94,450 颗星 | 🔧 Shell | 📜 未标注

一个所有 Node 开发者都遇到过的痛点

你在同时维护两个项目:一个跑在 Node 14 上,一个需要 Node 20。你不想为了切换版本去改系统 PATH、不想用 Docker 包装一切、更不想为了一个旧项目把新版本卸了重装。

nvm 解决的就是这个具体问题:它是运行在 POSIX 兼容 shell(bash、zsh、fish 等)上的 bash 脚本,让你可以在命令行里快速安装、切换不同版本的 Node.js。它不是守护进程,不是桌面应用,就是一份脚本,装在你用户目录下,改你的 shell 环境变量,仅此而已。

快速上手:从安装到切换

安装方式只有一个官方脚本(建议先看一眼 README 确认最新版本号):

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

安装完成后,nvm 会尝试自动写入你的 shell 配置文件(.bashrc.zshrc 等)。然后你可以验证是否成功:

command -v nvm

如果输出了 nvm,说明装好了。如果没输出,检查一下你当前 shell 的配置文件是否加载了 nvm 的初始化脚本,或者直接重开终端。

核心用法:安装、切换、设默认

以下是 nvm 最常用的几个命令,全部来自 README:

安装指定版本的 Node:

nvm install 20.0.0        # 安装具体版本
nvm install node          # 安装最新稳定版
nvm install --lts         # 安装最新 LTS

切换到指定版本:

nvm use 16.14.0

查看本机装了哪些版本:

nvm ls

查看远端有哪些可用版本:

nvm ls-remote

设置默认版本(每次打开终端自动使用):

nvm alias default 18.12.1

nvm alias default 设为默认后,新开的 shell 会自动加载这个版本的 Node。还可以用 nvm alias 设置自定义别名,比如 nvm alias lts/hydrogen 18.12.1 这样把某个版本绑定到一个好记的名字上。

被很多人忽略的实用细节

1. 用 .nvmrc 锁定项目版本

你可以在项目根目录放一个 .nvmrc 文件,内容只写一个版本号(如 18.12.1),然后执行:

nvm use

nvm 会自动读取这个文件并切换到对应版本。README 中还给出了 bash、zsh、fish 的自动化配置代码,让 cd 进入目录时自动触发 nvm use,但那段代码较长且需要手动写入,建议直接查阅 README 的 “Deeper Shell Integration” 一节。

2. 切换版本时迁移全局包

从旧版本切到新版本时,可以用:

nvm install new-version --reinstall-packages-from=old-version

比如 nvm install 20.0.0 --reinstall-packages-from=18.12.1,会先把 18.12.1 里的全局 npm 包装到 20.0.0 上,再完成切换。同时在安装时还有一个类似功能,可以指定从某个文件读取默认全局包列表。

3. 用镜像源加速下载

国内用户或内网用户可以通过环境变量指定镜像:

export NVM_NODEJS_ORG_MIRROR=https://npmmirror.com/mirrors/node/
nvm install 20.0.0

README 里同样支持通过 NVM_IOJS_ORG_MIRROR 设置 io.js 的镜像,以及通过 NVM_NODEJS_ORG_MIRROR 的变体传递 Authorization header 给私有镜像。

4. 离线安装

已经下载过某个版本的二进制包后,nvm 会缓存它,下次安装同一版本时直接使用本地缓存。README 明确提到支持通过设置 NVM_DIR 下的缓存目录实现离线安装场景。

它和 n、fnm、volta 的区别

这类工具不止 nvm 一个,但 nvm 有几个鲜明特征:

  • POSIX-compliant bash 脚本:你可以读完它的源码,它没有复杂的二进制依赖,几乎所有 Linux/macOS 环境都能跑。
  • 不修改系统级文件:nvm 装在你用户目录下($NVM_DIR),只改你当前用户的 shell 环境变量,不碰 /usr/bin,无需 sudo
  • 完全支持 .nvmrc 与 LTS 命令:比如 nvm install --ltsnvm ls-remote --lts 这类专门针对 Node LTS 发布节奏的命令,在其它工具里不一定有这么完整的对应实现。
  • WSL 支持:README 专门有 WSL Troubleshooting 一节,说明它在 WSL(Windows Subsystem for Linux)下经过充分验证,这也是 Windows 用户使用 nvm 的主流方式。

如果你用的是 Windows 原生环境,nvm 官方明确不支持(README 中 Compatibility Issues 一节列出了不支持项),你需要用 WSL、Git Bash 环境,或者寻找专门面向 Windows 的方案。

常见问题与注意事项

  • macOS 上如果报错:README 的 Troubleshooting on macOS 一节指出,先确认 Command Line Tools 是否安装(xcode-select --install)。在某些系统上还需要检查 shell 的启动配置文件是否被安全策略拦截。
  • Git 方式安装:你也可以先 git clone https://github.com/nvm-sh/nvm.git,然后执行目录中的 install.sh 完成安装。后续升级改用 git pull 拉取最新代码即可。
  • 卸载 nvm:README 给了手动卸载步骤,一是移除 nvm 相关的 shell 配置行,二是删除 $NVM_DIR 目录,三是在需要时手动清理 .nvmrc 之类的残留。
  • Shell 兼容性:nvm 是 bash 脚本,但它设计为兼容 zsh 和 fish。在 fish 下它会提供适配逻辑,具体参考 README 中对应节。

适合谁用

如果你经常需要在不同 Node 大版本间切换(NestJS 项目、Next.js 项目、老系统维护、不同 CI 环境本地复现),nvm 几乎是这个场景下最直接的解决方案。如果你只在固定版本上做开发,它的价值不大,系统包管理器自带的 Node 就够用。

readme 全文还包含 Docker 环境的安装方式、Ansible 自动化安装、Alpine Linux 的注意事项、自定义输出颜色等多个细节,建议按需查阅。

这篇文章对你有帮助吗?

发表回复