BACK
Featured image of post nvm - Nodejs 版本隨你切換

nvm - Nodejs 版本隨你切換

Node Version Manager - Node.js 版本管理的工具,可在同一台主機上安裝多個版本的 Node.js 環境,因為不同專案可能會使用不同的 Node.js 版本,那就需要透過一個版本管理器來切換不同的 Node.js 版本。

參考網站
參考網站
參考網站
參考網站
參考網站

nvm 是 Node.js 的版本管理器 (version manager),可在同一台主機上安裝多個版本的 Node.js 環境,因為不同專案可能會使用不同的 Node.js 版本,那就需要透過一個版本管理器來切換不同的 Node.js 版本。


安裝 NVM

接下來到 NVM 的 GitHub 儲存庫下載,無論你是 Windows、MacOS、Unix 系統都有對應的安裝方式。

Windows

NVM for Windows 有提供安裝工具,下載後照著安裝精靈依序完成即可運作,下載連結

請選擇 nvm-setup 下載並安裝

下載後依循著安裝精靈即可完成。

完成後,打開「命令提示字元」可以試著輸入 nvm,如果看到類似以下畫面就算是完成了。

MacOS

MacOS 則是使用指令進行安裝,打開「終端機」或自行安裝的「iTerm」等工具,輸入以下指令即可開始安裝,(更多版本連結)。

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

安裝後預期會顯示以下片段及算安裝完成,而此時如果你有安裝其它指令工具,有可能會發生輸入 nvm 無法呼叫的狀況(例如:zsh: command not found: nvm)。

接下來可以在你所使用的命令設定檔案加入以下片段程式碼,以下提供 bashzsh 的說明,兩者依據環境選擇其一即可:

  • bash(預設)
  • zsh

bash

預設的情況下,MacOS 中可能沒有任何一個指令設定檔案,此時可以使用 touch ~/.bash_profile 新增一個文字檔案在根目錄上,接下來回到資料根目錄可以找到 .bash_profile,沒看到的話代表未開啟隱藏檔案顯示,可以按下 Command + Shift+ . 顯示。

接下來使用任何文字編輯器打開該檔案,並加入以下程式碼存檔即可。

1
2
3
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

zsh

可以打開 .zshrc 加入以下片段後重啟(注意:.zshrc 通常在使用者根目錄下並且為隱藏檔,找到後使用任何文字編輯器打開編輯)。

1
2
3
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 就會跳出如下圖就算完成了。

