Менеджеры пакетов — это инструменты, которые помогают управлять дополнительными битами и частями (зависимостями), необходимыми для создания программного обеспечения.
Наиболее популярными менеджерами пакетов являются NPM и YARN. Меньшую известность получил пока PNPM.
Выбор менеджера пакетов зависит от технических требований проекта. У каждого из них есть свои сильные стороны, поэтому полезно ознакомиться со всеми вариантами. Эти инструменты для того и существуют, чтобы облегчить вам задачу по созданию кода.
Менеджеры пакетов JavaScript
При разработке Node-приложения используются определенные зависимости: дополнительные библиотеки, помощники и другие инструменты. Допустим, вы работаете над React-проектом. Чтобы добавить в него маршрутизацию, надо установить пакет react-router-dom
. Приложение может использовать и множество других пакетов. Для управления ими внутри среды выполнения Node.js требуется менеджер пакетов.
По умолчанию у JS-разработчиков есть node package manager
, который поставляется в комплекте с установкой Node.js. Но он может не удовлетворить все требования проекта.
Поэтому стоит рассмотреть другие варианты менеджеров пакетов для Node.js, их преимущества и недостатки.
Какие задачи решает менеджер пакетов?
- Управление зависимостями: менеджеры пакетов занимаются установкой и управлением зависимостями, обеспечивая корректность версий и доступность этих зависимостей для проекта.
- Установка: менеджеры пакетов устанавливают утилиты для выполнения самых разных процессов — от предоставления команд для загрузки до управления, оценки уязвимостей и безопасности на локальном компьютере.
- Скрипты и команды: дополнительные команды могут быть определены в файле package.json для упрощения общего процесса разработки — запуска сервера, проведения тестов, сборки активов и т. д. (выполняются через инструмент командной строки менеджера пакетов).
- Безопасность: менеджеры пакетов часто предоставляют инструменты для сканирования пакетов на наличие известных уязвимостей (например,
npm audit
), а также предусматривают другие аспекты обеспечения безопасности, такие как фиксация зависимостей, подтверждение подписи и проведение верификации пакетов.
NPM
NPM (Node Package Manager) — это стандартный менеджер пакетов для JavaScript-приложений, поставляемый в комплекте при установке Node. NPM является наиболее популярным менеджером пакетов благодаря своей широкой поддержке.
Проблемы, свойственные ранним версиям NPM:
- Отсутствие поддержки lock-файла. Это означало, что в менеджере пакетов не хранились точные данные о версиях зависимостей, используемых в приложении. Отсутствие контроля версий часто приводило к проблемам совместимости, так как в разных средах могли использоваться разные версии зависимостей.
- Использование разных версий пакетов на разных компьютерах. Такая гибкость приводила к критическим изменениям, поскольку разработчики полагались на функции или поведение, которые предусматривались в одних версиях и отсутствовали в других.
Позже, когда Yarn исправил эти проблемы, NPM также устранил их в обновленных версиях.
Как работает NPM
- В централизованном реестре NPM хранятся тысячи пакетов. Эти пакеты могут быть библиотеками, фреймворками, помощниками, утилитами или инструментами. При запуске
npm install
перечисленные пакеты загружаются из реестра NPM в файл package.json. - После загрузки зависимостей NPM генерирует lock-файл (package-lock.json). В этом файле указаны точные версии всех зависимостей (прямых и транзитивных), загруженных для разработки проекта. Он действует как детерминированный протокол, гарантирующий, что при будущих установках, даже на разных компьютерах, будут загружаться одинаковые версии.
- Если lock-файл отсутствует или удален, то NPM попытается загрузить последнюю совместимую версию, которая удовлетворяет диапазонам версий, указанным в файле
package.json
. В этих диапазонах используются семантические соглашения о версиях (semver), такие как^
(совместимые минорные версии),~
(совместимые версии патчей) и точные номера версий (1.2.3
). - NPM использует вложенное дерево зависимостей, обеспечивая получение каждым пакетом точной версии своих зависимостей.
Ниже приведен снимок файла package-lock.json с данными пакета react-dom
. Этот пакет включает зависимость под названием scheduler
, которая будет загружена автоматически вместе с установкой react-dom
. Однако react-dom
также содержит одноранговые зависимости, которые необходимы для его функциональности, но не будут загружаться NPM автоматически. Ожидается, что эти одноранговые зависимости будут присутствовать, способствуя работе пакета.
![](https://nuancesprog.ru/wp-content/uploads/2024/06/image-91.png)
Примечание. Обычно рекомендуется сохранять lock-файл (
package-lock.json
илиyarn.lock
), так как он обеспечивает детерминированную установку и воспроизводимость сред.
Теперь рассмотрим плюсы и минусы NPM.
Плюсы
- Обширная поддержка. NPM содержит крупнейший в мире реестр пакетов JavaScript.
- Облегченное управление зависимостями. NPM автоматизирует процесс поиска, установки и управления зависимостями наиболее упрощенным способом.
- Простота использования. NPM прост в настройке и использовании, что делает его доступным для разработчиков любого уровня подготовки.
Минусы
- Потребность в большом пространстве на диске. Поскольку NPM использует подход вложенного дерева зависимостей для сохранения пакетов, ему требуется больше дискового пространства для сохранения нескольких копий одного и того же пакета, если они требуются разным зависимостям.
- Раздувание зависимостей. Если зависимости/пакеты не управляются должным образом в долгосрочной перспективе, может накопиться большое количество ненужных пакетов, что чревато увеличением размера проекта и проблемами с совместимостью.
- Недостаточная производительность. По сравнению с другими менеджерами пакетов, NPM выполняет установку пакетов медленнее, особенно при использовании его в крупном проекте с большим количеством зависимостей. Это связано с тем, что NPM последовательно загружает пакеты.
YARN
Вы тоже думаете, что YARN расшифровывается как “yet another resource negotiator” (еще одна/новая/альтернативная система управления ресурсами)? Честно говоря, мне так и не удалось найти вразумительного ответа на этот вопрос.
Как упоминалось выше, Yarn — менеджер пакетов для Node-проектов, разработанный Facebook для решения проблем, имевшихся у NPM, который в то время не указывал точную версию зависимостей и не поддерживал lock-файл.
Принцип работы YARN очень напоминает NPM, но в некоторых аспектах YARN предоставляет больше преимуществ.
Рассмотрим основные команды этого менеджера пакетов.
Как работает YARN
- Сначала используется команда
yarn init
для инициализации проекта с помощью YARN, которая создаст файл package.json в проекте. - Команда
yarn add <имя_пакета>
позволит добавить любой пакет. - Если нужно установить зависимости в предварительно настроенный проект, команда
yarn install
загрузит все зависимости из реестра NPM и сгенерирует lock-файл.
Плюсы
- Более быстрая установка. В отличие от NPM, YARN устанавливает пакеты параллельно, что позволяет сократить время установки.
- Поддержка оффлайн. YARN работает быстрее также за счет реализации локального кэширования. Он хранит кэши пакетов в глобальном месте, которое затем может совместно использоваться различными проектами, что делает его быстрее, а также обеспечивает поддержку оффлайн, которой нет в NPM. Команда
yarn cache dir
позволяет узнать, в каком каталоге YARN хранит кэши пакетов. - Экономное использование дискового пространства. YARN задействует плоскую структуру зависимостей, которая позволяет избежать дублирования и вложенности пакетов, что приводит к минимальному использованию места на диске.
- Поддержка монорепозитория. Разработчики YARN предусмотрели поддержку монорепозитория с помощью функции Yarn Workspaces. Монорепозиторий — это репозиторий, единый для нескольких пакетов, каждый из которых имеет свой package.json. Yarn Workspaces упрощает управление зависимостями, позволяя устанавливать зависимости для всех пакетов из центрального места.
Минусы
- Менее развитая экосистема. Хотя популярность YARN набирает обороты, у NPM более долгая история и более широкое сообщество.
- Ограниченная поддержка нативных модулей. YARN может быть несовместим с некоторыми функциями или пакетами, которые ориентированы на специфические функции NPM.
- Зависимость от реестра NPM. Несмотря на эффективное управление зависимостями, YARN зависит от реестра NPM для загрузки пакетов. Это означает, что возникающие в NPM проблемы могут косвенно отразиться и на YARN.
PNPM
PNPM расшифровывается как “performant NPM” (высокопроизводительный NPM). Он разработан для решения проблем, возникающих при работе с YARN и NPM.
После установки PNPM можно использовать команды, аналогичные командам NPM и YARN.
pnpm init
: инициализирует новый проект, аналогичноnpm init
илиyarn init
.pnpm install <имя_пакета>
: устанавливает пакет и его зависимости.pnpm list
: составляет список пакетов, установленных в проекте.pnpm remove <имя_пакета>
: удаляет пакет.pnpm run <имя_скрипта>
: запускает скрипт, определенный в файлеpackage.json
.
Плюсы
- Эффективное использование места на диска. В отличие от NPM и YARN, в PNPM используется подход глобального хранилища, при котором все пакеты хранятся глобально в одном месте. При установке пакета PNPM связывает файлы из глобального хранилища с
node_modules
проекта, поэтому не нужно хранить пакеты для каждого приложения отдельно, что делает PNPM эффективным с точки зрения использования места на диске. - Lock-файл. Несмотря на то, что pnpm использует неплоскую внутреннюю структуру, он предоставляет “плоское представление” зависимостей через lock-файл (часто называемый
pnpm-lock.yaml
). - Скорость и легкость. PNPM быстрее и легче, чем NPM и YARN, поскольку использует кэширование и не устанавливает пакеты каждый раз. Если пакет находится глобально, символические/жесткие ссылки прикрепляются в node_module этого проекта/приложения.
Минусы
- Новый игрок на рынке. Хотя PNPM быстрее, чем NPM и YARN, не так много людей знают о нем, поскольку, в отличие от своих конкурентов, он недавно появился на рынке.
- Ограниченная поддержка нативных модулей. Могут возникнуть проблемы с совместимостью с нативными модулями, которые ориентируются на функциональность, специфичную для NPM.
- Зависимость от глобального хранилища. Глобальное хранилище пакетов в pnpm дает преимущества в плане эффективности, но также может создавать потенциальные накладные расходы на управление. Например, вам придется подумать над решением таких задач, как очистка глобального хранилища и управление конфликтами, если нескольким проектам требуются разные версии одного и того же пакета.
Выбор правильного инструмента
Вот краткое руководство, которое поможет вам решить, какой менеджер пакетов выбрать.
- Скорость и эффективность. Если скорость установки и минимальное использование места на диске являются главными приоритетами, PNPM — отличный выбор, особенно для больших проектов.
- Для устоявшихся экосистем. Если вам нужен доступ к более широкому сообществу и огромному количеству ресурсов, NPM может оказаться более подходящим вариантом благодаря своей более длительной истории и большой базе пользователей.
- Для сложных нативных модулей. Если проект сильно зависит от нативных модулей, NPM и YARN могут предложить лучшую совместимость из-за их более длительного опыта работы в этой области.
В конечном итоге выбор лучшего менеджера пакетов зависит от ваших конкретных потребностей и предпочтений. Прежде чем принять решение, рассмотрите сильные и слабые стороны каждого варианта.
Читайте также:
- Обзор 8 ключевых команд Npm и Yarn
- Как легко управлять зависимостями в монорепозитории JS
- Раскрываем силу JavaScript: сокращение размера пакета NPM на 99%
Читайте нас в Telegram, VK и Дзен
Перевод статьи Neha Gupta: NPM, PNPM, YARN Package Managers