在我們的日常開發中經常會遇到這種情況:手上有好幾個項目,每個項目的需求不同,進而不同項目必須依賴不同版的 NodeJS 運行環境。如果沒有一個合適的工具,這個問題將非常棘手。
nvm 應運而生,nvm 是 Mac 下的 node 管理工具,有點類似管理 Ruby 的 rvm,如果需要管理 Windows 下的 node,官方推薦使用 nvmw 或 nvm-windows。不過,nvm-windows 並不是 nvm 的簡單移植,他們也沒有任何關系。但下面介紹的所有命令,都可以在 nvm-windows 中運行。
nvm 與 n 的區別
node 版本管理工具還有一個是 TJ大神的 n 命令,n 命令是作為一個 node 的模塊而存在,而 nvm 是一個獨立於 node/npm 的外部 shell 腳本,因此 n 命令相比 nvm 更加局限。
由於 npm 安裝的模塊路徑均為 /usr/local/lib/node_modules
,當使用 n 切換不同的 node 版本時,實際上會共用全局的 node/npm 目錄。 因此不能很好的滿足『按不同 node 版本使用不同全局 node 模塊』的需求。
卸載全局安裝的 node/npm
在官網下載的 node 安裝包,運行后會自動安裝在全局目錄,使用過程中經常會遇到一些權限問題,所以推薦按照以下方法卸載全局安裝的 node/npm。
首先,打開你 Finder,按 shift+command+G
,打開前往文件夾的窗口,分別輸入下列目錄進去之后刪除 node
和 node_modules
相關的文件和文件夾:
- 打開
/usr/local/lib
,刪除node
和node_modules
相關的文件和文件夾 - 打開
/usr/local/include
,刪除node
和node_modules
相關的文件和文件夾 - 如果你是使用的
brew install node
安裝的 NodeJS,那么你還需要在終端中執行brew uninstall node
命令來卸載 - 檢查你的個人主文件夾下面的所有的
local
、lib
以及include
文件夾,並且刪除所有與node
和node_modules
相關的文件以及文件夾 - 打開
/usr/local/bin
並刪除node
可執行文件
你可能還需要在你的終端中輸入一些額外的指令:
1
2
3
4
5
6
7
8
|
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
|
Windows 安裝
首先最重要的是:一定要卸載已安裝的 NodeJS,否則會發生沖突。然后下載 nvm-windows 最新安裝包,直接安裝即可。
OS X/Linux 安裝
與 Windows 不同,我們並不一定要先卸載原有的 NodeJS。當然我們推薦還是先卸載掉比較好。另外,你還需要 C++ 編譯器,Linux 發行版一般不用擔心,像 Ubuntu 都可以直接用 build-essential
套件,OS X 的話,可以用 X-Code
的命令行工具。運行這個命令即可:
1
|
xcode-select --install
|
在 Linux 中:(如果是 Debian 發行版)
1
|
sudo apt-get install build-essential
|
然后我們可以使用
1
|
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.0/install.sh | bash
|
或者
1
|
wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.0/install.sh | bash
|
從遠程下載 install.sh
腳本並執行。注意這個版本年數字 v0.33.0
會隨着項目開發而變化。隨時通過官方最新安裝命令來檢查最新安裝版本是有好處的。
安裝多版本 node/npm
例如,我們要安裝4.2.2版本,可以用如下命令:
1
|
nvm install 4.2.2
|
nvm 遵守語義化版本命名規則。例如,你想安裝最新的 4.2
系列的最新的一個版本的話,可以運行:
1
|
nvm install 4.2
|
nvm 會尋找 4.2.x
中最高的版本來安裝。
你可以通過以下命令來列出遠程服務器上所有的可用版本:
1
|
nvm ls-remote
|
Windows 的話,就是:
1
|
nvm ls available
|
在不同版本間切換
每當我們安裝了一個新版本 Node 后,全局環境會自動把這個新版本設置為默認。
nvm 提供了 nvm use
命令。這個命令的使用方法和 install
命令類似。
例如,切換到 4.2.2
:
1
|
nvm use 4.2.2
|
切換到最新的 `4.2.x``:
1
|
nvm use 4.2
|
切換到 iojs:
1
|
nvm use iojs-v3.2.0
|
切換到最新版:
1
|
nvm use node
|
每次執行切換的時候,系統都會把 node 的可執行文件鏈接放到特定版本的文件上。
我們還可以用 nvm 給不同的版本號設置別名:
1
|
nvm alias awesome-version 4.2.2
|
我們給 4.2.2
這個版本號起了一個名字叫做 awesome-version
,然后我們可以運行:
1
|
nvm use awesome-version
|
下面這個命令可以取消別名:
1
|
nvm unalias awesome-version
|
另外,你還可以設置 default
這個特殊別名:
1
|
nvm alias default node
|
列出已安裝實例
1
|
nvm ls
|
nvm ls
上面綠色箭頭是當前正在使用的版本,下面列出的還有設置過的別名。
在項目中使用不同版本的 Node
我們可以通過創建項目目錄中的 .nvmrc
文件來指定要使用的 Node 版本。之后在項目目錄中執行 nvm use
即可。.nvmrc
文件內容只需要遵守上文提到的語義化版本規則即可。另外還有個工具叫做 avn,可以自動化這個過程。
在多環境中,npm該如何使用呢?
每個版本的 Node 都會自帶一個不同版本的 npm,可以用 npm -v
來查看 npm 的版本。全局安裝的 npm 包並不會在不同的 Node 環境中共享,因為這會引起兼容問題。它們被放在了不同版本的目錄下,例如 ~/.nvm/versions/node/<version>/lib/node_modules</version>
這樣的目錄。這剛好也省去我們在 Linux 中使用 sudo
的功夫了。因為這是用戶的主文件夾,並不會引起權限問題。
但問題來了,我們安裝過的 npm 包,都要重新再裝一次?幸運的是,我們有個辦法來解決我們的問題,運行下面這個命令,可以從特定版本導入到我們將要安裝的新版本 Node:
1
|
nvm install v5.0.0 --reinstall-packages-from=4.2
|
其他命令
直接運行特定版本的 Node
1
|
nvm run 4.2.2 --version
|
在當前終端的子進程中運行特定版本的 Node
1
|
nvm exec 4.2.2 node --version
|
確認某個版本Node的路徑
1
|
nvm which 4.2.2
|
安裝 Node 的其他實現,例如 iojs(一個基於 ES6 的 Node 實現,現在已經和 Node 合並)
1
|
nvm install iojs-v3.2.0
|
快捷命令:
nvm install node
安裝最新版 Nodenvm install iojs
安裝最新版 iojsnvm install unstable
安裝最新不穩定版本的 Node