Автоматическое переключение версии Node.js по .nvmrc
Проблема
Сейчас я работаю с несколькими легаси‑проектами, которые нельзя просто обновить до новой версии Node.js, ничего не сломав. В каждом проекте используется своя версия Node — иногда 14, иногда 16 или 18. nvm уже помогает переключаться между версиями, но процесс оставался ручным: nvm use и внимательное отслеживание файла .nvmrc.
Я хотела избавиться от рутинных переключений и настроить терминал, чтобы он автоматически активировал нужную версию Node при переходе в директорию проекта. Важно, чтобы этот механизм был надёжным и не требовал моего участия.
Как это работает
Если в корне проекта лежит файл .nvmrc, в котором указана нужная версия Node.js, терминал будет сам переключаться на неё при входе в папку. А если нужная версия ещё не установлена — nvm её установит. Если файл отсутствует, используется версия по умолчанию.
Как подключить автоматическое переключение
Есть два способа — вручную через редактор или автоматически через терминал.
1. Через редактор
Откройте ~/.zshrc в VS Code:
code ~/.zshrc
Или используйте любой другой редактор, который вам нравится.
Добавьте в конец файла:
# Автоматическое переключение версии Node.js с помощью NVM
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
2. Через терминал
Если хотите быстрее — вставьте скрипт напрямую из терминала:
cat >> ~/.zshrc << 'EOF'
# Автоматическое переключение версии Node.js с помощью NVM
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
EOF
source ~/.zshrc
Что изменилось в работе
У меня в данный момент четыре проекта, каждый со своей версией Node.js. Раньше я регулярно забывала вручную вызывать nvm use и сталкивалась с ошибками при сборке. Сейчас всё работает автоматически, и я даже не думаю о версиях.
Этот скрипт просто живёт в .zshrc, и если в проекте есть .nvmrc, он делает свою работу. Если файла нет — ничего не происходит. Рекомендую добавить его один раз и больше к нему не возвращаться.
P.S. Да, это не первая статья на эту тему, но мне захотелось сделать заметку для себя, чтобы не искать в интернете каждый раз, когда настраиваю новый компьютер.