Heidi Labs
GitHub TrendingGitHub Trending 项目约 67 分钟26,948 字

nvm:Node.js 版本管理器

本文目录

目录#

  • 简介
  • 关于
  • 安装与更新
  • 安装与更新脚本
  • 补充说明
  • 在 Docker 中安装
  • 在 Docker 中为 CI/CD 任务安装
  • Linux 上的故障排查
  • macOS 上的故障排查
  • Ansible
  • 验证安装
  • 重要说明
  • Git 安装
  • 手动安装
  • 手动升级
  • 使用
  • 长期支持
  • 版本类别
  • 安装时迁移全局包
  • 在已安装版本之间迁移全局包
  • 离线安装
  • 安装时从文件安装默认全局包
  • io.js
  • Node 的系统版本
  • 列出可用版本
  • 设置自定义颜色
  • 持久化自定义颜色
  • 抑制彩色输出
  • 恢复 PATH
  • 设置默认 Node 版本
  • 使用 Node 二进制镜像
  • 向镜像传递 Authorization 头
  • 没有官方二进制的平台
  • .nvmrc
  • 更深入的 shell 集成
  • 在包含 .nvmrc 文件的目录中自动调用 nvm use
  • bash
  • zsh
  • fish
  • 运行测试
  • 环境变量
  • Bash 补全
  • 用法
  • 兼容性问题
  • 在 Alpine Linux 上安装 nvm
  • Alpine Linux 3.13+
  • Alpine Linux 3.5 - 3.12
  • 卸载 / 移除
  • 手动卸载
  • 用于开发环境的 Docker
  • 常见问题
  • macOS 故障排查
  • WSL 故障排查
  • 维护者
  • 项目支持
  • 企业支持
  • 许可证
  • 版权声明

简介#

nvm 让你可以通过命令行快速安装和使用不同版本的 Node。

示例:

$ nvm install 24
Now using node v24.14.0 (npm v11.9.0)
$ node -v
v24.14.0
$ nvm use 22
Now using node v22.22.1 (npm v10.9.4)
$ node -v
v22.22.1
$ nvm use 20
Now using node v20.20.1 (npm v10.8.2)
$ node -v
v20.20.1

就这么简单!

关于#

nvm 是 node.js 的版本管理器,设计为按用户安装、按 shell 调用。nvm 可在任何符合 POSIX 的 shell(sh、dash、ksh、zsh、bash)中运行,特别是在这些平台上:unix、macOS 和 Windows WSL。

安装与更新#

安装与更新脚本#

要安装或更新 nvm,你应当运行安装脚本。你可以手动下载并运行该脚本,或使用以下 cURL 或 Wget 命令:

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

运行上述任一命令都会下载一个脚本并执行它。该脚本会将 nvm 仓库克隆到 ~/.nvm,并尝试将下面片段中的 source 行添加到正确的配置文件(~/.bashrc、~/.bash_profile、~/.zshrc 或 ~/.profile)。如果你发现安装脚本更新了错误的配置文件,请将 $PROFILE 环境变量设置为该配置文件的路径,然后重新运行安装脚本。

export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm

补充说明#

如果环境变量 $XDG_CONFIG_HOME 存在,nvm 文件将被放在该目录下。

你可以在上述脚本末尾添加 --no-use,以推迟使用 nvm,直到你手动使用它:

export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" --no-use # This loads nvm, without auto-using the default version

你可以使用 NVM_SOURCE、NVM_DIR、PROFILE 和 NODE_VERSION 变量自定义安装源、目录、配置文件和版本。 例如:curl ... | NVM_DIR="path/to/nvm"。请确保 NVM_DIR 末尾不包含斜杠。

安装程序可以使用 git、curl 或 wget 下载 nvm,取决于哪个可用。

你可以通过在运行 install.sh 脚本之前设置 PROFILE=/dev/null,指示安装程序不要编辑你的 shell 配置(例如,如果你已经通过 zsh nvm 插件获得补全)。下面是一行命令示例:PROFILE=/dev/null bash -c 'curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.41.0/install.sh | bash'

在 Docker 中安装#

当以非交互式 shell 调用 bash 时,例如在 Docker 容器中,不会加载任何常规配置文件。为了像平常一样使用 nvm、node 和 npm,你可以改为指定特殊的 BASH_ENV 变量,bash 在非交互式调用时会加载它。

# Use bash for the shell
SHELL ["/bin/bash", "-o", "pipefail", "-c"]

# Create a script file sourced by both interactive and non-interactive bash shells
ENV BASH_ENV="${HOME:-/root}/.bash_env"
RUN touch "${BASH_ENV}"
RUN echo '. "${BASH_ENV}"' >> ~/.bashrc

# Download and install nvm
RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.41.0/install.sh | PROFILE="${BASH_ENV}" bash
RUN echo node > .nvmrc
RUN nvm install

在 Docker 中为 CI/CD 任务安装#

这种方式更稳健,适用于 CI/CD 任务。可在交互式和非交互式容器中运行。 参见 #3531。

FROM ubuntu:latest
ARG NODE_VERSION=20

# install curl
RUN apt update && apt install curl -y

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

# set env
ENV NVM_DIR="${HOME:-/root}/.nvm"

# install node
RUN bash -c "source $NVM_DIR/nvm.sh && nvm install $NODE_VERSION"

# set ENTRYPOINT for reloading nvm-environment
ENTRYPOINT ["bash", "-c", "source $NVM_DIR/nvm.sh && exec \"$@\"", "--"]

# set cmd to bash
CMD ["/bin/bash"]

此示例默认安装 nodejs 版本 20.x.y。你也可以通过 docker build 参数轻松覆盖版本,例如:

docker build -t nvmimage --build-arg NODE_VERSION=19 .

创建镜像后,你可以交互式启动容器并运行命令,例如:

docker run --rm -it nvmimage
root@0a6b5a237c14:/# nvm -v
0.41.0
root@0a6b5a237c14:/# node -v
v19.9.0
root@0a6b5a237c14:/# npm -v
9.6.3

非交互式示例:

user@host:/tmp/test $ docker run --rm -it nvmimage node -v
v19.9.0
user@host:/tmp/test $ docker run --rm -it nvmimage npm -v
9.6.3

Linux 上的故障排查#

在 Linux 上,运行安装脚本后,如果你得到 nvm: command not found,或者在输入 command -v nvm 后终端没有反馈,只需关闭当前终端,打开一个新终端,然后再次尝试验证。 或者,你可以在命令行中为不同的 shell 运行以下命令:

  • bash:source ~/.bashrc
  • zsh:source ~/.zshrc
  • ksh:. ~/.profile

这些命令应当能加载 nvm 命令。

macOS 上的故障排查#

自 OS X 10.9 起,/usr/bin/git 已被 Xcode 命令行工具预设,这意味着我们无法正确检测 Git 是否已安装。你需要在运行安装脚本之前手动安装 Xcode 命令行工具,否则安装会失败。(参见 #1782)

如果在运行安装脚本后得到 nvm: command not found,可能是以下原因之一:

  • 自 macOS 10.15 起,默认 shell 是 zsh,nvm 会寻找 .zshrc 来更新,而默认没有安装该文件。用 touch ~/.zshrc 创建一个,然后再次运行安装脚本。
  • 如果你使用 bash(之前的默认 shell),你的系统可能没有设置命令所需的 .bash_profile 或 .bashrc 文件。用 touch ~/.bash_profile 或 touch ~/.bashrc 创建其中一个,然后再次运行安装脚本。接着运行 . ~/.bash_profile 或 . ~/.bashrc 来加载 nvm 命令。
  • 你之前使用过 bash,但安装了 zsh。你需要手动将这些行添加到 ~/.zshrc,并运行 . ~/.zshrc。
  • 你可能需要重启终端实例,或运行 . ~/.nvm/nvm.sh。重启终端/打开新标签页或窗口,或运行 source 命令,都会加载该命令和新配置。

如果上述方法没有帮助,你可能需要重启终端实例。尝试在终端中打开新标签页或窗口并重试。

如果上述方法仍不能解决问题,你可以尝试以下操作:

  • 如果你使用 bash,可能是你的 .bash_profile(或 ~/.profile)没有正确加载 ~/.bashrc。你可以通过向其中添加 source ~/<your_profile_file> 或执行下面的下一步来修复。
  • 尝试将安装部分中的片段(用于找到正确的 nvm 目录并加载 nvm)添加到你的常用配置文件(~/.bash_profile、~/.zshrc、~/.profile 或 ~/.bashrc)。

关于此问题及可能的解决方法的更多信息,请参见这里。

注意:对于搭载 Apple Silicon 芯片的 Mac,Node 自 v16.0.0 起开始提供 arm64 架构的 Darwin 包,并且自 v14.17.0 起在从源码编译时提供实验性的 arm64 支持。如果你在使用 nvm 安装 Node 时遇到问题,可能需要更新到这些版本或更高版本。

Ansible#

你可以使用以下任务:

- name: Install nvm
  ansible.builtin.shell: >
    curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.41.0/install.sh | bash
  args:
    creates: "{{ ansible_env.HOME }}/.nvm/nvm.sh"

验证安装#

要验证 nvm 是否已安装,请执行:

command -v nvm

如果安装成功,应当输出 nvm。请注意 which nvm 不会生效,因为 nvm 是一个被 source 的 shell 函数,而不是可执行二进制文件。

注意:在 Linux 上,运行安装脚本后,如果你得到 nvm: command not found,或者在输入 command -v nvm 后终端没有反馈,只需关闭当前终端,打开一个新终端,然后再次尝试验证。

重要说明#

如果你运行的系统没有预打包的二进制文件,这意味着你将从源码编译安装 node 或 io.js,你需要确保系统有 C++ 编译器。对于 OS X,Xcode 即可;对于基于 Debian/Ubuntu 的 GNU/Linux,build-essential 和 libssl-dev 包即可。

注意:nvm 在某些情况下也支持 Windows。它应当能通过 WSL(Windows Subsystem for Linux)工作,具体取决于 WSL 版本。它也应当能与 Git Bash(MSYS)或 Cygwin 配合使用。否则,对于 Windows,存在一些替代方案,但它们既不受我们支持,也不由我们开发:

  • nvm-windows
  • nodist
  • nvs

注意:nvm 也不支持 Fish(参见 #303)。存在替代方案,但它们既不受我们支持,也不由我们开发:

  • bass 允许你在 fish shell 中使用为 Bash 编写的工具
  • fast-nvm-fish 只能使用版本号(不能使用别名),但不会显著拖慢 shell 启动
  • plugin-nvm 是 Oh My Fish 的插件,使 nvm 及其补全在 fish shell 中可用
  • nvm.fish - 专为 Fish 打造的、你会喜爱的 Node.js 版本管理器
  • fish-nvm - 面向 fish 的 nvm 包装器,延迟加载 nvm 直到实际使用

注意:我们在 FreeBSD 上仍有一些问题,因为 FreeBSD 没有官方预构建二进制文件,而从源码构建可能需要打补丁;参见问题单:

  • [#900] [Bug] FreeBSD 上的 node 可能需要打补丁
  • nodejs/node#3716

注意:在 OS X 上,如果你没有安装 Xcode,又不想下载约 4.3GB 的文件,可以安装 Command Line Tools。你可以查看这篇博客文章了解如何操作:

  • How to Install Command Line Tools in OS X Mavericks & Yosemite (Without Xcode)

注意:在 OS X 上,如果你安装过/曾经安装过「系统」Node,并且想全局安装模块,请记住:

  • 使用 nvm 时,你不需要 sudo 就可以用 npm -g 全局安装模块,因此不要执行 sudo npm install -g grunt,而应执行 npm install -g grunt
  • 如果你有 ~/.npmrc 文件,请确保它不包含任何 prefix 设置(这与 nvm 不兼容)
  • 你可以(但不应该?)保留之前的「系统」Node 安装,但 nvm 只对你的用户账户(安装 nvm 所用的账户)可用。这可能导致版本不匹配,因为其他用户将使用 /usr/local/lib/node_modules/*,而你的用户账户使用 ~/.nvm/versions/node/vX.X.X/lib/node_modules/*

不支持通过 Homebrew 安装。如果你遇到 Homebrew 安装的 nvm 问题,请先 brew uninstall 它,然后按照下面的说明安装,再提交问题。

注意:如果你使用 zsh,可以轻松地将 nvm 作为 zsh 插件安装。安装 zsh-nvm 并运行 nvm upgrade 来升级(你可以设置 NVM_AUTO_USE=true,让它自动检测并使用 .nvmrc 文件)。

注意:v1.7 之前的 Git 版本可能无法通过 https 协议从 GitHub 克隆 nvm 源码,v1.6 之前的 git 行为也有所不同,而 v1.17.10 之前的 git 无法克隆标签,因此最低要求的 git 版本是 v1.7.10。如果你对我们提到的问题感兴趣,请参阅 GitHub 的 HTTPS 克隆错误文章。

Git 安装#

如果你已安装 git(需要 git v1.7.10+):

  • 将此仓库克隆到你的用户配置文件根目录
  • 从任意位置 cd ~/,然后 git clone https://github.com/nvm-sh/nvm.git .nvm
  • cd ~/.nvm 并用 git checkout v0.41.0 检出最新版本
  • 通过从 shell 中 source 来激活 nvm:. ./nvm.sh

现在将以下行添加到你的 ~/.bashrc、~/.profile 或 ~/.zshrc 文件,以便登录时自动加载: (你可能需要添加到上述多个文件中)

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

手动安装#

对于完全手动安装,请执行以下行,先将 nvm 仓库克隆到 $HOME/.nvm,然后加载 nvm:

export NVM_DIR="$HOME/.nvm" && (
  git clone https://github.com/nvm-sh/nvm.git "$NVM_DIR"
  cd "$NVM_DIR"
  git checkout `git describe --abbrev=0 --tags --match "v[0-9]*" $(git rev-list --tags --max-count=1)`
) && \. "$NVM_DIR/nvm.sh"

现在将以下行添加到你的 ~/.bashrc、~/.profile 或 ~/.zshrc 文件,以便登录时自动加载: (你可能需要添加到上述多个文件中)

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

手动升级#

使用 git 手动升级(需要 git v1.7.10+):

  • 切换到 $NVM_DIR
  • 拉取最新变更
  • 检出最新版本
  • 激活新版本
(
  cd "$NVM_DIR"
  git fetch --tags origin
  git checkout `git describe --abbrev=0 --tags --match "v[0-9]*" $(git rev-list --tags --max-count=1)`
) && \. "$NVM_DIR/nvm.sh"

使用#

要下载、编译并安装最新版本的 Node,请执行:

nvm install node # "node" is an alias for the latest version

要安装特定版本的 Node:

nvm install 14.7.0 # or 16.3.0, 12.22.1, etc

要设置别名:

nvm alias my_alias v14.4.0

确保你的别名不包含任何空格或斜杠。

第一个安装的版本会成为默认版本。新的 shell 会以默认版本的 Node 启动(例如 nvm alias default)。

你可以使用 ls-remote 列出可用版本:

nvm ls-remote

当未指定版本或 --lts 过滤器时,列表还会标记 node 别名将安装的版本,以及你自己的每个别名将解析到的版本。每种注释始终从相同列开始,因此可以用 cut -c 或类似工具对输出进行切片:

 v20.9.0 (Latest LTS: Iron) (Aliases: work)
 v21.0.0
 v21.1.0
 v21.2.0 (Latest: node) (Aliases: default)

然后在任何新 shell 中使用已安装的版本:

nvm use node

或者你可以直接运行它:

nvm run node --version

或者,你可以在子 shell 中使用所需版本的 Node 运行任意命令:

nvm exec 4.2 node --version

你还可以获取已安装可执行文件的路径:

nvm which 12.22

在 nvm install、nvm use、nvm run、nvm exec、nvm which 等命令中,你可以使用以下特殊默认别名来代替 "14.7"、"16.3" 或 "12.22.1" 这样的版本指针:

  • node:安装最新版本的 Node
  • iojs:安装最新版本的 io.js
  • stable:此别名已弃用,只真正适用于 Node v0.12 及更早版本。目前它是 node 的别名。
  • unstable:此别名指向 Node v0.11——最后一个「不稳定」的 Node 版本,因为 1.0 之后所有 Node 版本都是稳定的。(在 SemVer 中,版本传达的是破坏性变更,而不是稳定性)。
  • current:当前 shell 中活动的版本(即 node 通过 $PATH 解析到的版本)。它不受 .nvmrc 影响。当你想显式引用活动版本时很有用——例如 nvm which current 总是打印活动 Node 的路径,无论是否存在 .nvmrc 文件。

长期支持#

Node 有长期支持(LTS)计划。你可以在别名和 .nvmrc 文件中使用 lts/* 表示最新 LTS,使用 lts/argon 表示「argon」系列的 LTS 发布。此外,以下命令支持 LTS 参数:

nvm install --lts / nvm install --lts=argon / nvm install 'lts/*' / nvm install lts/argon

nvm uninstall --lts / nvm uninstall --lts=argon / nvm uninstall 'lts/*' / nvm uninstall lts/argon

nvm use --lts / nvm use --lts=argon / nvm use 'lts/*' / nvm use lts/argon

nvm exec --lts / nvm exec --lts=argon / nvm exec 'lts/*' / nvm exec lts/argon

nvm run --lts / nvm run --lts=argon / nvm run 'lts/*' / nvm run lts/argon

nvm ls-remote --lts / nvm ls-remote --lts=argon nvm ls-remote 'lts/*' / nvm ls-remote lts/argon

nvm version-remote --lts / nvm version-remote --lts=argon / nvm version-remote 'lts/*' / nvm version-remote lts/argon

每当你的本地 nvm 副本连接到 https://nodejs.org 时,它都会为所有可用的 LTS 系列重新创建相应的本地别名。这些别名(存储在 $NVM_DIR/alias/lts 下)由 nvm 管理,你不应修改、删除或创建这些文件——你的更改会被撤销,乱动这些文件会导致很可能不受支持的 bug。

要获取最新 LTS 版本的 Node 并迁移现有已安装的包,请使用:

nvm install --reinstall-packages-from=current 'lts/*'

版本类别#

每个 Node 版本都属于以下类别之一:

  • alpha:Alpha 预发布版,例如 v27.0.0-alpha.1.0.0,位于某个大版本首次发布之前
  • lts:在镜像的 index.tab 中标记为 LTS 的版本
  • non-lts:任何其他 Node 版本
  • iojs:来自 io.js 镜像的任何 io.js 版本

默认情况下,nvm 会选择除 alpha 之外所有类别中的版本,因此 nvm install node、nvm install 27 和 nvm ls-remote 绝不会选择或显示 Alpha。每个选择或列出版本的命令都接受 --only=,后跟逗号分隔的类别列表,以替代默认行为;只有包含 alpha 时才会选择 Alpha,即使是精确版本:

nvm ls-remote --only=alpha
nvm install --only=alpha 27
nvm use --only=alpha,lts,non-lts 27.0.0-alpha.1.0.0

要更改默认值,请将 NVM_ONLY 设置为相同类型的列表,例如在你的 shell 配置文件中;--only= 会覆盖它。LTS 选择(--lts、--lts=<name> 或 lts/ 版本)会通过匹配的 lts/ 别名选择版本,因此只选择 LTS 版本,并且不能与排除 lts 的 --only= 组合使用。

别名也可以存储 --only=,因此 nvm alias default --only=alpha node 会把最新安装的 Node 版本(包括 Alpha)设为默认值。

区分已安装的 lts 和 non-lts 版本,依赖 nvm 每次下载可用版本列表时记录的 LTS 状态;如果从未下载过,第一个需要它的命令会下载一次该列表。

安装时迁移全局包#

如果你想安装新版本的 Node.js 并从先前版本迁移 npm 包:

nvm install --reinstall-packages-from=node node

这会首先使用 nvm version node 确定你当前要从中迁移包的版本。然后从远程服务器解析要安装的新版本并安装。最后,它运行 nvm reinstall-packages,将 npm 包从先前的 Node 版本重新安装到新版本。

你也可以像这样从特定版本的 Node 安装并迁移 npm 包:

nvm install --reinstall-packages-from=5 6
nvm install --reinstall-packages-from=iojs v4.2

请注意,显式重新安装包不会更新 npm 版本——这是为了确保 npm 不会被意外升级到与新 Node 版本不兼容的版本。

要同时更新 npm,请添加 --latest-npm 标志,如下所示:

nvm install --reinstall-packages-from=default --latest-npm 'lts/*'

或者,你可以随时运行以下命令,在当前 Node 版本上获取支持的最新 npm 版本:

nvm install-latest-npm

如果你已经遇到类似「npm does not support Node.js」的错误,你需要:(1) 回退到先前的 Node 版本(nvm ls 和 nvm use <your latest _working_ version from the ls>),(2) 删除新创建的 Node 版本(nvm uninstall <your _broken_ version of node from the ls>),然后 (3) 使用 --latest-npm 标志重新运行 nvm install。

在已安装版本之间迁移全局包#

--reinstall-packages-from 与 nvm install 绑定。要在已经安装的版本之间迁移全局 npm 包,而不(重新)安装任何东西,请对目标版本执行 nvm use,然后将 nvm reinstall-packages 作为独立命令运行,指向你要从中复制的版本:

nvm use 22.22.2
nvm reinstall-packages 22.20.0

这会将 22.20.0 中的所有全局包重新安装到当前活动版本(22.22.2)。与 --reinstall-packages-from 一样,npm 版本本身不会改变。

离线安装#

如果你之前下载过某个 Node 版本(或者它仍在缓存中),可以使用 --offline 标志在没有任何网络访问的情况下安装它:

nvm install --offline 14.7.0

这仅使用本地已安装的版本和缓存的下载来解析版本。它不会尝试下载任何东西。这在气隙环境中、飞机上,或者当你想避免网络延迟时很有用。

只有当下载的校验和验证通过后,它才会被加入缓存($NVM_DIR/.cache)。--offline 不会再次验证缓存的归档,因此通过其他方式放入缓存的任何内容都会被原样信任。

你可以将 --offline 与 --lts 组合使用,以安装最新的已缓存 LTS 版本(前提是先前运行过 nvm ls-remote --lts 填充了 LTS 别名):

nvm install --offline --lts

安装时从文件安装默认全局包#

如果你有一份希望每次安装新版本时都安装的默认包列表,我们也支持——只需将包名逐行添加到文件 $NVM_DIR/default-packages 中。你可以添加 npm 在命令行上接受的任何包参数。

# $NVM_DIR/default-packages

rimraf
object-inspect@1.0.2
stevemao/left-pad

io.js#

警告

io.js 是 Node.js 的一个分支,创建于 2014 年,并于 2015 年合并回来。io.js 发布了 v1、v2 和 v3 发布线;合并后,node.js 开始以 v4 发布。

如果你想安装 io.js:

nvm install iojs

如果你想安装新版本的 io.js 并从先前版本迁移 npm 包:

nvm install --reinstall-packages-from=iojs iojs

关于 Node 中迁移 npm 包的相同指南也适用于 io.js。

Node 的系统版本#

如果你想使用系统安装的 Node 版本,可以使用特殊默认别名 system:

nvm use system
nvm run system --version

列出可用版本#

如果你想查看已安装的版本:

nvm ls

如果你想查看可安装的版本:

nvm ls-remote

设置自定义颜色#

你可以设置五种颜色,用于显示版本和别名信息。这些颜色会替换默认颜色。 初始颜色为:g b y r e

颜色代码:

  • r/R = 红色 / 粗体红色
  • g/G = 绿色 / 粗体绿色
  • b/B = 蓝色 / 粗体蓝色
  • c/C = 青色 / 粗体青色
  • m/M = 品红色 / 粗体品红色
  • y/Y = 黄色 / 粗体黄色
  • k/K = 黑色 / 粗体黑色
  • e/W = 浅灰色 / 白色
nvm set-colors rgBcm

持久化自定义颜色#

如果你希望自定义颜色在 shell 终止后仍然保留,请在 shell 配置文件中导出 NVM_COLORS 变量。例如,如果你想使用青色、品红色、绿色、粗体红色和粗体黄色,请添加以下行:

export NVM_COLORS='cmgRY'

抑制彩色输出#

nvm help(或 -h 或 --help)、nvm ls、nvm ls-remote 和 nvm alias 通常会产生彩色输出。你可以使用 --no-colors 选项(或设置环境变量 TERM=dumb)禁用颜色:

nvm ls --no-colors
nvm help --no-colors
TERM=dumb nvm ls

恢复 PATH#

要恢复你的 PATH,你可以停用它:

nvm deactivate

设置默认 Node 版本#

要设置在任何新 shell 中使用的默认 Node 版本,请使用别名 default:

nvm alias default node # this refers to the latest installed version of node
nvm alias default 18 # this refers to the latest installed v18.x version of node
nvm alias default 18.12 # this refers to the latest installed v18.12.x version of node
nvm alias default --lts node # this refers to the latest installed LTS version of node
nvm alias default --lts=iron 20 # this refers to the latest installed v20.x version of node from the "iron" LTS line

nvm 每次下载可用版本列表时都会记录每个版本的 LTS 状态,因此 --lts 别名知道哪些已安装版本是 LTS。

使用 Node 二进制镜像#

要使用 Node 二进制镜像,请设置 $NVM_NODEJS_ORG_MIRROR:

export NVM_NODEJS_ORG_MIRROR=https://nodejs.org/dist
nvm install node

NVM_NODEJS_ORG_MIRROR=https://nodejs.org/dist nvm install 4.2

要使用 io.js 二进制镜像,请设置 $NVM_IOJS_ORG_MIRROR:

export NVM_IOJS_ORG_MIRROR=https://iojs.org/dist
nvm install iojs-v1.0.3

NVM_IOJS_ORG_MIRROR=https://iojs.org/dist nvm install iojs-v1.0.3

某些平台和架构在默认主机上完全没有二进制文件;请参见「没有官方二进制的平台」。

默认情况下,nvm use 不会创建 current 符号链接。将 $NVM_SYMLINK_CURRENT 设置为 "true" 可启用此行为,这对 IDE 有时很有用。请注意,在启用此环境变量的情况下在多个 shell 标签页中使用 nvm 可能导致竞态条件。

向镜像传递 Authorization 头#

要将 Authorization 头传递给镜像 URL,请设置 $NVM_AUTH_HEADER:

NVM_AUTH_HEADER="Bearer secret-token" nvm install node

该头只会随镜像下 URL 的请求发送,绝不会发送到任何其他主机。如果 $NVM_NODEJS_ORG_MIRROR 和 $NVM_IOJS_ORG_MIRROR 中恰好只有一个设置,则只有该镜像会收到它;如果两者都设置,则两者都会收到;如果都没有设置,则默认镜像(https://nodejs.org/dist 和 https://iojs.org/dist)会收到。

nvm 偏好的 curl 7.58.0 及更高版本会在镜像重定向到另一主机时丢弃该头。当只有 wget 可用时,nvm 会让 GNU Wget 仅在重定向保持同源(scheme、host 和 port)时跟随它,否则失败,因为 wget 也会把该头发送到那里;请使用 curl 搭配会将下载移交给另一主机的镜像。其他 wget(如 BusyBox 的 wget)无法阻止跟随重定向,并会把头发送到镜像重定向到的任何地方。

nvm 通过配置文件将头提供给 curl 和 GNU Wget(对于 GNU Wget,是一个私有临时文件,其中还保存着你的 ~/.wgetrc 副本),而不是作为命令行参数,因为同一机器上的其他用户可能读取命令行参数。其他 wget(如 BusyBox 的 wget)不读取配置文件,因此在与其他用户共享的机器上,使用 $NVM_AUTH_HEADER 之前请先安装 curl。

$NVM_AUTH_HEADER 是向镜像进行身份验证的推荐方式。嵌入在镜像 URL 本身中的凭证(https://user:password@host/...)也可以使用,nvm 打印此类 URL 时会将凭证掩码为 ***@。

没有官方二进制的平台#

nodejs.org 并未为 nvm 能检测到的每个平台和架构发布二进制文件。在没有发布的情况下,nvm install 默认回退到从源码编译,这很慢且需要 C++ 工具链(参见「重要说明」);将 $NVM_NO_SOURCE_FALLBACK 设置为 1 可使缺失二进制文件变成错误。

unofficial-builds.nodejs.org(nodejs/unofficial-builds)为 Node.js 项目不正式支持的平台发布二进制文件。要使用它们,请将 $NVM_NODEJS_ORG_MIRROR 指向该地址:

export NVM_NODEJS_ORG_MIRROR=https://unofficial-builds.nodejs.org/download/release
平台nodejs.org 上的二进制文件unofficial-builds 上的二进制文件
freebsd、openbsd(任意架构)无无
sunos(Solaris、illumos)v13.x 及更早无
linux-x86(32 位)v9.x 及更早v8.16.0 至 v21.x
linux-armv6lv11.x 及更早v8.16.0 至 v22.x
linux-armv7lv23.x 及更早无
linux-x64-musl(Alpine)仅 v24.20.0+ 和 v26.8.0+v8.16.0 及更高
linux-arm64-musl(Alpine)无v20.20.1 及更高
linux-loong64无v18.18.0 及更高
linux-riscv64无v17.7.1 至 v26.0.0
win-x86(32 位)v22.x 及更早无

两个主机都不是无缝隙覆盖的,而且都会随时间变化;各自根目录下的 index.tab 是权威来源。如果两者都没有二进制文件,nvm install 会从源码编译,但在非 WSL 的 Windows 上 nvm 无法构建;在 FreeBSD 和 OpenBSD 上,它会跳过下载直接使用源码。Alpine 有自己的章节:在 Alpine Linux 上安装 nvm。

.nvmrc#

你可以在项目根目录(或任何父目录)创建一个 .nvmrc 文件,其中包含 Node 版本号(或 nvm 能理解的任何其他字符串;详情见 nvm --help)。 之后,如果命令行没有提供版本,nvm use、nvm install 和 nvm which 将使用 .nvmrc 文件中指定的版本;如果也没有找到 .nvmrc,它们会以状态 127 退出。(nvm exec 和 nvm run 遵循相同的 .nvmrc 查找,但目前如果两者都无法解析,会回退到活动 Node——请将该回退视为未定义行为;如果你需要可预测的脚本行为,请传入显式版本。)如果你想使用当前活动版本,请显式传入 current(例如 nvm which current)——current 不受 .nvmrc 影响。

例如,要让 nvm 默认使用最新的 5.9 版本、最新 LTS 版本,或当前目录的最新 Node 版本:

$ echo "5.9" > .nvmrc

$ echo "lts/*" > .nvmrc # to default to the latest LTS version

$ echo "node" > .nvmrc # to default to the latest version

[注意:这些示例假设 echo 是符合 POSIX 的 shell 版本。如果你使用 Windows cmd 开发环境,例如 .nvmrc 文件用于配置远程 Linux 部署,请记住引号会被复制进去,导致文件无效。请删除它们。]

然后当你运行 nvm use 时:

$ nvm use
Found '/path/to/project/.nvmrc' with version <5.9>
Now using node v5.9.1 (npm v3.7.3)

运行 nvm install 也会切换到正确的版本,但如果正确的 Node 版本尚未安装,它会为你安装。

$ nvm install
Found '/path/to/project/.nvmrc' with version <5.9>
Downloading and installing node v5.9.1...
Downloading https://nodejs.org/dist/v5.9.1/node-v5.9.1-linux-x64.tar.xz...
#################################################################################### 100.0%
Computing checksum with sha256sum
Checksums matched!
Now using node v5.9.1 (npm v3.7.3)

nvm use 等命令会从当前目录向上遍历目录结构,寻找 .nvmrc 文件。换句话说,在包含 .nvmrc 的目录的任何子目录中运行 nvm use 等命令,都会使用该 .nvmrc。

.nvmrc 文件的内容必须恰好包含一个 <version>(如 nvm --help 所述),后跟一个换行符。.nvmrc 文件也可以包含注释。注释分隔符是 #,它及其后的任何文本,以及空行和前后空白,在解析时都会被忽略。任何其他控制字符(制表符除外)都会使文件无效。

使用 = 的键/值对也允许并被忽略,但保留供未来使用,将来可能导致验证错误。

运行 npx nvmrc 来验证 .nvmrc 文件。如果该工具的结果与 nvm 不一致,则其中一方有 bug——请提交问题。

更深入的 shell 集成#

你可以使用 nvshim 来为 node、npm 和 npx 二进制文件加垫片,自动使用当前目录中的 nvm 配置。nvshim 不受 nvm 维护者支持。请向 nvshim 团队报告问题。

如果你更喜欢轻量级解决方案,以下配方由 nvm 用户贡献。它们不受 nvm 维护者支持。不过,我们接受更多示例的 pull request。

在包含 .nvmrc 文件的目录中自动调用 nvm use#

在你的配置文件(~/.bash_profile、~/.zshrc、~/.profile 或 ~/.bashrc)中,添加以下内容,以便每次进入新目录时自动调用 nvm use:

bash

将以下内容放在 $HOME/.bashrc 末尾:

cdnvm() {
    command cd "$@" || return $?
    nvm_path="$(nvm_find_up .nvmrc | command tr -d '\n')"

    # If there are no .nvmrc file, use the default nvm version
    if [[ ! $nvm_path = *[^[:space:]]* ]]; then

        declare default_version
        default_version="$(nvm version default)"

        # If there is no default version, set it to `node`
        # This will use the latest version on your machine
        if [ $default_version = 'N/A' ]; then
            nvm alias default node
            default_version=$(nvm version default)
        fi

        # If the current version is not the default version, set it to use the default version
        if [ "$(nvm current)" != "${default_version}" ]; then
            nvm use default
        fi
    elif [[ -s "${nvm_path}/.nvmrc" && -r "${nvm_path}/.nvmrc" ]]; then
        declare nvm_version
        # Let nvm parse `.nvmrc`, so that comments are ignored and the content of an invalid
        # or symlinked `.nvmrc` is not passed along to other nvm commands, which may print it
        nvm_version="$(nvm_process_nvmrc "${nvm_path}/.nvmrc")" || return

        declare locally_resolved_nvm_version
        # `nvm ls` will check all locally-available versions
        # If there are multiple matching versions, take the latest one
        # Remove the `->` and `*` characters and spaces
        # `locally_resolved_nvm_version` will be `N/A` if no local versions are found
        locally_resolved_nvm_version=$(nvm ls --no-colors "${nvm_version}" | command tail -1 | command tr -d '\->*' | command tr -d '[:space:]')

        # If it is not already installed, install it
        # `nvm install` will implicitly use the newly-installed version
        if [ "${locally_resolved_nvm_version}" = 'N/A' ]; then
            nvm install "${nvm_version}";
        elif [ "$(nvm current)" != "${locally_resolved_nvm_version}" ]; then
            nvm use "${nvm_version}";
        fi
    fi
}

alias cd='cdnvm'
cdnvm "$PWD" || exit

此别名会从当前目录向上搜索以检测 .nvmrc 文件。如果找到,它会切换到该版本;如果没有找到,它会使用默认版本。

zsh

此 shell 函数会在找到 .nvmrc 时安装(如需要)并 nvm use 指定的 Node 版本,否则执行 nvm use default。

将以下内容放入 $HOME/.zshrc,以便每当你进入包含 .nvmrc 文件(其中包含告诉 nvm 使用哪个 Node 的字符串)的目录时,自动调用 nvm use:

# place this after nvm initialization!
autoload -U add-zsh-hook

load-nvmrc() {
  local nvmrc_path
  nvmrc_path="$(nvm_find_nvmrc)"

  if [ -n "$nvmrc_path" ]; then
    local nvmrc_node_version
    nvmrc_node_version=$(nvm version "$(cat "${nvmrc_path}")")

    if [ "$nvmrc_node_version" = "N/A" ]; then
      nvm install
    elif [ "$nvmrc_node_version" != "$(nvm version)" ]; then
      nvm use
    fi
  elif [ -n "$(PWD=$OLDPWD nvm_find_nvmrc)" ] && [ "$(nvm version)" != "$(nvm version default)" ]; then
    echo "Reverting to nvm default version"
    nvm use default
  fi
}

add-zsh-hook chpwd load-nvmrc
load-nvmrc

保存文件后,运行 source ~/.zshrc 以重新加载配置并应用最新更改。

fish

这要求你已安装 bass。

# ~/.config/fish/functions/nvm.fish
function nvm
  bass source ~/.nvm/nvm.sh --no-use ';' nvm $argv
end

# ~/.config/fish/functions/nvm_find_nvmrc.fish
function nvm_find_nvmrc
  bass source ~/.nvm/nvm.sh --no-use ';' nvm_find_nvmrc
end

# ~/.config/fish/functions/load_nvm.fish
function load_nvm --on-variable="PWD"
  set -l default_node_version (nvm version default)
  set -l node_version (nvm version)
  set -l nvmrc_path (nvm_find_nvmrc)
  if test -n "$nvmrc_path"
    set -l nvmrc_node_version (nvm version (cat $nvmrc_path))
    if test "$nvmrc_node_version" = "N/A"
      nvm install (cat $nvmrc_path)
    else if test "$nvmrc_node_version" != "$node_version"
      nvm use $nvmrc_node_version
    end
  else if test "$node_version" != "$default_node_version"
    echo "Reverting to default Node version"
    nvm use default
  end
end

# ~/.config/fish/config.fish
# You must call it on initialization or listening to directory switching won't work
load_nvm > /dev/stderr

运行测试#

测试使用 Urchin 编写。像这样安装 Urchin(及其他依赖):

npm install

测试分为慢速测试和快速测试。慢速测试会执行诸如安装 Node 并检查是否使用正确版本的操作。快速测试会伪造这些操作,以测试别名和卸载等功能。在 nvm git 仓库的根目录下,像这样运行快速测试:

npm run test/fast

像这样运行慢速测试:

npm run test/slow

像这样运行所有测试:

npm test

npm run test/fast 会在干净环境(env -i ... bash -lc)中运行 make,因此 Node 必须在全新登录 bash shell 的 PATH 中。 如果 Node 在你当前 shell 中只能通过 nvm 使用,即使 npm install 成功,它也会失败并提示「Did you forget to run npm install after cloning the repo?」。 在这种情况下,请直接从 nvm git 仓库根目录运行 make,并选择测试套件和 shell:

make TEST_SUITE=fast test-zsh

注意:测试运行时避免同时运行 nvm。

环境变量#

nvm 暴露以下环境变量:

  • NVM_DIR - nvm 的安装目录。如果在 source nvm.sh 时未设置,bash、zsh 和 ksh93 会使用包含 nvm.sh 的目录;其他 shell(如 dash)无法判断被 source 的文件位于何处,因此它们使用默认安装位置(设置了 XDG_CONFIG_HOME 时为 $XDG_CONFIG_HOME/nvm,否则为 ~/.nvm)。如果 nvm 安装在别处,请在 source nvm.sh 之前设置 NVM_DIR。
  • NVM_BIN - 活动 Node 版本的 node、npm 和全局包的安装位置。
  • NVM_INC - Node 的 include 文件目录(对为 Node 构建 C/C++ 插件很有用)。
  • NVM_CD_FLAGS - 用于保持与 zsh 的兼容性。
  • NVM_RC_VERSION - 如果使用了 .nvmrc 文件,则为其中的版本。

此外,nvm 在切换版本时会修改 PATH,在存在 manpath 命令的地方还会修改 MANPATH,以及 NODE_PATH(如果存在)。

NVM_ONLY 可以设置为逗号分隔的版本类别列表,命令默认从中选择。

以下环境变量可用于配置 nvm install:

  • NVM_NO_SOURCE_FALLBACK - 为 1 时,二进制下载失败会中止,而不是静默回退到(慢得多的)源码编译;这是 -b 标志的持久化等价物,与 -s 互斥。
  • NVM_INSTALL_LOCK_TIMEOUT - 等待同一版本的并发安装完成后再放弃的秒数(默认 600)。超时时,nvm 会打印锁路径,以便删除被终止的安装留下的锁。
  • NVM_INSTALL_LOCK_STALE - 多少分钟后假定安装锁已被废弃并自动抢占;0(默认)永不抢占。

nvm install <version> 会获取按版本的咨询锁($NVM_DIR/.cache/locks 下的一个目录),因此两个 shell 同时安装同一版本不会破坏其版本目录;不同版本的安装从不互相阻塞。

Bash 补全#

要激活,你需要 source bash_completion:

[[ -r $NVM_DIR/bash_completion ]] && \. $NVM_DIR/bash_completion

将上述 source 行放在配置文件中 nvm 的 source 行正下方(.bashrc、.bash_profile)。

用法#

nvm:

$ nvm Tab

alias        deactivate   install           list-remote         reinstall-packages  uninstall   version
cache        exec         install-latest-npm  ls                 run                 unload      version-remote
current      help         list              ls-remote           unalias             use         which

nvm alias:

$ nvm alias Tab

default  iojs  lts/*  lts/argon  lts/boron  lts/carbon  lts/dubnium  lts/erbium  node  stable  unstable

$ nvm alias my_alias Tab

v10.22.0  v12.18.3  v14.8.0

nvm use:

$ nvm use Tab

my_alias  default  v10.22.0  v12.18.3  v14.8.0

nvm uninstall:

$ nvm uninstall Tab

my_alias  default  v10.22.0  v12.18.3  v14.8.0

兼容性问题#

如果你设置了一些非默认选项,nvm 会遇到一些问题。(参见 #606) 以下已知会导致问题:

在 ~/.npmrc 中:

prefix='some/path'

环境变量:

$NPM_CONFIG_PREFIX
$PREFIX

Shell 设置:

set -e

在 Alpine Linux 上安装 nvm#

为了提供最佳性能(以及其他优化),当你运行 nvm install X 时,nvm 会下载并安装 Node(及 npm)的预编译二进制文件。Node 项目编译、测试并托管/提供这些预编译二进制文件,它们为主流/传统 Linux 发行版(如 Debian、Ubuntu、CentOS、RedHat 等)构建。

Alpine Linux 不同于主流/传统 Linux 发行版,它基于 BusyBox,是一个非常紧凑(约 5MB)的 Linux 发行版。BusyBox(以及因此 Alpine Linux)使用与大多数主流/传统 Linux 发行版不同的 C/C++ 栈——musl。这使得为主流/传统发行版构建的二进制程序与 Alpine Linux 不兼容,因此在 x64 和 arm64 上 nvm 会请求 musl 构建。nodejs.org 只为某些较新的 x64 版本发布这些二进制文件,因此对于其他任何情况,下载都会 404,nvm install X 会回退到从源码编译,除非你将其指向拥有该二进制文件的镜像(参见「没有官方二进制的平台」)。

nvm install 有一个 -s 标志,要求 nvm 下载 Node 源码并在本地编译。

如果你仍然想在 Alpine Linux 上安装 nvm,应当可以通过在你的 Alpine Linux shell 中运行以下命令来实现,具体取决于你使用的版本:

Alpine Linux 3.13+#

apk add -U curl bash ca-certificates openssl ncurses coreutils python3 make gcc g++ libgcc linux-headers grep util-linux binutils findutils
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.41.0/install.sh | bash

Alpine Linux 3.5 - 3.12#

apk add -U curl bash ca-certificates openssl ncurses coreutils python2 make gcc g++ libgcc linux-headers grep util-linux binutils findutils
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.41.0/install.sh | bash

注意:Alpine 3.5 只能安装到 NodeJS v6.9.5,Alpine 3.6 只能安装到 v6.10.3,Alpine 3.7 安装到 v8.9.3,Alpine 3.8 安装到 v8.14.0,Alpine 3.9 安装到 v10.19.0,Alpine 3.10 安装到 v10.24.1,Alpine 3.11 安装到 v12.22.6,Alpine 3.12 安装到 v12.22.12,Alpine 3.13 和 3.14 安装到 v14.20.0,Alpine 3.15 和 3.16 安装到 v16.16.0(这些都是主分支上的版本)。Alpine 3.5 - 3.12 需要 python2 包来构建 NodeJS,因为它们是要构建的较旧版本。Alpine 3.13+ 需要 python3 才能成功构建较新的 NodeJS 版本,但如果你需要构建 Alpine 3.5 - 3.15 支持的 Node 版本,也可以在 Alpine 3.13+ 上使用 python2,只需在包安装脚本中指定需要安装的 NodeJS 版本。

Node 项目现在为某些较新版本发布了官方 linux-x64-musl 二进制文件(v24.20.0+ 和 v26.8.0+;没有 v25 版本拥有该文件)。没有官方 arm64 musl 二进制文件。

作为一个可能的替代方案,@mhart(一位 Node 贡献者)提供了一些 Alpine Linux 的 Docker 镜像,预装了 Node 以及可选的 npm。

卸载 / 移除#

手动卸载#

要手动移除 nvm,请执行以下操作:

首先,使用 nvm unload 从终端会话中移除 nvm 命令,并删除安装目录:

$ nvm_dir="${NVM_DIR:-~/.nvm}"
$ nvm unload
$ rm -rf "$nvm_dir"

编辑 ~/.bashrc(或其他 shell 资源配置)并删除以下行:

export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
[[ -r $NVM_DIR/bash_completion ]] && \. $NVM_DIR/bash_completion

用于开发环境的 Docker#

为了让开发和测试工作更容易,我们提供了一个用于开发的 Dockerfile。它基于 Ubuntu 基础镜像,并准备了用于 nvm 开发的基本且有用的工具。要构建环境镜像,请在 nvm 仓库根目录执行 Docker build:

$ docker build -t nvm-dev .

这会将你当前的 nvm 工作副本与我们预定义的开发环境一起打包到名为 nvm-dev 的 Docker 镜像中。构建完成后,你应该会看到它出现在镜像列表中:

$ docker images

REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
nvm-dev      latest    9ca4c57a97d8   7 days ago      650 MB

要启动并进入基于该镜像的容器:

$ docker run -h nvm-dev -it nvm-dev

nvm@nvm-dev:~/.nvm$

构建镜像需要几分钟,镜像大小约为 650MB,因此不适合生产使用。

有关 Docker 的更多信息和文档,请参阅其官方网站和文档。

常见问题#

如果你尝试安装某个 Node 版本而安装失败,请务必运行 nvm cache clear 删除缓存的 Node 下载,否则可能会得到如下错误:

curl: (33) HTTP server doesn't seem to support byte ranges. Cannot resume.

我的 sudo node 在哪里?请查看 #43。

在 Node 发布 v0.8.6 之后,nvm 尝试从二进制包安装。但在某些系统上,由于共享库不兼容,官方二进制包无法工作。在这种情况下,使用 -s 选项强制从源码安装:

nvm install -s 0.8.6

如果设置默认别名后,新 shell 中没有建立 Node 版本(即 nvm current 输出 system),请确保系统的 Node 在 shell 配置文件中的 nvm.sh source 行之前设置好 PATH(参见 #658)。

macOS 故障排查#

vim shell 中找不到 nvm 的 Node 版本#

如果你将 Node 版本设置为系统 Node 版本以外的版本(nvm use 6.2.1),打开 vim 并运行 :!node -v,如果看到的是系统版本 v0.12.7 而不是 v6.2.1,你需要运行:

sudo chmod ugo-x /usr/libexec/path_helper

关于此问题的更多信息见 dotphiles/dotzsh。

nvm 与 npm 配置项 "prefix" 不兼容#

此问题的一些解决方案可以在这里找到。

还有一个导致此问题的边缘情况,即 $HOME 路径与用户主目录的实际名称不匹配。

你必须确保 $HOME 中的用户目录名与运行 ls /Users/ 时看到的用户目录名大小写一致(参见此问题)。

要更改用户目录和/或账户名,请按照这里的说明操作。

Homebrew 使 zsh 目录不安全#

zsh compinit: insecure directories, run compaudit for list.
Ignore insecure directories and continue [y] or abort compinit [n]? y

Homebrew 会导致 /usr/local/share/zsh/site-functions 和 /usr/local/share/zsh 等目录不安全。这不是 nvm 的问题——而是 Homebrew 的问题。请参阅此处了解与该问题相关的一些解决方案。

搭载 Apple Silicon 芯片的 Mac#

Node.js v15.3 增加了对 Apple Silicon 芯片架构的实验性支持,v16.0 增加了完整支持。 因此,如果你像往常一样尝试安装较旧版本的 Node,很可能会在安装 Node 时遇到编译错误,或在运行代码时遇到内存不足错误。

因此,如果你想在 Apple Silicon Mac 上运行 v16.0 之前的版本,最好针对 x86_64 Intel 架构编译 Node,以便 Rosetta 2 可以将 x86_64 处理器指令转换为基于 ARM 的 Apple Silicon 指令。 以下是你需要做的:

  • 如果尚未安装 Rosetta,请安装它
$ softwareupdate --install-rosetta

你可能会问:「我的 Apple Silicon Mac 如何知道要为 Intel 芯片编译的 Node 版本使用 Rosetta?」 如果一个可执行文件只包含 Intel 指令,macOS 会自动使用 Rosetta 来转换指令。

  • 打开一个通过 Rosetta 运行的 shell
$ arch -x86_64 zsh

注意:也可以通过以下方式实现:在 Finder 中找到 Terminal 或 iTerm 应用,右键单击,选择「Get Info」,然后勾选「Open using Rosetta」复选框。

注意:此终端会话现在运行在 zsh 中。 如果 zsh 不是你通常使用的 shell,nvm 可能不会像你常用 shell 那样通过 dotfiles 自动被 source。 如果是这种情况,请确保 source nvm。

$ source "${NVM_DIR}/nvm.sh"
  • 安装你感兴趣的任意旧版本 Node。以 12.22.1 为例。

这会获取 Node 源码并编译,需要几分钟。

$ nvm install v12.22.1 --shared-zlib

注意:你可能好奇为什么包含 --shared-zlib。 Apple 系统 clang 编译器的最新版本中有一个 bug。 如果你的系统安装了这些有问题的版本之一,即使不包含 --shared-zlib 标志,上述步骤也可能仍然成功。 然而,之后当你尝试使用旧版本 node.js 执行 npm install 时,会看到「incorrect data check」错误。 如果你想避免处理这个可能的麻烦,请包含该标志。 更多细节请参见此问题和此评论。

  • 退出回到原生 shell。
$ exit
$ arch
arm64

注意:如果你在第二步中选择的是「Open using Rosetta」复选框,而不是运行 CLI 命令,这里会看到 i386。 除非你有其他理由保持该复选框选中,现在可以取消选中。

  • 检查架构是否正确。x64 是 x86_64 的缩写,这是你希望看到的。
$ node -p process.arch
x64

现在你应该能够像平常一样使用 Node 了。

WSL 故障排查#

如果你在 WSL-2 上遇到此错误:

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.41.0/install.sh | bash
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:--  0:00:09 --:--:--     0curl: (6) Could not resolve host: raw.githubusercontent.com

可能是你的杀毒软件、VPN 或其他原因导致的。

如果你可以 ping 通 8.8.8.8,但无法 ping 通 google.com:

这可以通过在你的根目录下运行以下命令来解决:

sudo rm /etc/resolv.conf
sudo bash -c 'echo "nameserver 8.8.8.8" > /etc/resolv.conf'
sudo bash -c 'echo "[network]" > /etc/wsl.conf'
sudo bash -c 'echo "generateResolvConf = false" >> /etc/wsl.conf'
sudo chattr +i /etc/resolv.conf

这会删除运行 WSL 时自动生成的 resolv.conf 文件,创建一个新文件并写入 nameserver 8.8.8.8,然后创建 wsl.conf 文件并添加 [network] 和 generateResolveConf = false,以防止该文件被自动生成。

你可以通过运行以下命令检查文件内容:

cat /etc/resolv.conf

维护者#

目前唯一的维护者是 @ljharb——非常欢迎更多维护者,我们希望随着时间推移向团队添加人员。治理方式将随项目发展重新评估。

项目支持#

仅支持最新版本(目前为 v0.41.0)。

企业支持#

如果你无法更新到最新版本的 nvm,我们的合作伙伴为所有不受支持的版本提供商业安全修复:

  • HeroDevs Never-Ending Support

许可证#

参见 LICENSE.md。

版权声明#

Copyright OpenJS Foundation and nvm contributors. All rights reserved. The OpenJS Foundation has registered trademarks and uses trademarks. For a list of trademarks of the OpenJS Foundation, please see our Trademark Policy and Trademark List. Trademarks and logos not indicated on the list of OpenJS Foundation trademarks are trademarks™ or registered® trademarks of their respective holders. Use of them does not imply any affiliation with or endorsement by them. The OpenJS Foundation | Terms of Use | Privacy Policy | Bylaws | Code of Conduct | Trademark Policy | Trademark List | Cookie Policy