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. Для этого необходимо:
- Зарегистрироваться на сайте npmjs.com.
- Создать файл
package.jsonс корректными метаданными. - Выполнить команду
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 →