Skip to content

使用 nvm 管理多版本 Node 项目依赖

nvm 是 Node.js 的版本管理器 (version manager),可在同一台主机上安裝多个版本的 Node.js 环境,因为不同项目可能使用不同的 Node.js 版本,那就需要通过一个版本管理器来切换不同的 Node.js 版本 🔗 资料来源

安装/升级 NVM

脚本安装

可用 cURLwget 指令使用安裝脚本安裝或更新 nvm(更新的时候重新运行下脚本即可):

最新的脚本查看

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

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

此安装脚本会把 nvm repo clone 到 ~/.nvm ,并将 source line 新增至你的 profile 设定 ( ~/.bash_profile~/.zshrc~/.profile~/.bashrc )

国内安装

国内使用 gitee 上托管的工具, 避免国外访问速度不佳

shell
# 安装
$ bash -c "$(curl -fsSL https://gitee.com/RubyMetric/nvm-cn/raw/main/install.sh)"

# 卸载
$ bash -c "$(curl -fsSL https://gitee.com/RubyMetric/nvm-cn/raw/main/uninstall.sh)"

这里注意 liexiang 用户需要在 sudoers 清单中( ), 运行结果如下

=> Git clone nvm
fatal: destination path '/home/liexiang/.nvm' already exists and is not an empty directory.
HEAD is now at c92adb3 v0.39.5
=> 添加nvm环境变量(Bash,Zsh)
=> 使用淘宝镜像
=> 安装 nvm-update,升级更新请使用该命令
[sudo] password for liexiang:
=> 安装完成!
=> 最后请您重启终端

brew 安装

可以使用 brew 安装 nvm

brew install nvm

安装完毕之后检查是否存在如下 source line, 没有可以手动添加到 .zshrc

// source line
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

如果在 Linux 执行安装脚本后,执行下面指令会显示以下信息或没有任何信息时候,建议重新打开终端 (terminal) 再重新执行一次 nvm 指令:

$ command -v nvm
nvm: command not found

如果还是无法使用 nvm,可执行下面指令立即应用 ZSH 的设定:

shell
source .zshrc

