← Назад

Автоматическое переключение версии 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. Да, это не первая статья на эту тему, но мне захотелось сделать заметку для себя, чтобы не искать в интернете каждый раз, когда настраиваю новый компьютер.