來源:http://taobaofed.org/blog/2015/11/17/nvm-or-n/node
我本機安裝着 nvm,而 node 原本一直運行在 0.x 的老版本上。後來爲了跑 ES6,我將 node 切換到 4.x 的版本,而且把老版本給刪掉了。git
而後我就碰到了兩個問題。一是 WebStorm 報錯說找不到 node 解釋器了。我只好去設置裏面從新設置一番解釋器的路徑:github
在個人記憶中,WebStorm 默認不須要設置 node 路徑,它會去找 /usr/local/bin
,即一般的 node 命令位置。而一旦使用 nvm 來安裝和管理 node,甚至頻繁切換的話,咱們就得 手動地 指定 node 路徑。shell
並且是如此硬編碼的路徑(硬編碼了版本號),真不優雅……npm
第二個問題是,我曾經在全局安裝的各類 node 模塊們全都須要從新安裝,由於全局模塊被安裝在每一個 node 版本本身的沙箱中,所以它們和老版本的 node 一塊兒被埋葬了。bash
事實上,這就是 nvm 的特性,然而喜不喜歡它則是另外一回事兒了。curl
無論如何,因爲發生了這些個問題,我決定稍微深刻了解一下狀況。工具
在 node 的版本管理工具中,nvm 天然聲名遠揚,然而咱們也不能忘了來自 TJ 的 n。這兩種,是目前最主流的方案。測試
關於這兩個工具如何安裝和使用,這裏再也不贅言,請見它們各自的主頁:編碼
接下來咱們着重關注一下 nvm 和 n 的運做機制和特性。
n 是一個須要全局安裝的 npm package。
npm install -g n |
這意味着,咱們在使用 n 管理 node 版本前,首先須要一個 node 環境。咱們或者用 Homebrew 來安裝一個 node,或者從官網下載 pkg 來安裝,總之咱們得先本身裝一個 node —— n 自己是無法給你裝的。
而後咱們可使用 n 來安裝不一樣版本的 node。
在安裝的時候,n 會先將指定版本的 node 存儲下來,而後將其複製到咱們熟知的路徑 /usr/local/bin
,很是簡單明瞭。固然因爲 n 會操做到非用戶目錄,因此須要加 sudo
來執行命令。
因此這樣看來,n 在其實現上是一個很是易理解的方案。
咱們再來看 nvm。不一樣於 n,nvm 不是一個 npm package,而是一個獨立軟件包。這意味着咱們須要單獨使用它的安裝邏輯:
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.29.0/install.sh | bash |
或者使用 Homebrew 來安裝。安裝完後,還須要修改一下 shell 配置(~/.zshrc
or whatever),具體參見官方文檔。
而後咱們可使用 nvm 來安裝不一樣版本的 node。
在安裝的時候,nvm 將不一樣的 node 版本存儲到 ~/.nvm/<version>/
下,而後修改 $PATH
,將指定版本的 node 路徑加入,這樣咱們調用的 node
命令便是使用指定版本的 node。
nvm 顯然比 n 要複雜一些,可是另外一方面,因爲它是一個獨立軟件包,所以它和 node 之間的關係看上去更合乎邏輯:nvm 不依賴 node 環境,是 node 依賴 nvm;而不像 n 那樣產生相似循環依賴的問題。
這樣看下來,nvm 和 n 的差別仍是比較大的,具體體如今:
/usr/local/bin
;nvm 須要手動指定路徑。因此,如何選擇?真心見仁見智了,不過這裏能夠給出大致的建議:
你若是要問,樓主最終選用了誰?我會說,我選擇了更流行的那一個。