Менеджер пакетов npm
npm (сокращение от Node Package Manager) — это менеджер пакетов для среды выполнения JavaScript Node.js, а также крупнейший в мире реестр программного обеспечения с открытым исходным кодом. npm позволяет разработчикам устанавливать, обновлять, настраивать и удалять зависимости (библиотеки, фреймворки, утилиты) в проектах на JavaScript, а также публиковать собственные пакеты. Он является стандартным инструментом управления модулями в экосистеме Node.js.
История
npm был создан в 2009 году американским разработчиком Айзеком З. Шлютером (Isaac Z. Schlueter) как часть сообщества Node.js. Первоначально проект размещался на хостинге Joyent, где также разрабатывался Node.js. В 2010 году Шлютер основал компанию npm, Inc. для поддержки и развития реестра.
Ключевые вехи развития:
- 2010 — выход первой стабильной версии npm (1.0).
- 2014 — npm становится стандартным менеджером пакетов, поставляемым вместе с установщиком Node.js.
- 2015 — реестр npm достигает отметки в 200 000 пакетов.
- 2018 — npm, Inc. приобретается компанией GitHub (принадлежащей Microsoft).
- 2020 — выпуск npm версии 7, в которой появилась поддержка рабочих пространств (workspaces) и автоматическая установка зависимостей peerDependencies.
- 2022 — реестр npm превышает 2 миллиона пакетов, что делает его крупнейшим хранилищем программного кода в мире.
Архитектура и принцип работы
npm состоит из двух основных компонентов:
- Клиентская часть (CLI) — программа командной строки
npm, которая устанавливается вместе с Node.js. Она взаимодействует с реестром, управляет локальными файламиpackage.jsonиpackage-lock.json, а также обрабатывает зависимости. - Реестр (Registry) — централизованное облачное хранилище пакетов, доступное по адресу
https://registry.npmjs.org/package.json`.. Каждый пакет представляет собой архив (tar-файл) с кодом, метаданными (версия, описание, автор, зависимости) и файлом
Файловая структура
При инициализации проекта с помощью команды npm init создается файл package.json. Он содержит метаданные проекта и список зависимостей в формате JSON. Ключевые поля:
name— имя пакета.version— версия по семантическому версионированию (SemVer).dependencies— основные зависимости, необходимые для работы приложения в production.devDependencies— зависимости, используемые только для разработки (тестирование, сборка).scripts— команды, которые можно запускать черезnpm run <имя>.
Файл package-lock.json (или npm-shrinkwrap.json) фиксирует точные версии всех установленных зависимостей, включая транзитивные, обеспечивая воспроизводимость сборки.
Установка пакетов
Команда npm install <имя_пакета> загружает пакет из реестра и помещает его в папку node_modules. При этом npm рекурсивно разрешает зависимости: для каждого пакета загружаются его собственные зависимости, и так далее, пока не будет построено полное дерево зависимостей. Начиная с npm версии 3, используется плоская структура папок (по возможности), чтобы избежать дублирования.
Классификация пакетов
Пакеты в npm можно разделить по типу использования:
- Глобальные пакеты — устанавливаются с флагом
-g(например,npm install -g typescript). Они доступны из любой директории системы и обычно используются для утилит командной строки (линтеры, сборщики, генераторы). - Локальные пакеты — устанавливаются в конкретный проект и перечисляются в
package.json. Они делятся на: - production-зависимости (
dependencies) — необходимы для работы приложения в продакшене. - dev-зависимости (
devDependencies) — используются только на этапе разработки. - peer-зависимости (
peerDependencies) — указывают на совместимость с другими пакетами, но не устанавливаются автоматически (например, плагины для фреймворков). - опциональные зависимости (
optionalDependencies) — устанавливаются, если возможно, но их отсутствие не ломает сборку.
Команды и возможности
Основные команды npm CLI:
| Команда | Описание |
|---|---|
npm init | Создает файл package.json в текущей директории. |
npm install <пакет> | Устанавливает пакет и добавляет его в dependencies. |
npm install --save-dev <пакет> | Устанавливает пакет в devDependencies. |
npm uninstall <пакет> | Удаляет пакет и обновляет package.json. |
npm update | Обновляет все пакеты до последних версий в рамках семантического версионирования. |
npm run <скрипт> | Запускает пользовательский скрипт, определенный в package.json. |
npm publish | Публикует пакет в реестре (требуется авторизация). |
npm audit | Проверяет зависимости на наличие известных уязвимостей. |
npm ci | Устанавливает зависимости строго по package-lock.json (для CI/CD). |
Семантическое версионирование (SemVer)
npm использует семантическое версионирование в формате MAJOR.MINOR.PATCH:
- MAJOR — несовместимые изменения API.
- MINOR — добавление новой функциональности с обратной совместимостью.
- PATCH — исправление ошибок с обратной совместимостью.
В package.json версии указываются с диапазонами:
^1.2.3— разрешает обновления до1.x.x(но не до2.0.0).~1.2.3— разрешает обновления только1.2.x.1.2.3— фиксированная версия.*— любая версия.
Безопасность и уязвимости
Реестр npm является частой мишенью для атак, связанных с внедрением вредоносного кода в популярные пакеты. Для снижения рисков npm предоставляет:
- Команду
npm audit— сканирует дерево зависимостей и сообщает об известных уязвимостях (CVE). - Автоматические исправления —
npm audit fixпытается обновить уязвимые пакеты до безопасных версий. - Двухфакторную аутентификацию (2FA) — для публикации пакетов.
- Политики безопасности — npm, Inc. (организация, управляющая реестром) удаляет вредоносные пакеты по запросу сообщества или после обнаружения.
Известные инциденты безопасности включают:
- 2018 — атака на пакет
event-stream, в который был добавлен вредоносный код для кражи биткойнов. - 2021 — инцидент с пакетом
ua-parser-js, который был скомпрометирован и содержал майнер криптовалют.
Альтернативы и конкуренты
Помимо npm, существуют другие менеджеры пакетов для Node.js:
- Yarn — разработан Facebook (организация Meta признана экстремистской и запрещена в РФ). Отличается более быстрой установкой за счет кэширования и параллельной загрузки.
- pnpm — использует жесткие ссылки для экономии места на диске и ускорения установки.
- Bun — современный рантайм, включающий встроенный менеджер пакетов, ориентированный на скорость.
Все эти инструменты совместимы с реестром npm, но используют собственные форматы lock-файлов и алгоритмы разрешения зависимостей.
Применение в России
В России npm широко используется в веб-разработке, особенно в проектах на Node.js, React, Vue.js и Angular. Российские разработчики публикуют пакеты в реестре npm, в том числе библиотеки для работы с государственными информационными системами (например, для работы с электронной подписью или API сервисов). Однако из-за блокировок некоторых сервисов (например, GitHub, который принадлежит Microsoft) и замедления доступа к зарубежным ресурсам, в 2022–2023 годах наблюдался рост использования зеркал реестра (например, npm.yandex-team.ru или registry.npmmirror.com).
Критика
Основные претензии к npm:
- Размер реестра — наличие миллионов пакетов, многие из которых дублируют функциональность или содержат минимальный код (например, пакет
is-odd). - Зависимости — типичный проект может содержать сотни или тысячи транзитивных зависимостей, что увеличивает время установки и поверхность атаки.
- Производительность — npm медленнее альтернатив (Yarn, pnpm) при установке большого количества пакетов.
- Централизация — зависимость от одного реестра, управляемого коммерческой компанией (Microsoft/GitHub).
Источники
- Официальная документация npm: docs.npmjs.com
- Isaac Z. Schlueter. «The npm Blog» (2009–2020)
- «Node.js in Action» (2-е издание), Mike Cantelon и др., Manning Publications, 2017
- «npm: The Complete Guide», Packt Publishing, 2020
- Отчеты о безопасности npm: npmjs.com/advisories
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →