Управление Node.js 19 и NPM 9 с помощью NVM

Выпуск Node.js 19 состоялся 18 октября 2022 года. Данная версия включает npm 9 и много новых функциональностей. Предлагаем их опробовать! 

Менеджер версий Node.js, NVM (англ. Node Version Manager),  —  лучший инструмент для обновления версий Node.js и npm, который помогает уменьшать риски. 

Рассмотрим принцип работы nvm на примере версий Node.js 19 и npm 9.

Установка NVM

nvm управляет версиями Node.js и npm. Устанавливается для конкретного пользователя и вызывается отдельно для каждой оболочки. nvm работает в любой POSIX-совместимой оболочке (sh, dash, ksh, zsh, bash), особенно на платформах Unix, macOS и Windows WSL.

Последняя версия nvm —  0.39.2. Она устанавливается командой curl или wget:

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

Скрипт install.sh клонирует репозиторий nvm в ~/.nvm и пытается добавить исходные строки из нижеследующего фрагмента в надлежащий файл профиля (~/.bash_profile, ~/.zshrc, ~/.profile или ~/.bashrc):

export NVM_DIR=/Users/jenniferfu/.nvm
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # Загрузка nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # Загрузка nvm bash_completionВидим в Как видно, добавлены вышеуказанные строки.

Видим, что вышеуказанные строки добавлены в файл профиля, такой как ~/.zshrc.

Применение NVM

Вслед за nvm устанавливаем последнюю версию Node.js следующей командой:

% nvm install node
Downloading and installing node v19.0.0...
Downloading https://nodejs.org/dist/v19.0.0/node-v19.0.0-darwin-x64.tar.xz...
##################################################################################################################### 100.0%
Computing checksum with sha256sum
Checksums matched!
Now using node v19.0.0 (npm v8.19.2)

Вывод (строка 7) указывает на то, что вместе с Node.js 19.0.0 используется npm 8.19.2. Убедимся в этом с помощью следующих команд: 

% node -v
v19.1.0
% npm -v
8.19.2

Кроме того, можно указать конкретную версию, подлежащую установке. Семантический формат версии определяется SemVer:

% nvm install 12.22.7
Downloading and installing node v12.22.7...
Downloading https://nodejs.org/dist/v12.22.7/node-v12.22.7-darwin-x64.tar.xz...
################################################################################################################################################## 100.0%
Computing checksum with sha256sum
Checksums matched!
Now using node v12.22.7 (npm v6.14.15)

Если конкретная версия уже установлена, то она не переустанавливается: 

% nvm install 12.22.7
v12.22.7 is already installed.
Now using node v12.22.7 (npm v6.14.15)

Что требуется для обновления npm до версии 9

% npm install -g [email protected]

changed 15 packages, and audited 227 packages in 1s

14 packages are looking for funding
run `npm fund` for details

found 0 vulnerabilities

Список всех установленных версий:

