npm — это менеджер пакетов для языка программирования JavaScript , поддерживаемый npm, Inc., дочерней компанией GitHub . npm — это менеджер пакетов по умолчанию для среды выполнения JavaScript Node.js , который включен в качестве рекомендуемой функции в установщик Node.js. [4]
Он состоит из клиента командной строки, также называемого npm, и онлайн-базы данных публичных и платных частных пакетов, называемой реестром npm. Доступ к реестру осуществляется через клиент, а доступные пакеты можно просматривать и искать через веб-сайт npm. Менеджер пакетов и реестр управляются npm, Inc.
Хотя «npm» обычно понимают как аббревиатуру от «Node Package Manager», официально это рекурсивный бэкроним для «npm не является аббревиатурой». [5]
npm был разработан Айзеком З. Шлютером в результате того, что он «увидел, как ужасно сделана упаковка модулей», а также вдохновлен другими похожими проектами, такими как PEAR ( PHP ) и CPAN ( Perl ). [6] npm — это замена pm, скрипта оболочки , на JavaScript . [7]
Компания npm, Inc. была основана в 2014 году в Окленде, Калифорния , США, соучредителем которой является Лори Восс. Брайан Богенсбергер присоединился к компании в качестве генерального директора в июле 2018 года и ушел в отставку в сентябре 2019 года. [8] До отставки Богенсбергера в июле 2019 года в отставку ушла Лори Восс. [9]
В марте 2020 года npm был приобретен GitHub , дочерней компанией Microsoft .
npm может управлять пакетами, которые являются локальными зависимостями определенного проекта, а также глобально установленными инструментами JavaScript. [10] При использовании в качестве менеджера зависимостей для локального проекта npm может установить все зависимости проекта через файл одной командой package.json
. [11] В package.json
файле каждая зависимость может указывать диапазон допустимых версий с использованием схемы семантического версионирования, что позволяет разработчикам автоматически обновлять свои пакеты, избегая при этом нежелательных критических изменений. [12] npm также предоставляет инструменты повышения версии для разработчиков, чтобы пометить свои пакеты определенной версией. [13] npm также предоставляет файл package-lock.json
[14] , который содержит запись точной версии, используемой проектом после оценки семантического версионирования в package.json
.
Клиент интерфейса командной строки npm позволяет пользователям использовать и распространять модули JavaScript, доступные в реестре. [15]
В феврале 2018 года в версии 5.7.0 была обнаружена проблема, из-за которой запуск sudo npm
в системах Linux приводил к изменению владельца системных файлов, что приводило к необратимому выходу операционной системы из строя. [16]
В версии npm 6 функция аудита была введена, чтобы помочь разработчикам выявлять и устранять уязвимости безопасности в установленных пакетах. [17] Источник уязвимостей безопасности был взят из отчетов, найденных на Node Security Platform (NSP), и был интегрирован с npm с момента приобретения NSP компанией npm. [18]
Пакеты в реестре находятся в формате ECMAScript Module (ESM) или CommonJS и включают файл метаданных в формате JSON . [19]
В основном реестре npm доступно более 3,1 миллиона пакетов. [20]
Реестр не имеет процесса проверки для отправки, что означает, что пакеты, найденные там, потенциально могут быть низкого качества, небезопасными или вредоносными. [19] Вместо этого npm полагается на отчеты пользователей, чтобы удалять пакеты, если они нарушают политику, будучи низкого качества, небезопасными или вредоносными. [21] npm предоставляет статистику, включая количество загрузок и количество зависимых пакетов, чтобы помочь разработчикам оценить качество пакетов. [22]
Внутри npm использует базу данных NoSQL Couch DB для управления общедоступными данными. [23]
В марте 2016 года пакет под названием left-pad
был отменен из-за спора об имени между Азером Кочулу, индивидуальным инженером-программистом, и Kik . [24] [25] Пакет был чрезвычайно популярен на платформе, от него зависели тысячи проектов, и до его удаления было достигнуто 15 миллионов загрузок. [24] [26] Несколько проектов, критически важных для экосистемы JavaScript, включая Babel и Webpack, зависели от него left-pad
и стали непригодными для использования. [27] Хотя пакет был повторно опубликован три часа спустя, [28] он вызвал массовые сбои, заставив npm изменить свою политику в отношении отмены публикации, чтобы предотвратить подобное событие в будущем. [29]
В марте 2022 года разработчик Брэндон Нозаки Миллер , сопровождающий node-ipc
пакет, добавил peacenotwar
в качестве зависимости к пакету; peacenotwar
рекурсивно перезаписывает содержимое жесткого диска пораженной машины эмодзи сердца , если у них есть белорусский или российский IP-адрес. Пакет также оставляет на машине текстовый файл , содержащий сообщение в знак протеста против вторжения России в Украину . Vue.js , который использует node-ipc
в качестве зависимости , не прикрепил свои зависимости к безопасной версии, что означает, что некоторые пользователи Vue.js стали жертвами вредоносного пакета, если зависимость была извлечена как последний пакет. [30] [31] Уязвимая зависимость также недолго присутствовала в версии 3.1 Unity Hub ; однако в тот же день было выпущено исправление для устранения проблемы. [32]
В ноябре 2018 года было обнаружено, что вредоносный пакет был добавлен в качестве зависимости к версии 3.3.6 популярного пакета event-stream
. [33] Вредоносный пакет, называемый flatmap-stream
, содержал зашифрованную полезную нагрузку, которая крал биткойны из определенных приложений. [34]
В мае 2021 года pac-resolver
было обнаружено, что пакет npm, который загружался более 3 миллионов раз в неделю, имеет уязвимость удаленного выполнения кода . [35] Уязвимость возникла из-за того, как пакет обрабатывал файлы конфигурации, и была исправлена в версиях 5 и выше. [36]
В январе 2022 года сопровождающий популярного пакета colors
отправил изменения, печатая мусорный текст в бесконечном цикле. [26] Сопровождающий также очистил репозиторий другого популярного пакета, faker
, и его пакет на npm, и заменил его README, который гласил: «Что на самом деле случилось с Аароном Шварцем ?» [37]
В мае 2023 года было обнаружено, что несколько пакетов npm, включая , bignum
были использованы для кражи учетных данных пользователей и информации с пострадавших машин. Исследователи обнаружили, что эти пакеты были скомпрометированы с помощью эксплойта, включающего Amazon S3 buckets и node-gyp
инструмент командной строки. [38]
Существует ряд альтернатив npm с открытым исходным кодом для установки модульного JavaScript, включая pnpm , Yarn , [39] Bun и Deno . Deno и Bun также предоставляют среду выполнения JavaScript, в то время как только Deno работает независимо от реестра NPM или любого централизованного репозитория [40], и его поддержка реестра NPM все еще является предметом продолжающейся работы по состоянию на январь 2024 года. [41] Все они совместимы с публичным реестром npm и используют его по умолчанию, но предоставляют различные возможности на стороне клиента, обычно ориентированные на улучшение производительности и детерминизма по сравнению с клиентом npm. [42]