NVM

nvm 英文全程也叫 node.js version management,是一个nodejs的版本管理工具。nvm 和 npm 都是 node.js 版本管理工具,但是为了解决node各种不同之间版本存在不兼容的问题,因此可以通过nvm安装和切换不同版本的node。

Github:https://github.com/nvm-sh/nvm

简介

nvm 允许你通过命令行快速安装和使用不同版本的 Node.js。

示例:

$ nvm use 16
Now using node v16.9.1 (npm v7.21.1)
$ node -v
v16.9.1
$ nvm use 14
Now using node v14.18.0 (npm v6.14.15)
$ node -v
v14.18.0
$ nvm install 12
Now using node v12.22.6 (npm v6.14.5)
$ node -v
v12.22.6

就这么简单!

关于

nvm 是一个针对 node.js 的版本管理器,设计为按用户安装,并按 shell 调用。nvm 适用于任何符合 POSIX 标准的 shell(sh、dash、ksh、zsh、bash),特别是在这些平台上:UnixmacOSWindows WSL

安装与更新

安装与更新脚本

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

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

运行上述任一命令都会下载一个脚本并执行。该脚本会将 nvm 仓库克隆到 ~/.nvm 目录,并尝试将以下代码片段中的源行添加到正确的配置文件(~/.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_SOURCENVM_DIRPROFILENODE_VERSION 变量来自定义安装源、目录、配置文件和版本。例如:curl ... | NVM_DIR="path/to/nvm"。请确保 NVM_DIR 路径末尾不包含斜杠。

安装程序可以使用 gitcurlwget 中的任意一种工具来下载 nvm,具体取决于系统中可用的工具。

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

在 Docker 中安装

在非交互式 shell 中调用 bash 时,例如在 Docker 容器中,常规的配置文件都不会被加载。为了像平常一样使用 nvmnodenpm,你可以改为指定特殊的 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/user/.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.40.3/install.sh | PROFILE="${BASH_ENV}" bash
RUN echo node > .nvmrc
RUN nvm install
在 Docker 中安装 CICD-Jobs

更稳健,适用于 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.40.3/install.sh | bash

# set env
ENV NVM_DIR=/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.40.3

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 命令创建一个,然后再次运行安装脚本。

  • 如果您使用的是之前的默认 shell bash,您的系统可能没有设置命令的.bash_profile.bashrc 文件。请使用 touch ~/.bash_profiletouch ~/.bashrc 创建其中一个文件,然后再次运行安装脚本。接着,运行. ~/.bash_profile. ~/.bashrc 以启用 nvm 命令。

  • 你之前使用的是 bash,但你已经安装了 zsh。你需要手动将这些行添加到 ~/.zshrc并运行 . ~/.zshrc

  • 你可能需要重启终端实例或运行 . ~/.nvm/nvm.sh。重启终端/打开新标签页/窗口,或执行 source 命令将加载该命令及新配置。

  • 如果以上方法无效,您可能需要重启终端实例。请尝试在终端中打开新的标签页/窗口,然后重试。

如果以上方法无法解决问题,您可以尝试以下操作:

  • 如果你使用 bash,可能是你的.bash_profile(或~/.profile)没有正确加载你的~/.bashrc。你可以通过在其中添加 source ~/<你的配置文件> 来解决这个问题,或者按照下面的下一步操作。

  • 尝试将安装部分中的代码片段添加到您常用的配置文件(如 ~/.bash_profile~/.zshrc~/.profile~/.bashrc)中,该片段用于查找正确的 nvm 目录并加载 nvm。

有关此问题的更多信息及可能的解决方法,请参考此处

对于搭载 Apple Silicon 芯片的 Mac,Node 从 v16.0.0 开始提供 arm64 架构的 Darwin 安装包,并从 v14.17.0 版本起在源码编译时提供实验性 arm64 支持。如果您在使用 nvm 安装 Node 时遇到问题,建议升级到这些版本或更高版本。

Ansible

您可以使用一个任务:

验证安装

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

command -v nvm

如果安装成功,该命令应输出 nvm。请注意,which nvm命令不会生效,因为 nvm 是一个通过 source 加载的 shell 函数,而非可执行的二进制文件。

注意:在 Linux 系统上,运行安装脚本后,如果出现 “nvm: command not found” 的提示,或者在输入 “command -v nvm” 后终端没有显示任何反馈,只需关闭当前终端,打开一个新的终端,然后再次尝试验证即可。

重要提示

如果你正在运行一个没有预打包二进制文件的系统,这意味着你需要从源代码安装 Node.js 或 io.js,那么你需要确保你的系统装有 C++ 编译器。对于 OS X 系统,Xcode 可以胜任;对于基于 Debian/Ubuntu 的 GNU/Linux 系统,则需要安装 build-essential 和 libssl-dev 软件包。

注意:nvm 在某些情况下也支持 Windows。根据 WSL(Windows Subsystem for Linux)的版本,它应该可以通过 WSL 运行。它也应该与 GitBash(MSYS)或 Cygwin 兼容。除此之外,对于 Windows 系统,存在一些替代方案,这些方案既不为我们所支持,也非由我们开发:

注意: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 shell 的 nvm 包装器,延迟加载 nvm 直到实际使用时才进行源化处理。

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

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

注意:在 OS X 系统上,如果您没有安装 Xcode 且不希望下载约 4.3GB 的文件,可以安装命令行工具。您可以参考这篇博客文章了解具体操作方法:

如何在 OS X Mavericks 和 Yosemite 中安装命令行工具(无需 Xcode)

注意:在 OS X 系统上,如果你已安装或曾安装过 “系统” 版本的 Node,并希望全局安装模块,请记住以下几点:

  • 使用 nvm 时,你无需使用 sudo 来全局安装 npm 模块,因此不要执行 sudo npm install -g grunt,而应执行 npm install -g grunt

  • 如果你有 ~/.npmrc 文件,请确保其中不包含任何 prefix 设置(这与 nvm 不兼容)。

  • 你可以(但不应该?)保留之前安装的 “系统” 节点,但 nvm 将仅对你的用户账户(即安装 nvm 时使用的账户)可用。这可能会导致版本不匹配,因为其他用户将使用/usr/local/lib/node_modules/*,而你的用户账户将使用~/.nvm/versions/node/vX.X.X/lib/node_modules/*

不支持通过 Homebrew 进行安装。如果您在使用通过 Homebrew 安装的 nvm 时遇到问题,请在提交问题报告前,先使用 brew 卸载它,然后按照以下说明重新安装。

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

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

Git Install

如果你已安装 git(需要 git v1.7.10 或更高版本):

  • 将此仓库克隆到您用户配置文件的根目录中
    • 从任何位置执行 cd ~/,然后运行 git clone https://github.com/nvm-sh/nvm.git .nvm
  • cd ~/.nvm 并使用 git checkout v0.40.3 检出最新版本
  • 通过从你的 shell 中源文件来激活 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

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

nvm use node

或者你也可以直接运行它:

nvm run node --version

或者,您可以在子 shell 中运行任意命令,并指定所需的 Node 版本:

nvm exec 4.2 node --version

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

nvm which 12.22

与使用”14.7”、”16.3”或”12.22.1”这类版本号不同,在使用 nvm installnvm usenvm runnvm execnvm which 等命令时,您可以使用以下特殊默认别名:

  • node:这将安装最新版本的 node
  • iojs:这将安装最新版本的io.js
  • stable: 此别名已弃用,仅真正适用于 Node.js v0.12 及更早版本。目前,它是 node 的别名。
  • unstable: 此别名指向 Node.js v0.11 版本——这是最后一个 “不稳定” 的 Node 发布版,因为自 1.0 版本之后,所有 Node 版本均为稳定版。(在语义化版本控制中,版本号传达的是破坏性变更,而非稳定性信息)。

Long-term Support

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.js 并迁移已安装的包,请使用

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

Migrating Global Packages While Installing

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

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

首先,它会使用 “nvm version node” 来识别你当前正在迁移包的版本。接着,它会从远程服务器解析并安装新版本。最后,运行 “nvm reinstall-packages” 命令,将之前 Node 版本中的 npm 包重新安装到新版本中。

您也可以像这样安装和迁移特定 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 不支持 Node.js” 的错误信息,你需要(1)回退到之前的 Node 版本(使用 nvm ls 查看并 nvm use <你最近可用的版本>),(2)删除新创建的 Node 版本(使用 nvm uninstall <你列表中损坏的版本>),然后(3)重新运行 nvm 安装命令,并加上 --latest-npm 标志。

Default Global Packages From File While Installing

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

# $NVM_DIR/default-packages

rimraf
object-inspect@1.0.2
stevemao/left-pad

io.js

如果你想安装 io.js:

nvm install iojs

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

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

迁移 npm 包到 node 的相同指南同样适用于 io.js。

System Version of Node

如果你想使用系统自带的 node 版本,可以使用特殊的默认别名”system”:

nvm use system
nvm run system --version

Listing Versions

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

nvm ls

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

nvm ls-remote

设置自定义颜色

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

颜色代码:

  • r/R = red / bold red
  • g/G = green / bold green
  • b/B = blue / bold blue
  • c/C = cyan / bold cyan
  • m/M = magenta / bold magenta
  • y/Y = yellow / bold yellow
  • k/K = black / bold black
  • e/W = light grey / white
nvm set-colors rgBcm

持久化自定义颜色

如果你希望自定义颜色在终端会话结束后依然保留,请将 NVM_COLORS 变量导出到你的 shell 配置文件中。例如,若想使用青色、洋红色、绿色、粗体红色和粗体黄色,请添加以下行:

export NVM_COLORS='cmgRY'

抑制彩色输出

nvm help(或 -h 或 --help)nvm lsnvm ls-remotenvm 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_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 header 到镜像

要将 Authorization 头部传递到镜像 URL,请设置 $NVM_AUTH_HEADER

NVM_AUTH_HEADER="Bearer secret-token" nvm install node
.nvmrc

你可以在项目根目录(或任何父目录)中创建一个包含 Node 版本号(或 nvm 可识别的任何其他字符串;详见 nvm --help)的 .nvmrc 文件。之后,当命令行未指定版本时,nvm usenvm installnvm execnvm runnvm which 命令将自动使用 .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

[注意:这些示例假设使用的是符合 POSIX 标准的 shell 版本 echo。如果您使用 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 文件的内容必须严格包含一个 <版本号>(如 nvm –help 中所述),后跟一个换行符。.nvmrc 文件也可以包含注释。注释分隔符为 #,解析时将忽略该符号及其后的所有文本,以及空行、前导和尾随空白字符。

使用等号(=)的键值对同样被允许且会被忽略,但这是为将来使用保留的,未来可能会引发验证错误。

运行 npx nvmrc 来验证 .nvmrc 文件。如果该工具的结果与 nvm 不一致,说明其中一方存在错误——请提交问题报告。

Deeper Shell Integration

您可以使用nvshim来封装 node、npm 和 npx 二进制文件,使其自动使用工作目录中的 nvm 配置。nvshim 不受 nvm 维护者支持。如有问题,请向 nvshim 团队报告。

如果您倾向于更轻量级的解决方案,以下是由 nvm 用户贡献的配置方案。请注意,这些方案不受 nvm 维护者的官方支持。不过,我们正在接受更多示例的拉取请求。

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

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
        nvm_version=$(<"${nvm_path}"/.nvmrc)

        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 文件时安装(如果需要)并使用指定版本的 Node,否则将使用默认的 nvm 版本。

将以下内容添加到你的 $HOME/.zshrc 文件中,以便在进入包含 .nvmrc 文件的目录时自动调用 nvm use,该文件中的字符串会告诉 nvm 使用哪个版本的 Node:

# 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

注意:在测试运行期间,请避免使用 nvm。

环境变量

nvm 暴露了以下环境变量:

  • NVM_DIR - nvm 的安装目录。
  • NVM_BIN - 当前活动版本 Node.js 的 node、npm 以及全局包安装目录。
  • NVM_INC - Node 的包含文件目录(用于构建 Node 的 C/C++ 插件)。
  • NVM_CD_FLAGS - 用于保持与 zsh 的兼容性。
  • NVM_RC_VERSION - 如果正在使用.nvmrc 文件,则显示其中的版本号。

此外,nvm 在切换版本时会修改 PATH 变量,如果存在 MANPATH 和 NODE_PATH 变量,也会一并修改。

Bash 自动补全

要激活,你需要获取 bash_completion 的源文件:

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

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

Usage

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 不兼容,因此我们不能简单地在 Alpine Linux 上使用 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.40.3/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.40.3/install.sh | bash
Note: Alpine 3.5 can only install NodeJS versions up to v6.9.5, Alpine 3.6 can only install versions up to v6.10.3, Alpine 3.7 installs versions up to v8.9.3, Alpine 3.8 installs versions up to v8.14.0, Alpine 3.9 installs versions up to v10.19.0, Alpine 3.10 installs versions up to v10.24.1, Alpine 3.11 installs versions up to v12.22.6, Alpine 3.12 installs versions up to v12.22.12, Alpine 3.13 & 3.14 install versions up to v14.20.0, Alpine 3.15 & 3.16 install versions up to v16.16.0 (These are all versions on the main branch). Alpine 3.5 - 3.12 required the package python2 to build NodeJS, as they are older versions to build. Alpine 3.13+ requires python3 to successfully build newer NodeJS versions, but you can use python2 with Alpine 3.13+ if you need to build versions of node supported in Alpine 3.5 - 3.15, you just need to specify what version of NodeJS you need to install in the package install script.

Node 项目虽有提供 Alpine 兼容二进制文件的意愿,但由于构建、测试和支持方面的开销,目前尚无具体计划。

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

卸载 / 移除

手动移除

要手动移除 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 开发环境配置

为了简化开发和测试工作,我们准备了一个基于 Ubuntu 18.04 基础镜像的 Dockerfile,专为开发使用而设计,其中包含了 nvm 开发所需的基本和实用工具。要构建该环境的 Docker 镜像,请在 nvm 仓库的根目录下运行以下 docker 命令:

$ docker build -t nvm-dev .

这将把您当前的 nvm 仓库与我们预定义的开发环境打包成一个名为 nvm-dev 的 Docker 镜像,构建成功后,请通过 docker images 命令验证您的镜像:

$ 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$

请注意,构建镜像大约需要 8 分钟,镜像大小约为 650MB,因此不适用于生产环境。

有关 Docker 的更多信息和文档,请访问其官方网站:

https://www.docker.com/
https://docs.docker.com/

问题

如果你尝试安装某个 Node 版本但安装失败,请务必运行 nvm cache clear 命令来清除缓存的 Node 下载文件,否则可能会遇到如下错误:

  • curl: (33) HTTP 服务器似乎不支持字节范围。无法恢复下载。

我的 sudo 节点在哪?查看 #43

在 node v0.8.6 版本发布后,nvm 尝试从二进制包进行安装。但在某些系统中,由于共享库的不兼容性,官方的二进制包无法正常工作。在这种情况下,可以使用-s 选项强制从源代码安装:

nvm install -s 0.8.6

如果设置默认别名后在新 shell 中未正确建立 node 版本(即 nvm current 显示 system ),请确保在 shell 配置文件中,系统 node 的 PATH 设置位于 nvm.sh 源引入行之前(参见 #658)。

macOS 故障排除

nvm 节点版本在 vim shell 中未找到

如果你将节点版本设置为与系统节点版本不同的版本,例如使用 nvm use 6.2.1,然后打开 vim 并运行 :! node -v,你应该看到 v6.2.1。如果你看到的是系统版本 v0.12.7,那么你需要运行:

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 电脑

对 Apple Silicon 芯片架构的实验性支持已在 Node.js v15.3 版本中添加,而完整支持则是在 v16.0 版本中实现的。因此,如果您尝试像往常一样安装旧版本的 Node.js,很可能会在安装过程中遇到编译错误,或者在运行代码时出现内存不足的错误。

因此,如果你想在 Apple Silicon Mac 上运行早于 v16.0 的版本,最好将 node 编译为针对 x86_64 Intel 架构,这样 Rosetta 2 就能将 x86_64 处理器指令转换为基于 ARM 的 Apple Silicon 指令。以下是需要执行的步骤:

安装 Rosetta,如果您尚未安装的话。

$ softwareupdate --install-rosetta

你可能会好奇:“我的 Apple Silicon Mac 如何知道要为英特尔芯片编译的 Node 版本使用 Rosetta?” 如果可执行文件仅包含英特尔指令,macOS 会自动使用 Rosetta 来翻译这些指令。

打开一个使用 Rosetta 运行的 shell

$ arch -x86_64 zsh

注意:同样可以通过在 Finder 中找到终端或 iTerm 应用,右键点击,选择 “显示简介”,然后勾选标有 “使用 Rosetta 打开” 的复选框来实现此操作。

注意:此终端会话当前正在运行 zsh。如果 zsh 不是您通常使用的 shell,nvm 可能不会像通过您的配置文件在常用 shell 中那样自动加载。如果是这种情况,请确保手动加载 nvm。

$ source "${NVM_DIR}/nvm.sh"

安装你感兴趣的任何旧版本 Node。以 12.22.1 版本为例,这将获取 Node 源代码并进行编译,整个过程需要几分钟时间。

$ nvm install v12.22.1 --shared-zlib

注意:您可能好奇为什么包含了 –shared-zlib。 苹果系统 clang 编译器的最新版本中存在一个 bug。 如果您的系统上安装了这些损坏的版本,即使您没有包含 –shared-zlib 标志,上述步骤很可能仍会成功。 然而,稍后当你尝试使用旧版本的 node.js 进行 npm 安装时,你会看到数据校验错误的提示。 如果你想避免处理此事可能带来的麻烦,请包含该标志。 更多详情,请参阅此问题和此评论

退出并返回您的原生 shell。

$ exit
$ arch
arm64

注意:如果您在第二步中选择了标有 “使用 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.40.3/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
作者:Ddd4j  创建时间:2023-11-02 18:13
最后编辑:Ddd4j  更新时间:2026-01-10 12:22