跳至主要内容

【Node】在不同專案自動切換 Node 版本

在進行不同專案的時候,總是需要手動切換到不同的 Node 版本,很常忘記切換就會 run 失敗,讓我非常困擾。記錄一下解決的方法~

先行準備

  • 安裝 nvm
  • 安裝 bash 或 zsh

步驟

官方提供的方法是在資料夾底下新增 .nvmrc 檔,然後在 bash 或 zsh 裡加上一些 script,這樣每一次切換資料夾時,就會自動去抓 .nvmrc 裡的版本號,然後呼叫 nvm use <Version> 去做切換。

1. 建立 .nvmrc 檔案

在專案的根目錄底下新增 .nvmrc 檔,在裡面輸入版本號,可以直接打數字或是打 v版本

touch .nvmrc
echo "18" > .nvmrc

或是想要最新的版本可以打

echo "lts/*" > .nvmrc # 長期穩定 node.js 版本(LTS)

echo "node" > .nvmrc # 最新的 node.js 版本

2. 加入 script

這邊以 zsh 為例,先打開 .zshrc 檔

code ~/.zshrc # 每個人放的地方可能不一樣

在最後面加上

# place this after nvm initialization!
autoload -U add-zsh-hook

load-nvmrc() {
local nvmrc_path
nvmrc_path="$(nvm_find_nvmrc)"

if [ -n "$nvmrc_path" ]; then
local nvmrc_node_version
nvmrc_node_version=$(nvm version "$(cat "${nvmrc_path}")")

if [ "$nvmrc_node_version" = "N/A" ]; then
nvm install
elif [ "$nvmrc_node_version" != "$(nvm version)" ]; then
nvm use
fi
elif [ -n "$(PWD=$OLDPWD nvm_find_nvmrc)" ] && [ "$(nvm version)" != "$(nvm version default)" ]; then
echo "Reverting to nvm default version"
nvm use default
fi
}

add-zsh-hook chpwd load-nvmrc
load-nvmrc

其他 command shell 的 script 可以參考官網:

深入了解

我們可以來簡單分析一下他的 script 邏輯:

if [ -n "$nvmrc_path" ]; then
local nvmrc_node_version
nvmrc_node_version=$(nvm version "$(cat "${nvmrc_path}")")

如果 .nvmrc 的檔案存在的話,把檔案內容丟到變數 nvmrc_node_version


    if [ "$nvmrc_node_version" = "N/A" ]; then
nvm install
elif [ "$nvmrc_node_version" != "$(nvm version)" ]; then
nvm use

如果輸入的版本號沒有下載的話,執行 nvm install 下載指定版本。 如果輸入版本號跟當前版本不同的話,使用 nvm use 來切換版本。


elif [ -n "$(PWD=$OLDPWD nvm_find_nvmrc)" ] && [ "$(nvm version)" != "$(nvm version default)" ]; then
echo "Reverting to nvm default version"
nvm use default
fi

如果 .nvmrc 檔案不存在,且當前版本與預設不同的話,nvm use default 回到預設版本。