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

npm

npm (сокращение от Node Package Manager) — это стандартный менеджер пакетов для среды выполнения JavaScript Node.js. Он представляет собой систему управления зависимостями, которая позволяет разработчикам устанавливать, обновлять, удалять и публиковать программные модули (пакеты). npm является крупнейшим в мире реестром программного обеспечения с открытым исходным кодом, а также инструментом командной строки для взаимодействия с этим реестром.

История

История npm неразрывно связана с развитием платформы Node.js. В 2009 году разработчик Райан Даль представил Node.js — среду выполнения JavaScript на серверной стороне. Для управления модулями и их зависимостями требовался инструмент, и в том же году Айзек Шлютер, работавший в компании Joyent, создал первую версию npm. Шлютер вдохновлялся менеджерами пакетов из других экосистем, такими как CPAN (Perl) и PEAR (PHP).

Первая стабильная версия npm была выпущена вместе с Node.js 0.6.0 в 2011 году. С этого момента npm стал неотъемлемой частью платформы. В 2014 году была основана компания npm, Inc. для поддержки и развития проекта. В 2020 году компания npm, Inc. была приобретена корпорацией GitHub (принадлежащей Microsoft). С тех пор развитие npm продолжилось в рамках экосистемы GitHub.

Архитектура и компоненты

npm состоит из трёх основных компонентов:

  • Веб-сайт (реестр): Централизованная база данных, доступная по адресу registry.npmjs.org. Она содержит метаданные о всех опубликованных пакетах (название, версия, описание, автор, зависимости и т.д.) и сами файлы пакетов. Реестр является публичным, что означает, что любой разработчик может опубликовать в нём свой пакет.
  • Интерфейс командной строки (CLI): Программа npm, которая устанавливается вместе с Node.js. Она предоставляет набор команд для управления пакетами: npm install, npm publish, npm update, npm uninstall и другие. CLI взаимодействует с реестром по протоколу HTTP/HTTPS.
  • Файл package.json: Основной конфигурационный файл проекта, расположенный в корневой директории. Он содержит метаданные проекта (название, версия, описание, лицензия) и, что наиболее важно, список зависимостей (пакетов, необходимых для работы проекта) и их версий. Файл package.json является стандартом де-факто для JavaScript-проектов.

Основные функции и команды

Управление зависимостями

Основная задача npm — управление зависимостями. Команда npm install <package-name> загружает пакет и его транзитивные зависимости (зависимости зависимостей) в директорию node_modules. Запись о пакете добавляется в файл package.json в секцию dependencies (для рабочей среды) или devDependencies (для разработки). Команда npm install (без указания пакета) устанавливает все зависимости, перечисленные в package.json.

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

Любой разработчик может опубликовать свой пакет в публичном реестре npm. Для этого необходимо:

  1. Зарегистрироваться на сайте npmjs.com.
  2. Создать файл package.json с корректными метаданными.
  3. Выполнить команду npm publish в директории проекта.

После публикации пакет становится доступным для установки другими разработчиками по всему миру. Публикация является необратимой: удалить опубликованную версию пакета можно только в течение 72 часов, после чего она остаётся в реестре навсегда.

Версионирование

npm использует семантическое версионирование (SemVer). Каждая версия пакета состоит из трёх чисел: MAJOR.MINOR.PATCH (например, 1.4.2). При установке зависимостей разработчик может указать диапазон допустимых версий, используя специальные символы:

  • ^ (каретка): разрешает обновления до новой минорной версии и патча (например, ^1.4.2 разрешает версии от 1.4.2 до 2.0.0).
  • ~ (тильда): разрешает обновления только до нового патча (например, ~1.4.2 разрешает версии от 1.4.2 до 1.5.0).
  • * (звёздочка): разрешает любую версию.

Основные команды CLI

КомандаОписание
npm initСоздаёт новый файл package.json в текущей директории.
npm install <package>Устанавливает пакет и добавляет его в dependencies.
npm install --save-dev <package>Устанавливает пакет и добавляет его в devDependencies.
npm uninstall <package>Удаляет пакет из node_modules и из package.json.
npm updateОбновляет все пакеты до последних версий, допустимых диапазонами в package.json.
npm publishПубликует пакет в реестре.
npm outdatedПоказывает список устаревших пакетов, для которых доступны новые версии.
npm auditПроверяет зависимости на наличие известных уязвимостей безопасности.
npm run <script>Запускает скрипт, определённый в секции scripts файла package.json.

Значение и влияние

npm оказал огромное влияние на экосистему JavaScript. Он стал стандартом для управления зависимостями в Node.js и широко используется в веб-разработке (фреймворки React, Angular, Vue.js), разработке мобильных приложений (React Native, Ionic) и других областях. Ключевые последствия его появления:

  • Упрощение разработки: Разработчики перестали писать всё с нуля, получив возможность использовать тысячи готовых модулей для решения типовых задач.
  • Стандартизация: npm ввёл единый формат упаковки и распространения кода, что способствовало унификации экосистемы.
  • Рост сообщества: Публичный реестр npm стал платформой для обмена кодом, что привело к появлению огромного сообщества разработчиков, публикующих и поддерживающих пакеты.
  • Появление альтернатив: Успех npm стимулировал создание альтернативных менеджеров пакетов, таких как Yarn (разработан Facebook) и pnpm, которые предлагают улучшенную производительность и безопасность, но сохраняют совместимость с реестром npm.

Критика и проблемы

Несмотря на широкую распространённость, npm подвергается критике по нескольким направлениям:

  • Размер директории node_modules: Установка большого количества зависимостей может приводить к созданию очень глубоких и объёмных директорий, что замедляет работу файловой системы, особенно на Windows. Эта проблема известна как «ад node_modules».
  • Безопасность: Публичный реестр npm содержит множество пакетов, которые могут быть вредоносными или содержать уязвимости. Хотя команда npm audit помогает выявлять известные проблемы, риск заражения остаётся. В истории были случаи, когда злоумышленники публиковали пакеты с похожими названиями (typosquatting) или внедряли вредоносный код в популярные пакеты.
  • Зависимость от централизованного реестра: npm является централизованным сервисом. В случае сбоя реестра (что происходило в прошлом) разработчики по всему миру теряли возможность устанавливать или обновлять пакеты.
  • Фрагментация версий: Из-за того, что разные проекты могут зависеть от разных версий одного и того же пакета, в директории node_modules могут оказаться несколько копий одного и того же пакета, что увеличивает размер проекта и время установки.

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

Основными альтернативами npm являются:

  • Yarn: Менеджер пакетов, разработанный Facebook (продукт Meta, признанной экстремистской и запрещённой в РФ). Предлагает более быструю установку за счёт кэширования и параллельной загрузки, а также более строгий механизм блокировки версий (файл yarn.lock). Использует тот же реестр npm.
  • pnpm: Менеджер пакетов, использующий жёсткие ссылки для хранения пакетов. Это позволяет избежать дублирования пакетов и значительно уменьшить занимаемое дисковое пространство. Также использует реестр npm.

Источники

  • Официальная документация npm: docs.npmjs.com
  • Реестр пакетов npm: npmjs.com
  • Книга «Node.js in Action», Майк Кантелон и др.
  • Статья «How npm works» на сайте npm, Inc.
  • Репозиторий npm на GitHub: github.com/npm/cli

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →