NPM
npm (аббревиатура от англ. Node Package Manager) — стандартный менеджер пакетов для экосистемы JavaScript, устанавливающийся вместе с платформой Node.js. Инструмент автоматизирует процесс установки, обновления, публикации и аудита модулей, облегчая управление зависимостями и обмен кодом между разработчиками[2][3].
Общие сведения
| npm | |
|---|---|
| англ. Node Package Manager | |
| Область использования | JavaScript |
| Дата появления | 2010[1] |
| Автор понятия | Исаак Шлютер |
Определение
npm — это комплексное решение для:
- установки локальных и глобальных пакетов (команда
npm install); - управления версиями зависимостей и автоматического ведения файла
package.json; - публикации собственных модулей в открытом либо частном реестре (
npm publish); - запуска пользовательских сценариев (npm-скриптов) из раздела
"scripts"; - выполнения аудита безопасности зависимостей (
npm audit)[4][5].
Создание и ранние годы (2009—2020)
Идея создания npm принадлежит Исааку Шлютеру, который начал разработку проекта в 2009 году. На тот момент он работал в компании Yahoo и, будучи знакомым с внутренними менеджерами пакетов, решил создать аналогичный инструмент для молодой на тот момент платформы Node.js[6]. Первая версия проекта появилась на GitHub в сентябре 2009 года, а первый публичный релиз состоялся 12 января 2010 года, примерно в то же время, когда Шлютер покинул Yahoo, чтобы сосредоточиться на серверном JavaScript[6].
В течение первых четырёх лет npm существовал как личный проект Шлютера, работавший на пожертвованной инфраструктуре[7]. В период с сентября 2010 по декабрь 2013 года Шлютер работал в компании Joyent, где возглавил проект Node.js после ухода его основателя Райана Даля[8]. Для управления растущим проектом и его коммерческой поддержки в 2014 году в Окленде (Калифорния) была основана компания npm, Inc[8].
В марте 2020 года компания npm, Inc. была приобретена GitHub, который, в свою очередь, является дочерней компанией Microsoft[9][10].
Развитие после приобретения GitHub (с 2020 года)
После приобретения npm, Inc. компанией GitHub в марте 2020 года развитие менеджера пакетов было сфокусировано на улучшении производительности, усилении безопасности и более тесной интеграции в экосистему GitHub. Начиная с 2021 года был выпущен ряд мажорных версий с ключевыми нововведениями.
- npm v7 (общедоступен с февраля 2021 года) — одно из самых значительных обновлений. Ключевым нововведением стала нативная поддержка Workspaces (рабочих областей) для управления монорепозиториями[11]. Также была изменена логика работы с зависимостями: npm начал автоматически устанавливать peer-зависимости (англ. peerDependencies), чтобы уменьшить количество конфликтов. Был представлен новый, обратно совместимый формат файла `package-lock.json` (v2), обеспечивающий более детерминированные и воспроизводимые сборки[12][13].
- npm v8 (октябрь 2021 года) — преимущественно технический релиз, в котором была прекращена поддержка устаревших версий Node.js (например, Node 10). В минорных версиях была добавлена функция `overrides`, позволяющая принудительно использовать определённую версию зависимости во всём дереве[14].
- npm v9 (ноябрь 2022 года) — релиз был направлен на стандартизацию настроек и повышение безопасности. Были улучшены механизмы работы в Docker-контейнерах, ужесточены требования к настройкам аутентификации (теперь их необходимо привязывать к конкретному реестру) и добавлена команда `npm config fix` для исправления файлов конфигурации[15][16].
- npm v10 (август-октябрь 2023 года) — продолжил курс на модернизацию, прекратив поддержку Node.js 14 и 16. Были добавлены флаги `--cpu` и `--os`, позволяющие переопределять платформу и архитектуру при установке пакетов для кросс-платформенных сборок[17][18].
- npm v11 (декабрь 2024 года) — ввёл более строгие правила публикации, чтобы предотвратить случайное присвоение тега `latest` предварительным версиям пакетов. Была добавлена команда `npm undeprecate` и удалена устаревшая команда `npm hook`[19].
К 2025 году в экосистеме окончательно утвердились ES-модули (ESM) как стандарт для публикации пакетов, вытесняя устаревший формат CommonJS[20].
Усиление безопасности
Одним из главных направлений работы после приобретения стало повышение безопасности экосистемы. В ноябре 2021 года GitHub анонсировал введение обязательной двухфакторной аутентификации (2FA) для мейнтейнеров и администраторов популярных пакетов для защиты от захвата учётных записей. Кроме того, с 4 октября 2021 года все подключения к реестру npm в обязательном порядке должны использовать протокол TLS 1.2 или выше. Также были улучшены системы автоматического обнаружения вредоносного ПО[21].
Значимые инциденты
Инцидент с пакетом «everything» В начале 2024 года один из разработчиков опубликовал в реестре пакет под названием «everything», который в качестве зависимостей включал все общедоступные пакеты npm. Этот эксперимент выявил уязвимости в работе реестра: он заблокировал возможность снятия с публикации тысяч пакетов (согласно правилам, пакет нельзя удалить, если от него зависят другие) и продемонстрировал потенциал для DoS-атак из-за огромного потребления ресурсов при попытке установки[19].
Атака «Великое ограбление NPM» В сентябре 2025 года произошла одна из крупнейших атак на цепочку поставок в истории npm. 8 сентября злоумышленники разослали фишинговые письма разработчикам, маскируясь под службу поддержки npm, и с помощью поддельного домена `npmjs.help` получили учётные данные одного из мейнтейнеров популярных пакетов[22][23]. В результате были скомпрометированы и переопубликованы с вредоносным кодом более 18 пакетов, включая `chalk`, `debug` и `strip-ansi`, суммарное количество еженедельных загрузок которых превышало 2,6 миллиарда[24]. Вредоносное ПО было нацелено на кражу криптовалют путём подмены адресов в транзакциях[23]. Позже, 17 сентября, в скомпрометированные пакеты был внедрён самораспространяющийся червь, который искал учётные данные для доступа к npm и другим сервисам для дальнейшего заражения зависимостей[25].
Структурные элементы NPM
НPM включает три ключевых компонента[26][27]:
- CLI (Command-Line Interface) — утилита командной строки, через которую выполняются все операции с пакетами.
- Registry (реестр) — централизованная база, содержащая метаданные и архивы миллионов JavaScript-пакетов.
- Website (npmjs.com) — веб-портал для поиска модулей, управления организациями и настройкой видимости пакетов.
Дополнительным элементом любого проекта является файл package.json, фиксирующий метаданные проекта и список зависимостей.
NPM CLI
CLI устанавливается вместе с Node.js и предоставляет десятки команд; ключевые из них[28]:
npm init— инициализация проекта;npm install,npm uninstall,npm update— управление зависимостями;npm run <script>— запуск npm-скриптов;npm version— изменение версии пакета;npm publishиnpm unpublish— публикация и отзыв пакетов;npm view,npm search,npm outdated— получение информации о модулях и их актуальности.
С развитием npm его интерфейс командной строки получал новые возможности и изменения:
- v7: Команда
npxбыла переписана для использованияnpm exec, что сделало её работу более предсказуемой. - v9: Добавлена команда
npm config fixдля автоматической проверки и исправления файлов конфигурации. - v10: В команду
npm installдобавлены флаги--cpuи--os, позволяющие указывать целевую платформу и архитектуру при кросс-платформенных сборках. - v11: Произошёл ряд значительных изменений: была удалена устаревшая команда
npm hook, добавлена новая командаnpm undeprecateдля снятия с пакета метки «устаревший», а также изменилось поведениеnpm audit, который перестал использовать резервные эндпоинты. В минорной версии 11.2.0 (2025 год) появилась командаnpm cache npxдля управления кэшем npx[29].
Реестр npm
По умолчанию CLI обращается к публичному реестру по адресу https://registry.npmjs.org.
Особенности реестра:
- dist-tags — текстовые алиасы версий (по умолчанию –
latest); - scopes — пространства имён вида
@org/пакет, применяемые для группировки и публикации приватных модулей; - поддержка как публичных, так и приватных пакетов, доступных только определённым пользователям;
- REST API для получения метаданных (
/package), статистики загрузок и управления тегами.
Безопасность и инциденты
Централизованная природа реестра делает его ключевой целью для атак на цепочку поставок и местом выявления системных уязвимостей. Среди наиболее значимых инцидентов:
- Инцидент с пакетом «everything» (начало 2024 года): Разработчик опубликовал в реестре пакет, который в качестве зависимостей включал все общедоступные пакеты npm. Этот эксперимент выявил уязвимости в работе реестра: он заблокировал возможность снятия с публикации тысяч пакетов (согласно правилам, пакет нельзя удалить, если от него зависят другие) и продемонстрировал потенциал для DoS-атак из-за огромного потребления ресурсов при попытке установки.
- Атака «Великое ограбление NPM» (сентябрь 2025 года): Одна из крупнейших атак на цепочку поставок, в ходе которой злоумышленники, получив доступ к учётной записи мейнтейнера через фишинг, переопубликовали более 18 популярных пакетов (включая `chalk` и `debug`) с вредоносным кодом. Суммарное количество еженедельных загрузок скомпрометированных пакетов превышало 2,6 миллиарда. Вредоносное ПО было нацелено на кражу криптовалют, а позже было дополнено самораспространяющимся червём.
Файлы проекта и блокировки версий (package.json, package-lock.json)
- package.json — «манифест» проекта, содержащий поля
name,version,scripts,dependenciesи т. д[30]. - package-lock.json (появился в npm 5) фиксирует точные версии всех (включая транзитивные) зависимостей, обеспечивая детерминируемые сборки. С выходом npm v7 формат файла был обновлён до версии 2, что принесло ряд ключевых улучшений:
- Детерминированные сборки и производительность. Формат v2 содержит всю информацию, необходимую для полного построения дерева зависимостей, что позволяет npm пропустить чтение файлов
package.jsonиз папок модулей и значительно ускорить установку[31]. - Поддержка Workspaces. Новый формат был разработан для нативной поддержки монорепозиториев, позволяя одному файлу
package-lock.jsonв корне проекта управлять зависимостями всех вложенных пакетов. - Обратная совместимость. Файлы формата v2 обратно совместимы с npm 6, что обеспечивает плавный переход для команд, использующих разные версии инструмента[32]. Существует также формат v3, который используется для внутреннего «скрытого» lock-файла (
node_modules/.package-lock.json) и не имеет обратной совместимости[31]. - Структурные изменения. Вместо вложенной структуры зависимостей (как в v1) в v2 используется плоский список в поле
packages. Это упрощает отслеживание изменений в системах контроля версий и делает файл более читаемым[33][34].
- Детерминированные сборки и производительность. Формат v2 содержит всю информацию, необходимую для полного построения дерева зависимостей, что позволяет npm пропустить чтение файлов
Этапы работы
Типовой рабочий цикл при использовании npm включает пять последовательных этапов:
- Инициализация проекта — генерация
package.json. - Установка зависимостей —
npm install. - Разработка и запуск скриптов —
npm run <script>. - Тестирование и аудит —
npm test,npm audit. - Публикация/обновление пакета —
npm version,npm publish[35].
Команда npm init запускает интерактивный опрос с вопросами о названии, версии, описании, точке входа и т.д. Для автоматического принятия значений по умолчанию используется флаг -y[36].
Пример сгенерированного файла:
{
"name": "my-awesome-project",
"version": "1.0.0",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"license": "ISC"
}
С выходом npm v11 процесс инициализации был обновлён: в интерактивном режиме появился новый вопрос о типе создаваемого проекта. В версии 11.2.0 (2025 год) был добавлен флаг --init-type, позволяющий указать тип проекта напрямую.
Установка зависимостей
- Локально:
npm install <pkg>добавит пакет в разделdependencies(илиdevDependenciesпри флаге-D). - Глобально:
npm install -g <pkg>делает модуль доступным из любой директории. - Дополнительные разделы:
optionalDependencies— установка необязательна;peerDependencies— версии, с которыми пакет совместим.
- Источники: реестр npm, Git-репозиторий, URL на tarball[37].
Публикация пакета
Порядок действий:
- Проверить заполненность ключевых полей
package.json(name,version,main,license). - Аутентифицироваться:
npm login. - Выполнить
npm publish. Для scoped-пакета, публикуемого публично, добавить--access public. - При необходимости указать тег (
--tag beta).
С выходом npm v11 (декабрь 2024 года) процесс публикации был ужесточён для повышения надёжности. Было введено обязательное указание тега (например, --tag beta) при публикации предварительных версий (pre-release), чтобы предотвратить их случайное попадание под тег latest. Кроме того, была полностью удалена устаревшая команда npm hook для управления веб-хуками.
Обновление и управление версиями
npm update— обновляет зависимости в рамках диапазонов, указанных вpackage.json.npm outdatedотображает текущую, желаемую и последнюю доступную версии каждого пакета[38].npm version [patch|minor|major]инкрементирует номер версии проекта и создаёт Git-тег.
Управление скриптами
Сценарии задаются в разделе "scripts" файла package.json.
Доступны системные хуки pre*/post* (например, preinstall, postversion) и пользовательские скрипты, запускаемые через npm run <имя>[28].
Преимущества
- Доступ к крупнейшему реестру JavaScript-пакетов[39].
- Автоматическое управление зависимостями и их версиями.
- Воспроизводимые сборки благодаря
package-lock.json. - Возможность публикации собственных библиотек.
- Интеграция с инструментами сборки и CI/CD.
Недостатки
- Большой объём каталога
node_modulesи высокое потребление диска[40]. - Риски безопасности из-за зависимости от стороннего кода.
- Меньшая скорость по сравнению с альтернативными менеджерами (Yarn, pnpm).
- Возможность появления «фантомных» зависимостей при подъёме модулей на верхний уровень дерева.
Сферы применения
npm используется:
- при разработке фронтенд-приложений (React, Angular, Vue);
- в бэкенд-проектах на Node.js (REST-API, микросервисы);
- в инструментах автоматизации (Webpack, Gulp);
- в системах CI/CD для сборки и деплоя;
- для публикации CLI-утилит и библиотек общего назначения[4].
Командная строка (CLI)
Основной способ взаимодействия — консольное приложение npm, доступное после установки Node.js.
Графические интерфейсы
Альтернативные реестры
Интеграция с системами сборки и CI/CD
npm широко применяется в:
Примечания
- ↑ Web Dev Origins: The History of npm. DEV Community. Дата обращения: 29 июля 2024.
- ↑ Что такое npm: гайд по Node Package Manager для начинающих. Proglib.io. Дата обращения: 20 июня 2025.
- ↑ npm — что это такое и как использовать. Highload.tech. Дата обращения: 20 июня 2025.
- ↑ 1 2 Полный гайд по менеджеру пакетов Node.js. Skillfactory. Дата обращения: 20 июня 2025.
- ↑ Что такое npm. Skillbox. Дата обращения: 20 июня 2025.
- ↑ 1 2 Interview with Isaac Z. Schlueter, CEO of npm. Increment. Дата обращения: 29 июля 2024.
- ↑ Episode 38: npm with Isaac Schlueter. Open Source Underdogs. Дата обращения: 29 июля 2024.
- ↑ 1 2 Isaac Z. Schlueter's Resume. izs.me. Дата обращения: 29 июля 2024.
- ↑ GitHub купила npm — один из крупнейших сервисов для разработки на JavaScript. vc.ru (16 марта 2020). Дата обращения: 29 июля 2024.
- ↑ GitHub покупает npm. Xakep.ru (17 марта 2020). Дата обращения: 29 июля 2024.
- ↑ What’s new in npm v7? LogRocket Blog. Дата обращения: 29 июля 2024.
- ↑ npm v7 is now generally available. The GitHub Blog (2 февраля 2021). Дата обращения: 29 июля 2024.
- ↑ Presenting v7.0.0 of the npm CLI. The GitHub Blog (6 октября 2020). Дата обращения: 29 июля 2024.
- ↑ What's New in npm 8. NodeSource. Дата обращения: 29 июля 2024.
- ↑ npm CLI v9 is now generally available. GitHub Changelog (9 ноября 2022). Дата обращения: 29 июля 2024.
- ↑ npm v9.0.0 released. GitHub Changelog (24 октября 2022). Дата обращения: 29 июля 2024.
- ↑ Release v10.0.0. GitClear. Дата обращения: 29 июля 2024.
- ↑ Release v10.1.0. GitClear. Дата обращения: 29 июля 2024.
- ↑ 1 2 Release v11.0.0. GitClear. Дата обращения: 29 июля 2024.
- ↑ Node.js в 2025: тренды и прогнозы. Habr (3 июня 2025). Дата обращения: 29 июля 2024.
- ↑ GitHub’s commitment to npm ecosystem security. The GitHub Blog (15 ноября 2021). Дата обращения: 29 июля 2024.
- ↑ «Великое ограбление NPM»: фишинг и вредоносная цепочка поставок JavaScript. CISO CLUB (9 сентября 2025). Дата обращения: 29 июля 2024.
- ↑ 1 2 Троянизированные пакеты npm воруют криптовалюту. Kaspersky Daily (10 сентября 2025). Дата обращения: 29 июля 2024.
- ↑ Масштабная атака на цепочку поставок затронула 18 популярных пакетов NPM. Anti-Malware.ru (9 сентября 2025). Дата обращения: 29 июля 2024.
- ↑ В атакованные пакеты в npm добавлен самораспространяющийся червь. OpenNET (17 сентября 2025). Дата обращения: 29 июля 2024.
- ↑ What is npm? Hostinger Tutorials. Дата обращения: 20 июня 2025.
- ↑ What is npm? HeyNode. Дата обращения: 20 июня 2025.
- ↑ 1 2 npm Documentation. npm Docs. Дата обращения: 20 июня 2025.
- ↑ Release v11.2.0. GitClear. Дата обращения: 29 июля 2024.
- ↑ Introduction to npm. Node.js. Дата обращения: 20 июня 2025.
- ↑ 1 2 package-lock.json. npm Docs. Дата обращения: 29 июля 2024.
- ↑ Разбираемся в package-lock.json и npm ci. Habr (25 июля 2022). Дата обращения: 29 июля 2024.
- ↑ Catching up with package-lock.json changes in npm v7. Nitay Neeman's Blog. Дата обращения: 29 июля 2024.
- ↑ Что нового в npm 7. Habr (7 августа 2020). Дата обращения: 29 июля 2024.
- ↑ npm publish. npm Docs. Дата обращения: 20 июня 2025.
- ↑ npm init. GeeksforGeeks. Дата обращения: 20 июня 2025.
- ↑ npm install. npm Docs. Дата обращения: 20 июня 2025.
- ↑ npm outdated. npm Docs. Дата обращения: 20 июня 2025.
- ↑ Что такое npm? Builtin. Дата обращения: 20 июня 2025.
- ↑ Проблемы скорости npm. Habr. Дата обращения: 20 июня 2025.
- ↑ npm-gui. npm. Дата обращения: 20 июня 2025.
- ↑ NDM — Node Desktop Manager. NDM Project. Дата обращения: 20 июня 2025.
- ↑ Управление npm-пакетами в Visual Studio. Microsoft Docs. Дата обращения: 20 июня 2025.
- ↑ Verdaccio documentation. Verdaccio. Дата обращения: 20 июня 2025.
- ↑ Artifactory npm registry. JFrog. Дата обращения: 20 июня 2025.
- ↑ Nexus Repository npm registry. Sonatype. Дата обращения: 20 июня 2025.
- ↑ GitHub Actions. GitHub Docs. Дата обращения: 20 июня 2025.
- ↑ GitLab CI/CD. GitLab Docs. Дата обращения: 20 июня 2025.
- ↑ Jenkins Documentation. Jenkins. Дата обращения: 20 июня 2025.