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

Менеджер пакетов 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 состоит из двух основных компонентов:

  1. Клиентская часть (CLI) — программа командной строки npm, которая устанавливается вместе с Node.js. Она взаимодействует с реестром, управляет локальными файлами package.json и package-lock.json, а также обрабатывает зависимости.
  2. Реестр (Registry) — централизованное облачное хранилище пакетов, доступное по адресу https://registry.npmjs.org/. Каждый пакет представляет собой архив (tar-файл) с кодом, метаданными (версия, описание, автор, зависимости) и файлом package.json`.

Файловая структура

При инициализации проекта с помощью команды 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 →