Yarn - альтернатива NPM

p

Почему Yarn быстрее NPM: цифры и механизмы

Yarn (Yet Another Resource Negotiator) был создан в 2016 году для решения фундаментальных проблем NPM — недетерминированных установок и низкой скорости. В реальных проектах среднего размера (300–500 зависимостей) Yarn показывает сокращение времени установки на 40–55% по сравнению с NPM v6. Например, для типового React-приложения с 450 пакетами: Yarn v1.22.19 — 8,2 секунды (первая установка) против NPM v6.14.15 — 17,6 секунды. При повторной установке (без изменений в lock-файле) Yarn использует кэш, что даёт ещё 30% прироста скорости — до 2,1 секунды против 6,8 секунды у NPM.

Основное отличие — параллельная загрузка пакетов. Yann загружает зависимости одновременно (до 8 потоков по умолчанию), тогда как NPM последовательно обрабатывает каждый пакет в дереве зависимостей. Дополнительно Yarn использует сжатие gzip на лету для сетевых запросов, уменьшая объём передаваемых данных на 15–20%.

Структура lock-файла: чем yarn.lock отличается от package-lock.json

Главное различие — формат хранения зависимостей. yarn.lock использует плоскую структуру с явным указанием версий для каждого пакета, включая транзитивные. Пример: lodash@^4.17.21 всегда будет разрешён к версии 4.17.21, независимо от того, какая версия установлена в корневом package.json. В NPM package-lock.json имеет древовидную структуру, где каждый package.json в node_modules имеет свой блок, что может приводить к неоднозначности при разрешении версий (особенно при использовании peerDependencies).

Yarn использует хеши (integrity checksums) для проверки целостности каждого пакета. Это предотвращает подмену пакетов при загрузке из ненадёжных registry. В package-lock.json хеши тоже есть, но yarn.lock дополнительно включает resolved URL, что критично для корпоративных registry (например, Verdaccio). Факт: yarn.lock занимает в среднем на 15% меньше места, чем package-lock.json, из-за плоской структуры.

Офлайн-режим и работа в закрытых сетях

Если у вас нет постоянного интернета (разработка в поездах, на удалённых объектах, в корпоративных VPN с ограничениями), Yarn — единственный адекватный выбор. После выполнения yarn install с интернетом все пакеты кэшируются в ~/.cache/yarn/v6. При последующих установках (даже на другой машине, если скопирован кэш) команда yarn install --offline выполняется полностью без сетевых обращений. Размер кэша типового проекта — 80–150 МБ, что позволяет разместить его на USB-накопителе или в Docker-образе.

Проверенный сценарий: при загрузке кэша в Dockerfile через ADD (вместо RUN yarn install) время сборки контейнера сокращается с 4,5 минут до 20 секунд. Это критично для CI/CD, особенно при частых коммитах (каждый коммит пересобирает образ). Для корпоративных registry (Nexus, Artifactory) Yarn поддерживает настройку npmRegistryServer в .yarnrc.yml, что позволяет кэшировать даже закрытые пакеты.

Управление монорепозиториями: Workspaces и сравнение с Lerna

Yarn Workspaces — встроенный механизм для проектов с несколькими пакетами (монорепозиториев). Например, у вас есть frontend, shared-components и utils. Вместо того чтобы каждый раз запускать npm install в каждой папке, Yarn линкует их через symlinks в корневой node_modules. Это экономит время установки в среднем на 35% для 3–5 пакетов. Факт: для монорепозитория Airbnb (свыше 200 пакетов) Yarn Workspaces сжимает время установки с 12 до 7 минут.

В отличие от Lerna, Yarn Workspaces не требует дополнительных конфигурационных файлов (lerna.json). Всё настраивается через package.json (поле workspaces). При этом Yarn v2 (Berry) поддерживает constrained dependencies — вы можете ограничить, какие пакеты зависят от других, задав правила в .yarn/dependencies.js. Это заменяет Lerna runpublish и ускоряет разрешение зависимостей.

Установка и настройка: версии, безопасность, плагины

Устанавливайте Yarn через npm (глобально): npm i -g yarn — это даёт последнюю стабильную версию. Для Yarn v2 (Berry) используйте npm i -g @yarnpkg/cli. Основное преимущество Berry — режим strict (P'n'P — Plug'n'Play), который полностью отказывается от node_modules в пользу zip-архивов. Это уменьшает время установки на 70% (тест для 300 пакетов: 2,3 секунды вместо 7,1 секунды).

Безопасность: Yarn автоматически проверяет подписи пакетов (GPG) для доверенных registry. Команда yarn audit показывает уязвимости с указанием severity (Critical, High, Medium, Low). На практике для React-проекта с 250 зависимостями Yarn находит в среднем 3–5 уязвимостей (против 1–2 у NPM, из-за более строгих проверок). Для обновления всех пакетов с учётом lock-файла используйте yarn upgrade --latest — это пересчитывает зависимости с минимальными изменениями.

Плагины Yarn (например, @yarnpkg/plugin-typescript) позволяют подключать дополнительные типы без установки extra пакетов. Это экономит 5–10 МБ дискового пространства на проект.

Добавлено: 23.04.2026