npm — это стандартный менеджер пакетов для Node.js.
В сентябре 2022 года в реестре npm числилось более 2,1 миллиона пакетов, что делает его крупнейшим в мире репозиторием кода для одного языка, — и можете быть уверены, что пакет найдётся почти для чего угодно.
Всё начиналось как способ скачивать и управлять зависимостями пакетов Node.js, но со временем npm стал инструментом, который используется и во фронтенд-JavaScript.
Yarn и pnpm — альтернативы npm CLI. Их тоже стоит посмотреть.
npm устанавливает, обновляет и управляет загрузкой зависимостей вашего проекта. Зависимости — это заранее готовые куски кода, например библиотеки и пакеты, которые нужны вашему приложению на Node.js для работы.
Если в проекте есть файл package.json, то, выполнив
npm installnpm установит всё необходимое проекту в папку node_modules, создав её, если её ещё нет.
Установить конкретный пакет тоже можно, выполнив
npm install <package-name>Более того, начиная с npm 5 эта команда добавляет <package-name> в раздел dependencies файла package.json. До версии 5 для этого нужно было добавлять флаг --save.
Часто к этой команде добавляют и другие флаги:
--save-devустанавливает и добавляет запись в раздел devDependencies файлаpackage.json--no-saveустанавливает, но не добавляет запись в раздел dependencies файлаpackage.json--save-optionalустанавливает и добавляет запись в раздел optionalDependencies файлаpackage.json--no-optionalне даёт устанавливать опциональные зависимости
Можно использовать и сокращённые формы флагов:
- -S:
--save - -D:
--save-dev - -O:
--save-optional
Разница между devDependencies и dependencies в том, что первый содержит инструменты для разработки — например, библиотеку для тестирования, — тогда как второй попадает в сборку приложения в production.
Что касается optionalDependencies, разница в том, что сбой сборки такой зависимости не приведёт к сбою установки. Но обрабатывать отсутствие зависимости — ответственность вашей программы. Подробнее об опциональных зависимостях.
Обновление тоже сделано просто — командой
npm updatenpm проверит все пакеты на наличие более новой версии, удовлетворяющей вашим ограничениям по версиям.
Можно указать и конкретный пакет для обновления:
npm update <package-name>Помимо простой загрузки, npm также управляет версионированием, так что вы можете указать любую конкретную версию пакета либо потребовать версию выше или ниже нужной.
Часто оказывается, что библиотека совместима только с определённым мажорным релизом другой библиотеки.
Или баг в последнем релизе библиотеки, всё ещё не исправленный, вызывает проблему.
Указание явной версии библиотеки также помогает держать всех на одной и той же версии пакета, чтобы вся команда работала на одной версии, пока не будет обновлён файл package.json.
Во всех этих случаях версионирование очень помогает, и npm следует стандарту семантического версионирования (semver).
Установить конкретную версию пакета можно командой
npm install <package-name>@<version>Файл package.json поддерживает формат для описания задач командной строки, которые можно запускать через
npm run <task-name>Например:
{
"scripts": {
"start-dev": "node lib/server-development",
"start": "node lib/server-production"
}
}Очень часто эту возможность используют для запуска Webpack:
{
"scripts": {
"watch": "webpack --watch --progress --colors --config webpack.conf.js",
"dev": "webpack --progress --colors --config webpack.conf.js",
"prod": "NODE_ENV=production webpack -p --config webpack.conf.js"
}
}Так что вместо ввода этих длинных команд, которые легко забыть или набрать с опечаткой, можно выполнить
$ npm run watch
$ npm run dev
$ npm run prod