注意:

  • 使用 nvm 時,不需要 sudo 即可使用 npm -g 全域安裝模組,所以與其執行 sudo npm i -g,不如執行 npm i -g
  • 若你有 ~/.npmrc,請確保裡面不包含任何 prefix 的設定 (因為與 nvm 不相容)
  • 你可以 (但不應該) 保留以前在 “系統” 安裝的 Node.js,但 nvm 只對你的使用者帳戶 (用於安裝 nvm 的使用者帳戶) 可用。可能會導致版本不 match,因為其他使用者會使用 /usr/local/lib/node_modules/*,而使用者帳戶會使用 ~/.nvm/versions/node/vX.X.X/lib/node_modules/*

常用的 NVM 指令

直接輸入 nvm 及可以看到所有的指令列表,在此僅列出最常見的幾個指令(基本上常用的只有兩三個,剩下幾個只要認識即可)

version:確認 NVM 是否安裝成功 (alias:v)

Usage:
1
2
3
nvm version
# or
nvm v

查看 NVM 的版本

1
2
$ nvm v
1.1.9

install:利用 NVM 安裝 Node.js

Usage:
1
2
3
4
5
6
nvm install
# or 

# {version} 欲安裝的 Node.js 版本
# {arch}    欲安裝的 system arch:32、64、"all" (預設為當前系統)
nvm install <version> [arch]

安裝 NVM 後,其實還沒安裝 Node 環境:

1
2
$ node  
zsh: command not found: node

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

1
2
3
4
$ 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:

1
2
3
4
5
6
7
8
$ 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)

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

1
$ nvm install 16.18.0

安裝的第一個版本的 Node.js 會成為 nvm預設版本,新的 shell 就會以預設版本的 Node.js 來使用 (例如:nvm alias default)。

查看目前安裝 Node.js 的版本:

1
2
$ node -v
v16.18.0

uninstall:利用 NVM 解除安裝指定的 Node.js 版本

Usage:
1
nvm uninstall <version>

list:查看可用的安裝版本 (alias:ls)

Usage:
1
2
3
nvm list
# or
nvm ls
  • nvm list:查看已安裝的版本
  • nvm list installed:查看已安裝的版本
  • nvm list available:查看遠端可安裝的版本

查看目前 Node.js 有哪些可用版本可安裝

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$ nvm ls available

|   CURRENT    |     LTS      |  OLD STABLE  | OLD UNSTABLE |
|--------------|--------------|--------------|--------------|
|    19.0.0    |   18.12.0    |   0.12.18    |   0.11.16    |
|   18.11.0    |   16.18.0    |   0.12.17    |   0.11.15    |
|   18.10.0    |   16.17.1    |   0.12.16    |   0.11.14    |
|    18.9.1    |   16.17.0    |   0.12.15    |   0.11.13    |
|    18.9.0    |   16.16.0    |   0.12.14    |   0.11.12    |
|    18.8.0    |   16.15.1    |   0.12.13    |   0.11.11    |
|    18.7.0    |   16.15.0    |   0.12.12    |   0.11.10    |
|    18.6.0    |   16.14.2    |   0.12.11    |    0.11.9    |
|    18.5.0    |   16.14.1    |   0.12.10    |    0.11.8    |
|    18.4.0    |   16.14.0    |    0.12.9    |    0.11.7    |
|    18.3.0    |   16.13.2    |    0.12.8    |    0.11.6    |
|    18.2.0    |   16.13.1    |    0.12.7    |    0.11.5    |
|    18.1.0    |   16.13.0    |    0.12.6    |    0.11.4    |
|    18.0.0    |   14.20.1    |    0.12.5    |    0.11.3    |
|    17.9.1    |   14.20.0    |    0.12.4    |    0.11.2    |
|    17.9.0    |   14.19.3    |    0.12.3    |    0.11.1    |
|    17.8.0    |   14.19.2    |    0.12.2    |    0.11.0    |
|    17.7.2    |   14.19.1    |    0.12.1    |    0.9.12    |
|    17.7.1    |   14.19.0    |    0.12.0    |    0.9.11    |
|    17.7.0    |   14.18.3    |   0.10.48    |    0.9.10    |

通常會選擇安裝 LTS (Long-term support,長期支援) 版

查看目前已安裝的版本

1
2
3
$ nvm ls
    * 16.18.0 (Currently using 64-bit executable)
    14.18.0

use:切換 Node.js 版本

Usage:
1
2
3
4
5
6
nvm use
# or 

# {version} 欲切換的 Node.js 版本
# {arch}    欲切換的 system arch:32、64、"all" (預設為當前系統)
nvm use <version> [arch]

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

1
nvm use v16.18.0

如果切換的目標版本還沒安裝,nvm 會提醒你要安裝:

1
2
$ nvm use v14.18.0
node v14.18.0 (64-bit) is not installed.

透過 nvm 安裝 Node.js 時,nvm 會將不同的 Node.js 版本儲存在 ~/.nvm/versions/node/vX.X.X,然後再修改 $PATH,將指定版本的 Node.js 路徑加入:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
$ nvm current
v10.16.3
$ echo $PATH
/home/titan/.nvm/versions/node/v10.16.3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

$ use v12.13.1
$ nvm current
v12.13.1
$ echo $PATH
/home/titan/.nvm/versions/node/v12.13.1/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

nvm 的各個 Node.js 版本安裝的全域套件都會在各自版本的目錄內安裝,所以在切換至新安裝的 Node.js 版本後需要重新安裝,也因為如此,不同版本間的套件就不會有衝突問題。


current:查看目前使用的版本

Usage:
1
nvm current

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

1
2
$ nvm current
v16.18.0

run:直接執行 Node.js (NVM 1.1.9版已拔除)

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

1
2
3
4
5
$ nvm run node
Running node v16.18.0 (npm v8.19.2)
Welcome to Node.js v16.18.0.
Type ".help" for more information.
>

exec:指定要執行的 Node.js 版本 (NVM 1.1.9版已拔除)

1
2
3
4
5
$ 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 的安裝路徑 (NVM 1.1.9版已拔除)

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

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

alias:查看別名、設定別名

Usage:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
$ nvm alias
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)

如下圖有些版本的文字是紅色或是顯示 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
  • … 等

設定別名

1
2
$ nvm alias v16-test v16.18.0
v16-test -> v16.18.0

接著用 nvm alias 指令就會看到剛剛新增的別名所對應的 Node.js 版本

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
$ nvm alias
v16-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)

常見錯誤原因

報錯 exit status 1(或 exit status 5) 問題

出現 exit status 1 存取被拒exit status 5 存取被拒,需要用管理員身分打開 cmd 命令列工具,再執行 nvm use <version> 即可。

報錯 exit status 145 問題

這個問題可以在 github nvm-windows 下找到答案,nvm 安裝的時候有兩個安裝目錄,一個是 nvm 安裝目錄,一個是 nodejs 安裝目錄,這兩個安裝目錄名不能出現空格或中文,但是 nodejs 默認安裝目錄是 C:\Program Files\nodejs,這個目錄中間有空格,需要我們自定義一個安裝目錄,即可解決這個問題。

BONUS:永遠以系統管理者身份執行

每次都要使用「以系統管理者身份執行」來開啟終端機是真的滿麻煩的,所以你其實可以針對應用程式永遠「以系統管理者身份執行」,首先點你要永遠執行的程式右鍵選內容

點選下方進階

將「以系統管理員身份執行」打勾

搞定,之後使用捷徑打開 cmd 時,皆為「以系統管理員身份執行」


總結

nvm 指令整理

指令功能
nvm version
nvm v
查看 nvm 版本
nvm install <version>安裝指定 <version> 版本的 Node.js
(建議安裝 LTS 版本)
nvm ls
nvm ls installed
查看目前已安裝的 Node.js 版本
nvm ls available查看目前可安裝的 Node.js 版本
nvm use <version>切換指定 <version> 版本的 Node.js
nvm current查看當前使用的 Node.js 版本

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus