使用 nvm + .nvmrc 讓 Node.js 版本在不同的專案間自動切換

這篇文章寫於 2022 年,文中的工具與版本可能已經更新,實作時請以官方文件為準。

本文目錄
  1. STEP 1:建立兩個 Node.js 專案
  2. STEP 2:安裝特定的 Node.js 版本以供測試
  3. STEP 3:在兩個 Node.js 專案中加入「.nvmrc」並指定 Node.js 版本
  4. STEP 4:調整 zsh script
  5. STEP 5:實測是否有效

Node.js 版本更新速度極快,但未必所有套件都能相容於新的版本,這造成每個專案的 Node.js 版本不盡相同;即使 nvm 可以幫我們快速切換 Node.js 版本還是不太方便,所以今天要介紹如何透過 .nvmrc 搭配 zsh or bash script 讓你在專案間自動切換 Node.js 版本。

使用 nvm + .nvmrc 讓 Node.js 版本在不同的專案間自動切換(圖 1)

筆者原本選用「avn」這個套件,但它真的已經年久失修了無法使用連結

STEP 1:建立兩個 Node.js 專案

在終端機複製貼上下方指令即可。

mkdir project-a
cd project-a
npm init -y
cd ..
mkdir project-b
cd project-b
npm init -y
cd ..

STEP 2:安裝特定的 Node.js 版本以供測試

尚未 nvm 安裝的讀者,可以先透過如下指令安裝,更新的版本請參考連結。

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

安裝完後建議重開終端機讓它生效,接著透過它安裝 Node.js 特定版本:

nvm install 12
nvm install 16

STEP 3:在兩個 Node.js 專案中加入「.nvmrc」並指定 Node.js 版本

接下來我們就分別在兩個專案中新增「.nvmrc」的檔案,並個別指定 12、16 版本方便測試(讀者在終端機複製貼上下方指令即可)。

cd project-a
touch .nvmrc
echo "12" >> .nvmrc
cd ..
cd project-b
touch .nvmrc
echo "16" >> .nvmrc
cd ..

筆者為了方便 Demo 而指定大版本,「.nvmrc」檔案是能吃「x.y.z」版本號的。

STEP 4:調整 zsh script

在終端機輸入 vi ~/.zshrc(每個人的路徑可能不同),到最後一行貼上下方 script:

# place this after nvm initialization!
autoload -U add-zsh-hook
load-nvmrc() {
  local node_version="$(nvm version)"
  local nvmrc_path="$(nvm_find_nvmrc)"
  if [ -n "$nvmrc_path" ]; then
    local nvmrc_node_version=$(nvm version "$(cat "${nvmrc_path}")")
    if [ "$nvmrc_node_version" = "N/A" ]; then
      nvm install
    elif [ "$nvmrc_node_version" != "$node_version" ]; then
      nvm use
    fi
  elif [ "$node_version" != "$(nvm version default)" ]; then
    echo "Reverting to nvm default version"
    nvm use default
  fi
}
add-zsh-hook chpwd load-nvmrc
load-nvmrc

儲存後再輸入 source ~/.zshrc 即可讓 script 生效。

這邊簡單說明 script 運行邏輯:

  • 資料夾下有「.nvmrc」的檔案:若指定的 Node.js 版本已安裝就透過「nvm use」切換,假使該版本尚未安裝就會執行「nvm install」。
  • 資料夾下沒有「.nvmrc」的檔案:切換回 Node.js 默認的版本。

唯一要注意的是,記得把這段 script 放在 nvm 初始化後的位置(或是直接放在最後面也可以)。

上面的 script 參考自 nvm 官網,如果讀者使用的是 bash script 請參考連結。

STEP 5:實測是否有效

筆者在開頭故意切換到 Node.js 18 的版本,然後再依序切換到「project-a」以及「project-b」的資料夾,從下圖大家可以看到 Node.js 的版本都順利切換嚕!

STEP 5:實測是否有效(圖 2)

希望這篇文章,有幫大家解決不同專案的 Node.js 版本切換之苦~

Talk

留言討論

留言載入中…