На этой странице

npm — это стандартный менеджер пакетов для Node.js.

В сентябре 2022 года в реестре npm числилось более 2,1 миллиона пакетов, что делает его крупнейшим в мире репозиторием кода для одного языка, — и можете быть уверены, что пакет найдётся почти для чего угодно.

Всё начиналось как способ скачивать и управлять зависимостями пакетов Node.js, но со временем npm стал инструментом, который используется и во фронтенд-JavaScript.

Yarn и pnpm — альтернативы npm CLI. Их тоже стоит посмотреть.

npm устанавливает, обновляет и управляет загрузкой зависимостей вашего проекта. Зависимости — это заранее готовые куски кода, например библиотеки и пакеты, которые нужны вашему приложению на Node.js для работы.

Если в проекте есть файл package.json, то, выполнив

npm установит всё необходимое проекту в папку node_modules, создав её, если её ещё нет.

Установить конкретный пакет тоже можно, выполнив

Более того, начиная с 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 проверит все пакеты на наличие более новой версии, удовлетворяющей вашим ограничениям по версиям.

Можно указать и конкретный пакет для обновления:

Помимо простой загрузки, npm также управляет версионированием, так что вы можете указать любую конкретную версию пакета либо потребовать версию выше или ниже нужной.

Часто оказывается, что библиотека совместима только с определённым мажорным релизом другой библиотеки.

Или баг в последнем релизе библиотеки, всё ещё не исправленный, вызывает проблему.

Указание явной версии библиотеки также помогает держать всех на одной и той же версии пакета, чтобы вся команда работала на одной версии, пока не будет обновлён файл package.json.

Во всех этих случаях версионирование очень помогает, и npm следует стандарту семантического версионирования (semver).

Установить конкретную версию пакета можно командой

Файл package.json поддерживает формат для описания задач командной строки, которые можно запускать через

Например:

{
  "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