Менеджеры пакетов — это программные инструменты, которые помогают программистам и разработчикам устанавливать, обновлять и удалять пакеты кода, библиотек или другого программного обеспечения.

Существует множество менеджеров пакетов для различных языков программирования, таких как NPM в JavaScript и GEM в Ruby.

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

Примеры включают apt-get, DNF (Fedora/Red Hat), Pacman (Arch Linux) и npm (Node.js).

Пакет может быть добавлен или удален из этого общего пула любым пользователем. Пакеты обычно загружаются с удаленных серверов, но также могут быть установлены локально.

Что такое менеджер пакетов?

Диспетчер пакетов — это часть программного обеспечения, которая управляет установкой, обновлением и удалением пакетов компьютерного программного обеспечения.

Менеджер пакетов хранит пакеты в центральном месте на жестком или сетевом диске. Это позволяет нескольким пользователям совместно использовать одну копию пакета.

Менеджеры пакетов, такие как npm install и yarn add, часто основаны на интерфейсе командной строки. Обычно приложения JavaScript имеют много зависимостей, и этими зависимостями управляет менеджер пакетов.

Node по умолчанию использует NPM. Однако в NPM отсутствуют некоторые расширенные функции, идеально подходящие для более сложных приложений, или он работает медленно при установке пакетов или разрешении зависимостей пакетов.

Yarn и PNPM, созданные сообществом менеджеры пакетов, появились для решения вышеуказанной проблемы. В последние несколько лет пряжа стала медленнее, но сегодня это, наверное, самый популярный вариант.

В мире управления пакетами PNPM появился последним игроком, который ускорил установку и обновление пакетов.

Сравнение NPM, YARN и PNPM

NPM — это менеджер пакетов для JavaScript, изначально разработанный проектом Node.js. Это позволяет разработчикам легче обмениваться кодом в разных проектах и использовать код других людей в своих собственных проектах.

Yarn — менеджер пакетов для JavaScript, разработанный Facebook. Это быстро, надежно и безопасно.

PNPM — это новый менеджер пакетов для JavaScript, созданный на основе npm для упрощения процесса установки пакетов в приложениях Node. PNPM является альтернативой NPM. Он следует тем же принципам, что и NPM, но имеет некоторые дополнительные функции, которые делают его более мощным, чем его предшественник.

1. Производительность и дисковая эффективность

NPM: немного медленнее по сравнению с Yarn и PNPM.

YARN: Yarn использует тот же каталог flatten node_modules, но сравним с NPM по скорости и устанавливает пакеты параллельно.

PNPM: PNPM в 3 раза быстрее и эффективнее, чем NPM. Как с холодным, так и с горячим кэшем PNPM работает быстрее, чем Yarn.

Pnpm просто связывает файлы из глобального хранилища, а yarn копирует файлы из своего кеша. Версии пакетов никогда не сохраняются на диске более одного раза.

Алгоритм pnpm не использует плоское дерево зависимостей, что упрощает его реализацию, поддержку и требует меньше вычислений.

Этот метод использовался в NPM 3 и более ранних версиях, но вложение было проблематичным, и поэтому пакеты приходилось копировать несколько раз для каждого пакета, который от них зависел.

С жесткими и символическими ссылками PNPM решил проблему, описанную выше, в отличие от NPM. PNPM сгруппировал все зависимости по символической ссылке, но сохранил все зависимости.

a symlink (or junction on Windows)
node_modules
├─ foo -> .registry.npmjs.org/foo/1.0.0/node_modules/foo
└─ .registry.npmjs.org
   ├─ foo/1.0.0/node_modules
   |  ├─ bar -> ../../bar/2.0.0/node_modules/bar
   |  └─ foo
   |     ├─ index.js
   |     └─ package.json
   └─ bar/2.0.0/node_modules
      └─ bar
         ├─ index.js
         └─ package.json

PNPM также может сэкономить массу места по сравнению с двумя другими менеджерами пакетов.

2. Безопасность

NPM: были некоторые уязвимости в системе безопасности, которые напрямую повлияли на многие проекты из-за того, как npm обрабатывает плохие пакеты.

YARN: контрольные суммы, хранящиеся в yarn.lock, с тех пор используются Yarn Classic и Yarn Berry. Yarn также предотвращает установку вредоносных пакетов; при обнаружении несоответствия установка будет прервана.

PNPM: подобно Yarn, PNPM также использует контрольные суммы, и в дополнение к использованию контрольных сумм, pnpm также проверяет целостность своего кода перед его выполнением.

3. Поддержка монорепозиториев

Монорепозиторий состоит из нескольких изолированных репозиториев кода, размещенных в одном репозитории, чтобы избежать управления несколькими репозиториями.

NPM: менеджер пакетов NPM предлагает поддержку монорепозитория с различными командами CLI для управления несколькими пакетами. Однако, в отличие от других менеджеров пакетов, он не поддерживает расширенную фильтрацию или несколько рабочих областей.

YARN: он также предлагает поддержку монорепозитория в качестве функции рабочих пространств. Использование стороннего приложения Lerna до того, как стала доступна функция рабочей области, было единственным способом использовать менеджер пакетов в многопакетном проекте.

PNPM:проблема двойников NPM может быть решена только с помощью PNPM. Иногда монорепозитории кишат двойниками, поэтому у PNPM в этом отношении есть преимущество.

4. Рабочие процессы установки

Как я уже говорил, сначала необходимо установить менеджер пакетов локально и CI/CD.

NPM: это один из крупнейших в мире реестров пакетов, который следует устанавливать вместе с Node.js. Он использует файлы package.json и package.lock.json.

Чтобы загрузить пакет, откройте терминал и введите следующую команду:

npm install "package_name"

По умолчанию npm создает папку с именем package.json, и всякий раз, когда вы загружаете пакет с помощью npm, он будет помещаться сюда.

YARN:Чтобы решить проблемы NPM, был разработан YARN. Он предоставил много новых функций, которые позже были включены в npm, такие как файл блокировки с версиями, кэширование и так далее.

Пряжа использует package.json и yarn.lock files.

Вы можете установить Yarn разными способами — используя npm как npm-пакет с:

npm install -g yarn

PNPM: вы можете легко установить PNPM с пакетом npm.

npm install -g pnpm

5. Структура проектов

После завершения процесса установки будут созданы соответствующие файлы, которые можно легко просмотреть, а вся важная метаинформация будет храниться в файле с именем package.json.

NPM: с помощью npm install создается package-lock.json и папка node_modules. Вы можете вручную разместить файл конфигурации .npmrc на корневом уровне.

.
├── node_modules/
├── .npmrc
├── package-lock.json
└── package.json

YARN: это также создаст файл yarn.lock и папку node_modules. Вы также можете настроить свою пряжу с помощью файла .yarnrc; Yarn Classic также поддерживает файлы .npmrc.

.
├── .yarn/
│   ├── cache/
│   └── releases/
│       └── yarn-1.22.17.cjs
├── node_modules/
├── .yarnrc
├── package.json
└── yarn.lock

Помимо .yarn/cache/, можно использовать и другие места для хранения классических версий пряжи (.yarn/releases/).

PNPM. В отличие от NPM, PNPM не создает плоское дерево зависимостей. В node_modules у всего была собственная папка node_modules в package.json, и каждая зависимость была точно указана в package.json. До версии 3 npm структура node_modules была предсказуемой.

Проблема с этим подходом была двоякой:

  1. у Windows часто возникали проблемы с длинными путями к каталогам, вызванные пакетами со слишком глубокими деревьями зависимостей.
  2. пакеты были скопированы несколько раз, чтобы удовлетворить несколько зависимостей

PNPM решил эту проблему без выравнивания дерева зависимостей. Зависимости каждого пакета были сгруппированы вместе в папке node_modules, а символические ссылки использовались для группировки зависимостей вместе, поэтому дерево каталогов плоское.

.
├── node_modules/
│   └── .pnpm/
├── .npmrc
├── package.json
└── pnpm-lock.yml

Файл package.json создается после установки зависимостей с помощью pnpm i, также создается папка node_modules, но ее структура будет полностью отличаться от npm и yarn из-за подхода к хранению с адресацией по содержимому.

Пример:

node_modules
└── .pnpm
    ├── [email protected]
    │   └── node_modules
    │       └── bar -> <store>/bar
    │           ├── index.js
    │           └── package.json
    └── [email protected]
        └── node_modules
            └── foo -> <store>/foo
                ├── index.js
                └── package.json

Результат

Менеджеры пакетов сейчас в отличном состоянии. Почти все основные менеджеры пакетов достигли паритета функций. Есть отличия под капотом.

Хотя PNPM имеет некоторое сходство с NPM, их методы управления зависимостями совершенно разные; Подход PNPM обеспечивает более высокую производительность и более эффективное использование дискового пространства.

Вскоре Yarn Classic может перестать поддерживаться, поскольку считается устаревшим программным обеспечением.

Являясь новейшим претендентом на роль менеджера пакетов, Yarn Berry PnP до сих пор не в полной мере использовала свой потенциал для революционного изменения ландшафта управления пакетами.

Зависимости распространены в приложениях JavaScript. Менеджеры пакетов обычно используются для управления этими зависимостями. По умолчанию узел использует NPM.

Хотя в NPM отсутствуют некоторые дополнительные функции, он хорошо решает проблемы с зависимостями пакетов и устанавливает пакеты.

Выполните оценку отдельных пользователей, чтобы определить наличие медленных страниц, исключений JavaScript или неудачных вызовов AJAX. Получите быстрое представление о том, как меняется опыт ваших конечных пользователей в зависимости от сети или местоположения.

Трассировки сеанса позволяют вам видеть ход сеанса, выявлять медленные активы JavaScript, длительное время загрузки и выявлять ошибки.

Спасибо, что прочитали мою статью :)