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]:

  1. CLI (Command-Line Interface) — утилита командной строки, через которую выполняются все операции с пакетами.
  2. Registry (реестр) — централизованная база, содержащая метаданные и архивы миллионов JavaScript-пакетов.
  3. 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].

Этапы работы

Типовой рабочий цикл при использовании npm включает пять последовательных этапов:

  1. Инициализация проекта — генерация package.json.
  2. Установка зависимостейnpm install.
  3. Разработка и запуск скриптовnpm run <script>.
  4. Тестирование и аудитnpm test, npm audit.
  5. Публикация/обновление пакета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].

Публикация пакета

Порядок действий:

  1. Проверить заполненность ключевых полей package.json (name, version, main, license).
  2. Аутентифицироваться: npm login.
  3. Выполнить npm publish. Для scoped-пакета, публикуемого публично, добавить --access public.
  4. При необходимости указать тег (--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.

Графические интерфейсы

  • npm-gui — веб-интерфейс для установки, обновления и удаления зависимостей[41].
  • NDM (Node Desktop Manager) — десктопное приложение на Electron для управления пакетами[42].
  • Интеграция с IDE — например, Visual Studio предоставляет встроенную панель управления пакета­ми[43].

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

  • Verdaccio — локальный прокси-реестр с кэшированием[44].
  • JFrog Artifactory — универсальный менеджер артефактов[45].
  • Sonatype Nexus[46], GitHub Package Registry, GitLab Package Registry, AWS CodeArtifact.

Интеграция с системами сборки и CI/CD

npm широко применяется в:

  • GitHub Actions — установка зависимостей через npm ci, кэширование и автоматическая публикация[47];
  • GitLab CI/CD — использование образов node: и артефактов node_modules[48];
  • Jenkins — пайплайны с этапами npm install, npm test, npm run build[49].

Примечания

  1. Web Dev Origins: The History of npm. DEV Community. Дата обращения: 29 июля 2024.
  2. Что такое npm: гайд по Node Package Manager для начинающих. Proglib.io. Дата обращения: 20 июня 2025.
  3. npm — что это такое и как использовать. Highload.tech. Дата обращения: 20 июня 2025.
  4. 1 2 Полный гайд по менеджеру пакетов Node.js. Skillfactory. Дата обращения: 20 июня 2025.
  5. Что такое npm. Skillbox. Дата обращения: 20 июня 2025.
  6. 1 2 Interview with Isaac Z. Schlueter, CEO of npm. Increment. Дата обращения: 29 июля 2024.
  7. Episode 38: npm with Isaac Schlueter. Open Source Underdogs. Дата обращения: 29 июля 2024.
  8. 1 2 Isaac Z. Schlueter's Resume. izs.me. Дата обращения: 29 июля 2024.
  9. GitHub купила npm — один из крупнейших сервисов для разработки на JavaScript. vc.ru (16 марта 2020). Дата обращения: 29 июля 2024.
  10. GitHub покупает npm. Xakep.ru (17 марта 2020). Дата обращения: 29 июля 2024.
  11. What’s new in npm v7? LogRocket Blog. Дата обращения: 29 июля 2024.
  12. npm v7 is now generally available. The GitHub Blog (2 февраля 2021). Дата обращения: 29 июля 2024.
  13. Presenting v7.0.0 of the npm CLI. The GitHub Blog (6 октября 2020). Дата обращения: 29 июля 2024.
  14. What's New in npm 8. NodeSource. Дата обращения: 29 июля 2024.
  15. npm CLI v9 is now generally available. GitHub Changelog (9 ноября 2022). Дата обращения: 29 июля 2024.
  16. npm v9.0.0 released. GitHub Changelog (24 октября 2022). Дата обращения: 29 июля 2024.
  17. Release v10.0.0. GitClear. Дата обращения: 29 июля 2024.
  18. Release v10.1.0. GitClear. Дата обращения: 29 июля 2024.
  19. 1 2 Release v11.0.0. GitClear. Дата обращения: 29 июля 2024.
  20. Node.js в 2025: тренды и прогнозы. Habr (3 июня 2025). Дата обращения: 29 июля 2024.
  21. GitHub’s commitment to npm ecosystem security. The GitHub Blog (15 ноября 2021). Дата обращения: 29 июля 2024.
  22. «Великое ограбление NPM»: фишинг и вредоносная цепочка поставок JavaScript. CISO CLUB (9 сентября 2025). Дата обращения: 29 июля 2024.
  23. 1 2 Троянизированные пакеты npm воруют криптовалюту. Kaspersky Daily (10 сентября 2025). Дата обращения: 29 июля 2024.
  24. Масштабная атака на цепочку поставок затронула 18 популярных пакетов NPM. Anti-Malware.ru (9 сентября 2025). Дата обращения: 29 июля 2024.
  25. В атакованные пакеты в npm добавлен самораспространяющийся червь. OpenNET (17 сентября 2025). Дата обращения: 29 июля 2024.
  26. What is npm? Hostinger Tutorials. Дата обращения: 20 июня 2025.
  27. What is npm? HeyNode. Дата обращения: 20 июня 2025.
  28. 1 2 npm Documentation. npm Docs. Дата обращения: 20 июня 2025.
  29. Release v11.2.0. GitClear. Дата обращения: 29 июля 2024.
  30. Introduction to npm. Node.js. Дата обращения: 20 июня 2025.
  31. 1 2 package-lock.json. npm Docs. Дата обращения: 29 июля 2024.
  32. Разбираемся в package-lock.json и npm ci. Habr (25 июля 2022). Дата обращения: 29 июля 2024.
  33. Catching up with package-lock.json changes in npm v7. Nitay Neeman's Blog. Дата обращения: 29 июля 2024.
  34. Что нового в npm 7. Habr (7 августа 2020). Дата обращения: 29 июля 2024.
  35. npm publish. npm Docs. Дата обращения: 20 июня 2025.
  36. npm init. GeeksforGeeks. Дата обращения: 20 июня 2025.
  37. npm install. npm Docs. Дата обращения: 20 июня 2025.
  38. npm outdated. npm Docs. Дата обращения: 20 июня 2025.
  39. Что такое npm? Builtin. Дата обращения: 20 июня 2025.
  40. Проблемы скорости npm. Habr. Дата обращения: 20 июня 2025.
  41. npm-gui. npm. Дата обращения: 20 июня 2025.
  42. NDM — Node Desktop Manager. NDM Project. Дата обращения: 20 июня 2025.
  43. Управление npm-пакетами в Visual Studio. Microsoft Docs. Дата обращения: 20 июня 2025.
  44. Verdaccio documentation. Verdaccio. Дата обращения: 20 июня 2025.
  45. Artifactory npm registry. JFrog. Дата обращения: 20 июня 2025.
  46. Nexus Repository npm registry. Sonatype. Дата обращения: 20 июня 2025.
  47. GitHub Actions. GitHub Docs. Дата обращения: 20 июня 2025.
  48. GitLab CI/CD. GitLab Docs. Дата обращения: 20 июня 2025.
  49. Jenkins Documentation. Jenkins. Дата обращения: 20 июня 2025.

Категории