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)