% nvm ls
v10.14.0
v12.22.7
v14.17.6
v14.20.1
v16.0.0
v17.0.0
v17.1.0
v17.3.0
v18.0.0
-> v19.0.0
system
default -> 14.17.6 (-> v14.17.6)
iojs -> N/A (default)
unstable -> N/A (default)
node -> stable (-> v19.0.0) (default)
stable -> 19.0 (-> v19.0.0) (default)
lts/* -> lts/gallium (-> N/A)
lts/argon -> v4.9.1 (-> N/A)
lts/boron -> v6.17.1 (-> N/A)
lts/carbon -> v8.17.0 (-> N/A)
lts/dubnium -> v10.24.1 (-> N/A)
lts/erbium -> v12.22.12 (-> N/A)
lts/fermium -> v14.20.1
lts/gallium -> v16.18.0 (-> N/A)

В представленном выводе стрелочка указывает на текущую версию Node.js  —  19.0.0 (строка 11). Кроме того, здесь представлены значения для default (14.17.6, строка 13), node (19.0.0, строка 16) и stable (19.0.0, строка 17).

nvm use меняет текущую версию: 

% nvm use 10.14.0
Now using node v10.14.0 (npm v7.24.2)
% nvm use 12.22.7
Now using node v12.22.7 (npm v6.14.15)
% nvm use 14
Now using node v14.20.1 (npm v6.14.17)
% nvm use 17.1
Now using node v17.1.0 (npm v8.1.2)
% nvm use 19.0.0
Now using node v19.0.0 (npm v9.0.0)
% nvm use default
Now using node v14.17.6 (npm v6.14.15)
% nvm use node
Now using node v19.0.0 (npm v9.0.0)
% nvm use stable
Now using node v19.0.0 (npm v9.0.0)

Ожидаемо возникает вопрос о том, каким образом v10.14.0 использует более позднюю версию npm (строка 2), чем v14.20.1 (строка 6). Данный результат возможен благодаря следующим командам: 

% nvm use 10.14.0
% npm install -g [email protected]

Как известно, npm 8 перестал поддерживать Node.js 10. Версия 10.14.0 не устанавливает npm 8.0.0:

% npm install -g [email protected]
(node:93676) ExperimentalWarning: The fs.promises API is experimental
npm ERR! code EBADENGINE
npm ERR! engine Unsupported engine
npm ERR! engine Not compatible with your version of node/npm: [email protected]
npm ERR! notsup Not compatible with your version of node/npm: [email protected]
npm ERR! notsup Required: {"node":"^12.13.0 || ^14.15.0 || >=16"}
npm ERR! notsup Actual: {"npm":"7.24.2","node":"v10.14.0"}

npm ERR! A complete log of this run can be found in:
npm ERR! /Users/jenniferfu/.npm/_logs/2022-10-24T05_28_28_282Z-debug.log

Данная команда получает последнюю поддерживаемую версию npm для текущей версии Node.js:

% nvm install-latest-npm
Attempting to upgrade to the latest working version of npm...
* Installing latest `npm`; if this does not work on your node version, please report a bug!

removed 22 packages, changed 72 packages, and audited 212 packages in 1s

11 packages are looking for funding
run `npm fund` for details

found 0 vulnerabilities
* npm upgraded to: v8.19.2

Для Node.js 19.0.0 последней рабочей версией npm является 8.19.2.

nvm use устанавливает определенную версию для текущей оболочки. При запуске новой оболочки эта установленная версия Node.js будет потеряна. 

Как же сделать заданную версию Node.js постоянной?

Есть одна версия, которая распространяется на все оболочки, и это версия по умолчанию. Она устанавливается командой nvm alias:

% nvm alias default 14
default -> 14 (-> v14.20.1)

Для удобства можно создать файл .nvmrc, который принимает формат SemVer, node и default. После этого если в командной строке не указана версия, то nvm use, nvm install, nvm exec, nvm run и nvm which будут задействовать версию, обозначенную в файле .nvmrc:

% cat .nvmrc
19.0.0
% nvm use
Found '/Users/jenniferfu/.nvmrc' with version <19.0.0>
Now using node v19.0.0 (npm v8.19.2)

Проверяем текущую версию:

% nvm current
v19.0.0

ls-remote перечисляет все доступные версии, отображая весьма длинный список: 

% nvm ls-remote

Указание частичной версии позволяет сузить предоставляемый список: 

% nvm ls-remote 19
-> v19.0.0
% nvm ls-remote 18
v18.0.0
v18.1.0
v18.2.0
v18.3.0
v18.4.0
v18.5.0
v18.6.0
v18.7.0
v18.8.0
v18.9.0
v18.9.1
v18.10.0
v18.11.0

nvm which показывает путь к исполняемому файлу в место его установки. Мы установили следующие версии Node.js: 10.14.0, 12.22.7, 14.17.6, 17.1.0, 18.0.0 и 19.0.0. Ниже представлены результаты nvm which:

% nvm which 10.14.0
/Users/jenniferfu/.nvm/versions/node/v10.14.0/bin/node
% nvm which 12.22.7
/Users/jenniferfu/.nvm/versions/node/v12.22.7/bin/node
% nvm which 14.17.6
/Users/jenniferfu/.nvm/versions/node/v14.17.6/bin/node
% nvm which 15.0.0
N/A: version "v15.0.0" is not yet installed.
You need to run `nvm install 15.0.0` to install and use it.
% nvm which 17.1.0
/Users/jenniferfu/.nvm/versions/node/v17.1.0/bin/node
% nvm which 18
/Users/jenniferfu/.nvm/versions/node/v18.0.0/bin/node
% nvm which 19
/Users/jenniferfu/.nvm/versions/node/v19.0.0/bin/node
% nvm which 19.0
/Users/jenniferfu/.nvm/versions/node/v19.0.0/bin/node
% nvm which 19.0.0
/Users/jenniferfu/.nvm/versions/node/v19.0.0/bin/node

С помощью заданной версии Node.js можно напрямую запустить приложение: 

% nvm run 14.17.6 app.js

Как вариант, данная команда запускает node app.js вместе с PATH, указывающим на Node.js 14.17.6:

% nvm exec 14.17.6 node app.js

Узнать о дополнительных командах nvm можно с помощью команды help

% nvm --help

Node Version Manager (v0.39.2)

Примечание: <version> относится к любой строке, похожей на версию и понятной для nvm. В эту категорию входят:
- полные или частичные номера версий, которые могут начинаться с "v"(0.10, v0.1.2, v1)
- псевдонимы по умолчанию (встроенные): node, stable, unstable, iojs, system
- пользовательские псевдонимы, определяемые с помощью `nvm alias foo`

Любые параметры, создающие цветной вывод, должны учитывать параметр `--no-colors`.
Использование:
nvm --help Отображает данное сообщение
--no-colors Блокирует цветной вывод
nvm --version Выводит установленною версию nvm
nvm install [<version>] Загружает и устанавливает <version>. Использует файл .nvmrc при его наличии и при условии отсутствия указанной версии).
Следующие опциональные аргументы, в случае их указания, должны размещаться непосредственно после `nvm install`:
-s Пропускает загрузку бинарных файлов, устанавливает только из исходников.
-b Пропускает загрузку исходников, устанавливает только из бинарных файлов.
--reinstall-packages-from=<version> При установке переустанавливает пакеты, установленные в <node|iojs|node version number>.
--lts При установке выбирает только из версий LTS, т.е. версий с долгосрочной поддержкой.
--lts=<LTS name> При установке выбирает только из версий для конкретной строки LTS
--skip-default-packages При установке пропускает файл default-packages, если он существует
--latest-npm После установки пытается выполнить обновление до последней рабочей версии npm для заданной версии Node
--no-progress Отключает индикатор выполнения при любых загрузках
--alias=<name> После установки задает указанный псевдоним для обозначенной версии. (аналогичен nvm alias <name> <version>)
--default После установки задает псевдоним по умолчанию для обозначенной версии. (аналогичен nvm alias default <version>)
nvm uninstall <version> Удаляет версию
nvm uninstall --lts Удаляет с помощью автоматического псевдонима LTS `lts/*` при его наличии
nvm uninstall --lts=<LTS name> Удаляет с помощью автоматического псевдонима для указанной строки LTS при его наличии
nvm use [<version>] Меняет PATH для использования <version>. Задействует файл .nvmrc при его наличии и при условии отсутствия указанной версии.
Следующие опциональные аргументы, в случае их указания, должны размещаться непосредственно после `nvm use``:
--silent Останавливает поток вывода stdout/stderr
--lts Использует автоматический псевдоним LTS `lts/*` при его наличии.
--lts=<LTS name> Использует автоматический псевдоним для указанной строки LTS при его наличии
nvm exec [<version>] [<command>] Выполняет <command> для <version>. Задействует файл .nvmrc при его наличии и при условии отсутствия указанной версии.
Следующие опциональные аргументы, в случае их указания, должны размещаться непосредственно после `nvm exec`:
--silent Останавливает поток вывода stdout/stderr
--lts Использует автоматический псевдоним LTS `lts/*` при его наличии.
--lts=<LTS name> Использует автоматический псевдоним для указанной строки LTS при его наличии
nvm run [<version>] [<args>] Выполняет `node` для <version> с <args> в качестве аргументов. Задействует файл .nvmrc при его наличии и при условии отсутствия указанной версии.
Следующие опциональные аргументы, в случае их указания, должны размещаться непосредственно после `nvm run`:
--silent Останавливает поток вывода stdout/stderr
--lts Использует автоматический псевдоним LTS `lts/*` при его наличии.
--lts=<LTS name> Использует автоматический псевдоним для указанной строки LTS при его наличии
nvm current Отображает текущую активированную версию Node
nvm ls [<version>] Перечисляет установленные версии, соответствующие заданной версии <version> при ее наличии
--no-colors Блокирует цветной вывод
--no-alias Блокирует вывод `nvm alias`
nvm ls-remote [<version>] Перечисляет удаленные версии, доступные для установки и соответствующие заданной версии <version> при ее наличии
--lts При перечислении отображает только версии LTS
--lts=<LTS name> При перечислении отображает только версии для указанной строки LTS
--no-colors Блокирует цветной вывод
nvm version <version> Преобразует заданное описание в одну локальную версию
nvm version-remote <version> Преобразует заданное описание в одну удаленную версию
--lts При перечислении выбирает только из версий LTS
--lts=<LTS name> При перечислении выбирает только из версий для указанной строки LTS
nvm deactivate Отменяет действия `nvm` для текущей оболочки
--silent Останавливает поток вывода stdout/stderr
nvm alias [<pattern>] Отображает все псевдонимы, начинающиеся с <pattern>
--no-colors Блокирует цветной вывод
nvm alias <name> <version> Задает псевдоним с именем <name>, указывающий на <version>
nvm unalias <name> Удаляет псевдоним с именем <name>
nvm install-latest-npm Пытается выполнить обновление до последней рабочей версии npm для текущей версии Node
nvm reinstall-packages <version> Переустанавливает глобальные пакеты `npm`, содержащиеся в <version>, под текущую версию
nvm unload Выгружает `nvm` из оболочки
nvm which [current | <version>] Показывает путь к установленной версии Node. Задействует файл .nvmrc при его наличии и при условии отсутствия указанной версии.
--silent Останавливает поток вывода stdout/stderr при отсутствии указанной версии
nvm cache dir Показывает путь к директории cache для nvm
nvm cache clear Чистит директорию cache для nvm
nvm set-colors [<color codes>] Устанавливает 5 цветов для текста посредством формата "yMeBg". Опция доступна при поддержке формата.
Основные цвета:
b y g r e
Коды цветов:
r/R = red (красный) / (насыщенный красный) bold red
g/G = green (зеленый) / (насыщенный зеленый) bold green
b/B = blue (голубой) / (насыщенный голубой) bold blue
c/C = cyan (бирюзовый) / (насыщенный бирюзовый) bold cyan
m/M = magenta (пурпурный) / (насыщенный пурпурный) bold magenta
y/Y = yellow (желтый) / (насыщенный желтый) bold yellow
k/K = black (черный) / (насыщенный черный) bold black
e/W = light grey (светло-серый) / (белый) white

Пример:
nvm install 8.0.0 Устанавливает определенный номер версии
nvm use 8.0 Использует последнюю доступную версию 8.0.x
nvm run 6.10.3 app.js Запускает app.js с помощью Node 6.10.3
nvm exec 4.8.3 node app.js Запускает `node app.js` с PATH, указывающим на Node 4.8.3
nvm alias default 8.1.0 Устанавливает версию Node по умолчанию для оболочки
nvm alias default node Всегда устанавливает по умолчанию последнюю доступную версию Node для оболочки

nvm install node Устанавливает последнюю доступную версию
nvm use node Использует последнюю версию
nvm install --lts Устанавливает последнюю версию LTS
nvm use --lts Использует последнюю версию LTS

nvm set-colors cgYmW Устанавливает цвета для текста: бирюзовый, зеленый, насыщенный желтый, пурпурный и белый

Примечание:
Для извлечения, удаления и деинсталяции nvm просто удалите папку `$NVM_DIR` (обычно `~/.nvm`)

Обновление NVM

nvm используется для обновления Node.js и npm. А как же обновить сам nvm?

Попробуем это сделать.

До обновления у нас установлен nvm 0.39.0:

% nvm --version
0.39.0

Обновляем его до версии 0.39.2:

% curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.2/install.sh | bash
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 15916 100 15916 0 0 61689 0 --:--:-- --:--:-- --:--:-- 61689
=> nvm уже установлен в /Users/jenniferfu/.nvm, попытка обновления с помощью git
=> => Сжатие и очистка репозитория git

=> исходная строка nvm уже в /Users/jenniferfu/.zshrc
=> исходная строка bash_completion уже в /Users/jenniferfu/.zshrc
=> Закройте и вновь откройте терминал, чтобы начать использовать nvm, или запустите следующий код, чтобы воспользоваться им сейчас::

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

Как следует из вывода (строка 10), для работы с новой версией нужно закрыть и вновь открыть терминал: 

% nvm --version
0.39.2

Заключение 

nvm упрощает управление версиями Node.js и npm. Мы можем перейти на Node.js 19 и npm 9, а также на любые предыдущие версии. 

Читайте также:

Читайте нас в TelegramVK и Дзен


Перевод статьи Jennifer Fu: How To Use NVM To Manage Node.js 19 and NPM 9

Предыдущая статьяВзгляд в будущее: перспективы развития и влияния ИИ на изобразительное искусство и повседневную жизнь 
Следующая статьяОсновы создания сайтов