nvm-一個node版本管理工具 + 開啟終端自動切換node版本教程

千鳥語發表於2021-11-04

在日常的前端或node後臺開發中,使用的部分node依賴,可能不支援當前使用的node版本,這時候如果還想使用這個依賴愉快的開發,那隻能切換node版本了。

然而,解除安裝和安裝node的麻煩程度雖然還能接受,但想在其他專案,依然使用高版本node的語法支援,要麼使用webpack或gulp這種構建編譯工具,要麼就還是需要使用高版本node。

這時候,nvm出現了。

nvm就是node版本管理器,使用它可以安裝多個版本的node,然後可以通過一行命令,輕鬆切換當前使用的node版本。

也就是說,不用再解除安裝、安裝了,想用哪個版本,就用nvm安裝,安完一個指令切換就可以了!

下面基於mac系統,進行一些步驟的講解。

安裝

nvm 官方教程

解除安裝全域性安裝的node包

既然使用nvm‘託管’,那麼自己之前安裝的全域性node包,就需要先解除安裝了,防止出問題。

npm、cnpm、yarn等都會被一併刪掉,稍後需要重新安。

下面的指令,可以檢視已經安裝在全域性的模組node功能模組,以便刪除這些全域性模組後再按照不同的 node 版本重新進行全域性安裝
npm ls -g --depth=0

下面,是解除安裝步驟

也可以用 type -a node 檢視一下路徑,不同機器和不通安裝方式,位置可能不一樣。
  1. 刪除全域性 node_modules 目錄,裡面其實只有幾個資料夾,是npm和使用npm全域性安裝的比如yarn、cnpm等
    sudo rm -rf /usr/local/lib/node_modules
  2. 刪除 node,其實就是解除安裝node環境了
    sudo rm /usr/local/bin/node
  3. 刪除全域性 node 模組註冊的軟鏈,懂linux指令語法的,大概可以看懂,下面這行的命令,就是先進入到系統的全域性指令檔案,篩選出其中依賴於 node_modules的所有指令(其實還是步驟1中的那幾個指令),然後刪除
    cd /usr/local/bin && ls -l | grep "../lib/node_modules/" | awk '{print $9}'| xargs rm

可以使用終端輸node -v,如果提示node: command not found,就說明解除安裝完成了

安裝 nvm

安裝nvm有多種方式,下面是兩種方式,建議在官網檢視最新的安裝語句(由於外網問題,很可能會安裝失敗,後面有其他安裝方式):

curl方式:

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

wget方式:

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

上面兩個語句,都會都會執行nvm的安裝指令碼,安裝完成後,會有類似下面的列印:

=> Profile not found. Tried  (as defined in $PROFILE), ~/.bashrc, ~/.bash_profile, ~/.zshrc, and ~/.profile.
=> Create one of them and run this script again
=> Create it (touch ) and run this script again
   OR
=> Append the following lines to the correct file yourself:

export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
=> Close and reopen your terminal to start using nvm or run the following to use it now:

export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm

意思是,我們需要在~/.bashrc~/.bash_profile~/.zshrc~/.profile這四個檔案的任意一個,加入nvm的這行指令,儲存關閉,然後重啟終端,就可以使用nvm指令了。

v0.35.3版本的指令如下,可以直接在官網安裝最新版本的nvm,貼上最新版的指令(下面是官網提供的指令,也可以使用安裝完成後,上面列印出來的指令):

export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm

這裡推薦建立~/.bash_profile,如果有,則直接在裡面的最後面加上上面的程式碼即,然後執行source ~/.bash_profile,過載此檔案,nvm就可以正常使用了。

安裝失敗

上面的語句有可能會由於網路問題,而安裝失敗。

此時可以進入 nvm 官方教程(實際就是一個 github 頁面),這裡會提供多種安裝方式(但最終貌似都需要克隆 nvm 的倉庫,我們可以手動克隆倉庫了)。

但是, github 同樣有無法開啟的可能,那我們也開啟國產 「githup」- 碼雲搜尋 nvm-sh,找到熱血網友從 github 克隆至此的專案,一樣的使用。

下面大致講解其中比較簡單的一種:

Git Install:

進入到 ~ 目錄,使用 git 克隆 nvm 倉庫:

cd ~/

git clone https://github.com/nvm-sh/nvm.git .nvm

進入,切換到最新版本分支(實際最新分支,可再去官網看一下):

cd .nvm

git checkout v0.38.0

執行一下安裝指令,這個指令瞬間執行完成:

. ./nvm.sh

最後,再一下幾個檔案中的任意一個,~/.bashrc~/.profile ,或 ~/.zshrc,貼上入一下程式碼:

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

最後的最後,讓系統重新讀取一下這個檔案,比如這個放進了 ~/.bashrc 檔案中,那麼執行:

source ~/.bashrc

完成,此時可以使用 nvm 了。

nvm使用

主要為如下一些指令:

功能指令
列出當前已安裝的node,和可安裝的lts(長期支援穩定版)版本nvm ls
列出所有遠端伺服器的版本nvm ls-remote
安裝指定版本,可模糊安裝,建議先查詢後安裝,比如 nvm install v11.11.0nvm install <版本號>
安裝最新穩定版 nodenvm install stable
刪除已安裝的指定版本,語法與install類似nvm uninstall <版本號>
設定一個預設版本,新開啟的終端使用的版本nvm alias default <版本號>
給不同的版本號新增別名nvm alias <別名> <版本號>
取消一個別名nvm unalias <別名>
切換當前終端使用的版本,但只針對當前終端生效,不影響其他nvm use <版本號 或 別名>
顯示當前的版本nvm current
刪除已定義的別名nvm unalias <別名>
在當前版本 node 環境下,重新全域性安裝指定版本號的 npm 包nvm reinstall-packages <版本號>

使用終端進入不同目錄,avn 自動切換node版本

這個功能本來不需要,但近幾年發現,業務和專案太多時,可能真的就很需要了。

比如,接收過來專案,使用的 node 版本可能五花八門;自己公司開發的專案,使用固定某個 node 版本;偶爾自己研究些新技術,又可能會使用最新版的。

本來是進入某個專案,就使用 nvm use 來切換一下,但總的來說很麻煩,每次開啟終端都要來這麼一下。

網上找了找,找到了這個工具: avn

首先新開啟一個終端,保證現在使用的是預設版本的 node,這是因為 nvm 中,在不同的 node 版本下安裝的全域性依賴,是互不相通的。

這個工具是基於 node 的,我們只需要預設 node 下全域性安裝,當每次使用終端進入不同目錄時,node 預設都是版本,然後它會自動執行,切換到接下來你要指定的 node 版本。

開啟終端後,先全域性安裝:

npm install -g avn avn-nvm avn-n

然後啟動這個工具:

avn setup

注意:不知道為什麼,我使用node^11.11.0 安裝的依賴們,就可以啟動,而是用 node^12.21.0,它還是個長期支援版,使用這個版本安裝的依賴,啟動時卻會報錯 if (cb) cb.apply(this, arguments) 很奇怪,不過,你可以在 v11.11.0 下,安裝依賴並啟動,之後切換node版本也不會影響了,如果有影響,就在其他版本下也安裝依賴。

接下來,就是去到你需要自定義 node 版本的專案,建立檔案 .node-version ,內容直接寫你需要的 node 版本,比如:

這個 node 版本,需要是你已經用 nvm 安裝過了的,否則會報錯 avn could not activate node v14.15.0
v14.16.0

然後,在這個專案下重啟終端,就會出現提示:

avn activated v14.16.0 via ../.node-version (avn-nvm v14.16.0)

此時這個終端使用的 node,就是 v14.16.0 了。

優化: 但上面這個方法,需要在每個自定義 node 版本的專案中,新增這個檔案,很不友好。

其實,我們可以在把這個檔案,放在這個專案的父級目錄中,同樣會生效,這樣凡是使用同一個 node 版本的專案,都放在這個資料夾下,就很友好了。

相關文章