在我們的日常開(kāi)發(fā)中有沒(méi)有遇到這樣的問(wèn)題: 手上有好幾個(gè)項(xiàng)目,每個(gè)項(xiàng)目依賴不同版的 NodeJS 運(yùn)行環(huán)境,又不敢茫然把所有的依賴版本都升級(jí)為最新的,那么有沒(méi)有這樣一個(gè)工具可以分別管理不同版本的node環(huán)境呢?答案是肯定的。
nvm 就是為解決這個(gè)問(wèn)題的,nvm 是 Mac 下的 node 管理工具,有點(diǎn)類(lèi)似管理 Ruby 的 rvm。
nvm VS n
node 版本管理工具還有一個(gè)是 TJ大神的 n 命令,n 命令是作為一個(gè) node 的模塊而存在,而 nvm 是一個(gè)獨(dú)立于 node/npm 的外部 shell 腳本,因此 n 命令相比 nvm 更加局限。
由于 npm 安裝的模塊路徑均為 /usr/local/lib/node_modules,當(dāng)使用 n 切換不同的 node 版本時(shí),實(shí)際上會(huì)共用全局的 node/npm 目錄。 因此不能很好的滿足按不同 node 版本使用不同全局 node 模塊的需求。
卸載全局安裝的 node/npm
在官網(wǎng)下載的 node 安裝包,運(yùn)行后會(huì)自動(dòng)安裝在全局目錄,使用過(guò)程中經(jīng)常會(huì)遇到一些權(quán)限問(wèn)題,所以推薦按照以下方法卸載全局安裝的 node/npm。
首先,打開(kāi)你 Finder,按 shift+command+G,打開(kāi)前往文件夾的窗口,分別輸入下列目錄進(jìn)去之后刪除 node 和 node_modules 相關(guān)的文件和文件夾:
- 打開(kāi)
/usr/local/lib,刪除node和node_modules相關(guān)的文件和文件夾 - 打開(kāi)
/usr/local/include,刪除node和node_modules相關(guān)的文件和文件夾 - 如果你是使用的
brew install node安裝的 NodeJS,那么你還需要在終端中執(zhí)行brew uninstall node命令來(lái)卸載 - 檢查你的個(gè)人主文件夾下面的所有的
local、lib以及include文件夾,并且刪除所有與node和node_modules相關(guān)的文件以及文件夾 - 打開(kāi)
/usr/local/bin并刪除node可執(zhí)行文件
你可能還需要在你的終端中輸入一些額外的指令:
sudo rm /usr/local/bin/npm
sudo rm /usr/local/share/man/man1/node.1
sudo rm /usr/local/lib/dtrace/node.d
sudo rm -rf ~/.npm
sudo rm -rf ~/.node-gyp
sudo rm /opt/local/bin/node
sudo rm /opt/local/include/node
sudo rm -rf /opt/local/lib/node_modules
安裝
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash
或者
wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash
從遠(yuǎn)程下載 install.sh 腳本并執(zhí)行。注意這個(gè)版本年數(shù)字 v0.33.11 會(huì)隨著項(xiàng)目開(kāi)發(fā)而變化。隨時(shí)通過(guò)官方最新安裝命令來(lái)檢查最新安裝版本是有好處的。
安裝多版本 node/npm
例如,我們要安裝8.12.0版本,可以用如下命令:
nvm install 8.12.0
nvm 遵守語(yǔ)義化版本命名規(guī)則。例如,你想安裝最新的 8.12 系列的最新的一個(gè)版本的話,可以運(yùn)行:
nvm install 8.12
nvm 會(huì)尋找 8.12.x 中最高的版本來(lái)安裝。
你可以通過(guò)以下命令來(lái)列出遠(yuǎn)程服務(wù)器上所有的可用版本:
nvm ls-remote

切換不同版本
每當(dāng)我們安裝了一個(gè)新版本 Node 后,全局環(huán)境會(huì)自動(dòng)把這個(gè)新版本設(shè)置為默認(rèn)。
nvm 提供了 nvm use 命令。這個(gè)命令的使用方法和 install 命令類(lèi)似。
我當(dāng)前版本是6.4.1,切換到剛安裝的最新的版本 8.12.0:
nvm use 8.12.0
也可以使用以下命令切換到最新版:
nvm use node
每次執(zhí)行切換的時(shí)候,系統(tǒng)都會(huì)把 node 的可執(zhí)行文件鏈接放到特定版本的文件上。
我們還可以用 nvm 給不同的版本號(hào)設(shè)置別名:
nvm alias Latest-LTS-version 8.12.0
我們給 8.12.0 這個(gè)版本號(hào)起了一個(gè)名字叫做 Latest-LTS-version,然后我們可以運(yùn)行:
nvm use Latest-LTS-version
當(dāng)然也可以通過(guò)下面這個(gè)命令取消別名:
nvm unalias Latest-LTS-version
列出已安裝的node版本
nvm ls

綠色箭頭是當(dāng)前正在使用的版本
在項(xiàng)目中使用不同版本的 Node
我們可以通過(guò)創(chuàng)建項(xiàng)目目錄中的 .nvmrc 文件來(lái)指定要使用的 Node 版本。之后在項(xiàng)目目錄中執(zhí)行 nvm use 即可。.nvmrc 文件內(nèi)容只需要遵守上文提到的語(yǔ)義化版本規(guī)則即可。另外還有個(gè)工具叫做 avn,可以自動(dòng)化這個(gè)過(guò)程。
在多環(huán)境中,npm該如何使用呢?
每個(gè)版本的 Node 都會(huì)自帶一個(gè)不同版本的 npm,可以用 npm -v 來(lái)查看 npm 的版本。全局安裝的 npm 包并不會(huì)在不同的 Node 環(huán)境中共享,因?yàn)檫@會(huì)引起兼容問(wèn)題。它們被放在了不同版本的目錄下,例如 ~/.nvm/versions/node/<version>/lib/node_modules</version> 這樣的目錄
那么問(wèn)題來(lái)了,我們安裝過(guò)的 npm 包,都要重新再裝一次?幸運(yùn)的是,我們有個(gè)辦法來(lái)解決我們的問(wèn)題,運(yùn)行下面這個(gè)命令,可以從特定版本導(dǎo)入到我們將要安裝的新版本 Node:
8.12.0
nvm install v7.3.0 --reinstall-packages-from=6.11.0
其他命令
- 直接運(yùn)行特定版本的 Node
nvm run 7.3.0 --version
- 在當(dāng)前終端的子進(jìn)程中運(yùn)行特定版本的 Node
nvm exec 7.3.0 node --version
- 確認(rèn)某個(gè)版本Node的路徑
nvm which 7.3.0
- 安裝最新版 Node
nvm install node
- 安裝最新不穩(wěn)定版本的 Node
nvm install unstable
注:
不要用homebrew下載nvm避免出錯(cuò)