注意:

  • 使用 nvm 時,不需要 sudo 即可使用 npm -g 全局命令, 使用 sudo 会导致不可预料的权限错误
  • 若你有 ~/.npmrc ,请确保里面不包含任何 prefix 的设定 (因为和 nvm 不相容)
  • 你可以 (但不应该) 保留以前在 系统 安裝的 Node.js,但 nvm 只对你的当前账号可用。可能会导致版本不 match,因为其他使用者会使用 /usr/local/lib/node_modules/* ,而当前账户会使用 ~/.nvm/versions/node/vX.X.X/lib/node_modules/*

命令

--version :确认 NVM 是否安裝成功

$ nvm --version
0.34.0

install :利用 NVM 安装 Node.js

安裝 NVM 后,其实还没安装 Node 环境:

$ node
zsh: command not found: node

如果执行下面指令,会提醒你需要执行 install 指令才能安裝 Node.js:

$ nvm use node
N/A: version "node -> N/A" is not yet installed.
You need to run "nvm install node" to install it before using it.

安裝最新版的 Node.js:

$ nvm install node
Downloading and installing node v12.8.1...
Downloading https://nodejs.org/dist/v12.8.1/node-v12.8.1-linux-x64.tar.xz...
#################################################################################################### 100.0%
Computing checksum with sha256sum
Checksums matched!
Now using node v12.8.1 (npm v6.10.2)
Creating default alias: default -> node (-> v12.8.1)

如果要指定安裝版本,可以直接指定版本號:

$ nvm install 18

安裝的第一個版本的 Node.js 会成为 nvm 的默认版本,新的 shell 就会以默认版本的 Node.js 來使用 (例如: nvm alias default )。查看目前安裝 Node.js 的版本:

$ node -v
v18.0.1

ls-remote :察看可用的安装版本

可以看目前有哪些可用版本可安装,在版本號前面的 -> 箭頭符號代表目前 nvm 正在使用的 Node.js 版本:

$ nvm ls-remote
...
       v10.16.1   (LTS: Dubnium)
       v10.16.2   (LTS: Dubnium)
       v10.16.3   (Latest LTS: Dubnium)
...
        v12.7.0
        v12.8.0
->      v12.8.1

不過剛剛的 ls-remote 指令會把所有可用的版本都列出來,但通常會選擇安装 LTS (Long-term support,長期支援) 版,所以只要加上 -lts 參數就可以指列出可用的 LTS 版:

$ nvm ls-remote --lts
...
       v10.16.1   (LTS: Dubnium)
       v10.16.2   (LTS: Dubnium)
       v10.16.3   (Latest LTS: Dubnium)

如果版本號的文字有特殊顏色 (不是白色字),則代表該版本的 Node.js 有透過 nvm 安装過,例如:我的電腦就安装了

v10.16.3

v12.8.1

ls :查看目前安装了哪些版本

ls 指令可以查看目前安装了哪些版本:

$ nvm ls
       v10.16.3
->      v12.8.1
default -> node (-> v12.8.1)
node -> stable (-> v12.8.1) (default)
stable -> 12.8 (-> v12.8.1) (default)
iojs -> N/A (default)
unstable -> N/A (default)
lts/* -> lts/dubnium (-> N/A)
lts/argon -> v4.9.1 (-> N/A)
lts/boron -> v6.17.1 (-> N/A)
lts/carbon -> v8.16.1 (-> N/A)
lts/dubnium -> v10.16.3

use :切换 Node.js 版本

如果要使用 nvm 切换正在使用的 Node.js 版本,可用 use 指令:

$ nvm use v10.6.3
Now using node v10.16.3 (npm v6.9.0)

如果切换的目标版本還沒安装,nvm 會提醒你要安装:

$ nvm use lts/carbon
N/A: version "lts/carbon -> N/A" is not yet installed.
You need to run "nvm install lts/carbon" to install it before using it.

透過 nvm 安装 Node.js 時,nvm 會將不同的 Node.js 版本儲存在 ~/.nvm/versions/node/vX.X.X ,然後再修改 $PATH ,將指定版本的 Node.js 路徑加入:在 nvm 的各個 Node.js 版本安装的全域套件都會在各自版本的目錄內安装,所以在切换至新安装的 Node.js 版本後需要重新安装,也因為如此,不同版本間的套件就不會有衝突問題。

current :察看目前使用版本

如果忘記自己切换到哪個版本,可以用 current 指令:

$ nvm current
v10.6.3

run :直接执行 Node.js

如果要直接执行Node.js,可以使用下面指令:

$ nvm run node
Running node v12.8.1 (npm v6.10.2)
Welcome to Node.js v12.8.1.
Type ".help" for more information.
>

exec :指定要执行的 Node.js 版本

$ nvm exec 12.8.1 node
Running node v12.8.1 (npm v6.10.2)
Welcome to Node.js v12.8.1.
Type ".help" for more information.
>

which :察看 Node.js 的安装路徑

执行下面指令可以查看特定版本的 Node.js 的安装路徑:

$ nvm which 12.8.1
/home/titan/.nvm/versions/node/v12.8.1/bin/node

alias : 察看別名、设定別名

如下圖有些版本的文字是紅色或是顯示 N/A ,就代表該版本未在電腦安装:

預設 alias 可以取代版本號:

  • node :安装最新版的 Node.js
  • iojs :安装最新版的 io.js
  • stable :此 alias 已弃用,僅適用於 v0.12 以及更舊版,目前改為 node alias
  • unstable :此 alias 為 v0.11,最後一個 “unstable” (不穩定) Node release,在 v1.0 之後的版本都是穩定版 (in SemVer, versions communicate breakage, not stability)

可在下面這些指令使用以上預設別名:

  • nvm install
  • nvm use
  • nvm run
  • nvm exec
  • nvm which
  • … 等

察看別名

$ nvm ls
->     v16.20.2
       v18.18.0
default -> 16 (-> v16.20.2)
iojs -> N/A (default)
unstable -> N/A (default)
node -> stable (-> v18.18.0) (default)
stable -> 18.18 (-> v18.18.0) (default)
lts/* -> lts/hydrogen (-> v18.18.0)
lts/argon -> v4.9.1 (-> N/A)
lts/boron -> v6.17.1 (-> N/A)
lts/carbon -> v8.17.0 (-> N/A)
lts/dubnium -> v10.24.1 (-> N/A)
lts/erbium -> v12.22.12 (-> N/A)
lts/fermium -> v14.21.3 (-> N/A)
lts/gallium -> v16.20.2
lts/hydrogen -> v18.18.0

设定別名

$ nvm alias titan-test v10.15.3                                                  * ?
titan-test -> v10.15.3

接著用 nvm alias 指令就會看到刚刚新增的別名所对应的 Node.js 版本:SHELL

$ nvm alias                                                                    * ?
titan-test -> v10.15.3
default -> v10.16.3
node -> stable (-> v12.8.1) (default)
stable -> 12.8 (-> v12.8.1) (default)
iojs -> N/A (default)
unstable -> N/A (default)
lts/* -> lts/erbium (-> N/A)
lts/argon -> v4.9.1 (-> N/A)
lts/boron -> v6.17.1 (-> N/A)
lts/carbon -> v8.16.2 (-> N/A)
lts/dubnium -> v10.17.0 (-> N/A)
lts/erbium -> v12.13.0 (-> N/A)

FAQ

卸载 Nvm

基本上,需要反向执行 install.sh 中的步骤-从 ~/.bash_profile (和/或 ~/.profile ) 中删除所有 nvm 注册,然后重新打shell 如果是 nvm 失效, 只需从 .bash_profile.profile 中删除NVM命令就足够, 如果你有其他的 node 执行环境, 则也需要删除, 则需要执行如下命令

$ rm -rf ~/.nvm

更新记录