Главная / Статьи / Почему pnpm устанавливает быстрее, чем npm: хранилище, ссылки и строгая структура node_modules

Почему pnpm устанавливает быстрее, чем npm: хранилище, ссылки и строгая структура node_modules

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

774 слов

После переноса репозитория с npm на pnpm время установки часто резко сокращается. Это не плод воображения. pnpm был разработан с учетом проблем с производительностью и использованием памяти при стандартных установках через npm, и поскольку эти два инструмента хранят пакеты совершенно по-разному, разница в скорости является следствием архитектурных изменений, а не незначительной настройки.

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

1. Хранилище с адресным управлением вместо дублирующихся файлов

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

pnpm поддерживает один глобальный хранилище с адресным управлением контентом для всей системы. Каждая версия занимает в нем отдельное место; проект, которому она нужна, получает от этого хранилища жесткие ссылки (или ссылки с копированием при записи) в свой локальный каталог node_modules. Последствия этого включают:

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

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

2. Жесткие и символические ссылки вместо копирования

При установке через npm файлы пакетов копируются в каталог node_modules. Копирование тысяч файлов в сложной структуре каталогов сопряжено с большими затратами.

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

3. Эффективное кэширование между проектами

npm также кэширует загруженные файлы, но всё равно распаковывает и копирует их из этого кэша в каждый проект. В рамках модели хранилища pnpm, как только версия существует где-либо на компьютере, её включение в совершенно новый проект происходит практически мгновенно — без повторной загрузки и с минимальной дополнительной обработкой.

Такое поведение особенно заметно при:

  • Переходе между ветками, которые используют разные наборы зависимостей
  • Управлении несколькими репозиториями, использующими общие библиотеки
  • Запуске задач CI, восстанавливающих общее хранилище между сборками

4. Структура node_modules без упрощения, позволяющая избежать дополнительной обработки

В более старых версиях npm использовалась стратегия упрощения структуры node_modules для сокращения дублирования, но она сопряжена со своими издержками: необходимость трудоемкой обработки для определения местоположения каждого пакета без конфликтов.

pnpm сохраняет строгую структуру node_modules с символическими ссылками, благодаря чему пакет видит только те зависимости, которые он сам указал (без случайных ненужных импортов). Более безопасная обработка — это не единственное преимущество: также исключается дорогостоящее планирование операций npm, что сокращает нагрузку на процессор во время установки.

5. Параллельные операции

pnpm при возможности планирует выполнение операций разрешения, загрузки и создания ссылок одновременно, более активно, чем это делает npm. В сочетании с методом операций типа «создать ссылку вместо копирования» общее время выполнения снижается еще больше, особенно в случае деревьев с огромными графами зависимостей.

6. Влияние в реальном мире увеличивается с размером проекта

В случае простого приложения с несколькими пакетами разница может казаться незначительной. Преимущества возрастают по мере:

  • Monorepos, в которых множество пакетов используют одни и те же библиотеки
  • Команд, работающих над несколькими продуктами с общими зависимостями
  • Пайплайнов CI/CD, которые устанавливаются многократно при каждой сборке
  • Больших деревьев зависимостей, характерных для современных фронтенд-стеков

В таких условиях время установки с использованием функции store-and-link, которое раньше составляло несколько минут в npm, может сократиться до нескольких секунд.

7. Экономия дискового пространства — это побочный эффект, а не просто бонус

Скорость — главный критерий, но тот же дизайн решает и проблему хранения. Поскольку пакеты не копируются отдельно для каждого проекта, группы часто освобождают гигабайты памяти. На более медленных дисках уменьшение объема обрабатываемых данных также способствует повышению пропускной способности в качестве вторичного эффекта.

Краткое сравнение

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

Заключение

Преимущество pnpm по сравнению с npm — это не просто визуальный элемент. Оно переосмысливает подход к хранению и созданию ссылок: избегает дублирующихся загрузок, предпочитает ссылки копиям и не выполняет ненужных операций. Установка — часто самый медленный этап в работе с фронтендом — становится более быстрым и эффективным процессом.

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