Открыть сервисСервис

NPM — менеджер пакетов Node.js

NPM (Node Package Manager) — программный инструмент командной строки и одноимённый онлайн-реестр пакетов для JavaScript-среды Node.js. Служит для установки, обновления, публикации и управления зависимостями стороннего кода. Входит в комплект поставки Node.js начиная с версии 0.6.1 (2012 год) и на 2024 год остаётся крупнейшим реестром программных пакетов в мире: в нём опубликовано свыше 2 миллионов пакетов.

История

NPM разработал в 2010 году американский разработчик Айзек Шлютер (Isaac Z. Schlueter), один из первых участников проекта Node.js. Идея состояла в том, чтобы повторить для JavaScript модель управления зависимостями, уже привычную для экосистем Ruby (RubyGems) и Python (pip). Первая публичная версия вышла в январе 2010 года.

В 2014 году в сообществе Node.js произошёл раскол вокруг управления проектом: часть разработчиков, недовольных решением корпоративных спонсоров о смене лидера проекта, создала форк io.js. В 2015 годах проекты объединились в Node.js Foundation, а NPM Inc., компания, стоящая за реестром, получила отдельное финансирование. В 2020 году NPM Inc. приобрела корпорация GitHub, входящая в состав Microsoft; с тех пор NPM работает как часть экосистемы GitHub.

Основные понятия

Работа NPM строится вокруг трёх ключевых сущностей:

  • Пакет — каталог с JavaScript-кодом и файлом package.json, описывающим метаданные: имя, версию, автора, лицензию и список зависимостей.
  • Реестр — центральный сервер (registry.npmjs.org), где хранятся и раздаются публичные пакеты.
  • package.json — конфигурационный файл проекта, определяющий его свойства и связи с другими пакетами.

Версии пакетов в NPM следуют схеме семантического версионирования (SemVer) формата MAJOR.MINOR.PATCH. Изменения в API отражаются в старшем разряде, обратно совместимые улучшения — в среднем, исправления ошибок — в младшем.

Основные команды

NPM управляется через командную строку. Наиболее употребимые команды:

КомандаНазначение
npm initСоздание нового файла package.json
npm install <пакет>Установка пакета в проект
npm install -g <пакет>Глобальная установка пакета
npm updateОбновление зависимостей
npm uninstall <пакет>Удаление пакета
npm publishПубликация пакета в реестре
npm run <скрипт>Запуск скрипта из package.json
npm auditПроверка зависимостей на известные уязвимости

При установке пакета NPM рекурсивно скачивает все его зависимости, формируя в каталоге проекта директорию node_modules. С версии 5 (2017 год) для ускорения повторных установок используется кэш, а зависимости фиксируются в файле package-lock.json, что обеспечивает воспроизводимость сборки.

Альтернативы

Наиболее известные альтернативы NPM:

  • Yarn — менеджер пакетов, разработанный Facebook (Meta — организация признана экстремистской и запрещена в РФ) и представленный в 2016 году; позже перешёл на использование реестра NPM.
  • pnpm — менеджер, использующий жёсткие ссылки для экономии дискового пространства и ускорения установки.
  • cnpm — зеркало реестра NPM, обслуживаемое в Китае для локальных пользователей.

Критика и проблемы

NPM неоднократно становился объектом критики. Основные претензии связаны с моделью доверия: любой пользователь может опубликовать пакет под свободным именем, что приводит к случаям «перехвата» пакетов (typosquatting) и вредоносного кода. Известны инциденты, когда вредоносные обновления пакетов event-stream (2018) и ua-parser-js (2021) попадали к миллионам пользователей.

Другая проблема — «зависимость от зависимостей»: современный JavaScript-проект может тянуть тысячи транзитивных пакетов, что усложняет аудит безопасности и увеличивает время установки. Для борьбы с этим внедряются инструменты блокировки зависимостей и аудита лицензий.

Источники:

  • Документация NPM (docs.npmjs.com)
  • Node.js Documentation, раздел «npm»
  • Schlueter I. Z. «How NPM Works» (доклад NodeConf, 2012)
  • Ruohonen J. «A History of NPM» // Software Engineering Research and Practice, 2019
  • Протоколы сообщества Node.js Foundation (2015—2020)
Заметили ошибку или не согласны с информацией в статье? Напишите нам support@bfometr.ru