yarn — альтернативный менеджер пакетов для Node.js, созданный Facebook совместно с Exponent, Google и Tilde в 2016 году. yarn решал проблемы скорости и безопасности npm 2-4: параллельная установка, строгий lock-файл и офлайн-кеш. Сегодня yarn сохраняет популярность в React Native, Expo и монорепозиториях. Подробнее — на yarn Documentation.
Главное
yarn (Yet Another Resource Negotiator) выпущен в октябре 2016 года как ответ Facebook на проблемы npm 2-4: медленная установка, отсутствие lock-файла и небезопасные пакеты. yarn предложил параллельную загрузку пакетов, детерминированный yarn.lock и проверку целостности через контрольные суммы. В 2020 yarn перешёл на версию 2 (Berry) с Plug'n'Play и TypeScript-first подходом.
Архитектура yarn отличается от npm: yarn загружает пакеты параллельно (npm до версии 5 — последовательно), кеширует каждый пакет в ~/.cache/yarn без дублирования между проектами и проверяет целостность через checksum. yarn всегда генерирует yarn.lock при любой установке, в то время как package-lock.json в npm появился только в версии 5.
Начиная с yarn 2 (Berry, 2020), yarn полностью переписан на TypeScript и поддерживает Plug'n'Play, workspaces, constraints для монорепозиториев и протоколы установки из разных источников (npm, git, tarball). yarn 3+ (2022) добавил Zero-Installs — хранение кеша в репозитории для мгновенной установки без сети.
yarn install — основная команда, которая читает package.json и yarn.lock и устанавливает зависимости. yarn загружает пакеты параллельно, что ускоряет установку в 2-3 раза по сравнению с npm 4 и более ранними версиями. yarn использует офлайн-кеш: если пакет уже скачан в другом проекте, он копируется из кеша, а не скачивается заново.
# Основные команды yarn
$ yarn install
$ yarn add react-native-webview
$ yarn add --dev typescript
$ yarn global add expo-cli
# Интерактивное обновление
$ yarn upgrade-interactive
# Удаление дублирующихся пакетов
$ yarn dedupe
yarn add — команда для установки нового пакета. yarn add <package> добавляет в dependencies, yarn add --dev — в devDependencies. yarn автоматически обновляет yarn.lock. yarn upgrade обновляет пакеты до последних версий в рамках семантического диапазона. yarn upgrade-interactive — интерактивный режим выбора конкретных пакетов для обновления.
yarn cache — глобальный кеш в ~/.cache/yarn/v6. Каждый пакет хранится один раз в ZIP-архиве с контрольной суммой. yarn cache чистится автоматически, но можно выполнить yarn cache clean вручную. yarn cache dir показывает путь к кешу. yarn cache list — список кешированных пакетов.
yarn.lock — файл фиксации точных версий всех зависимостей и их транзитивных пакетов. В отличие от package-lock.json (JSON), yarn.lock использует формат YAML с плоской структурой. yarn.lock всегда генерируется автоматически при yarn install или yarn add — это гарантирует, что все разработчики и CI-серверы получат идентичный набор пакетов.
# Пример структуры yarn.lock
react@^18.3.0:
version: "18.3.1"
resolution: "react@npm:18.3.1"
dependencies:
loose-envify: "^1.1.0"
checksum: "abc123def456..."
react-native@^0.76.0:
version: "0.76.3"
resolution: "react-native@npm:0.76.3"
dependencies:
react: "18.3.1"
checksum: "def789ghi012..."
Поля yarn.lock: version — точная версия пакета, resolution — источник и версия, dependencies — его зависимости, checksum — контрольная сумма для верификации. yarn.lock коммитится в репозиторий и является единственным источником истины для зависимостей. Если yarn.lock и package.json расходятся, yarn выдаёт предупреждение.
Yarn constraints — система правил для монорепозиториев, которая проверяет и принудительно задаёт версии зависимостей в yarn.lock. Ограничения описываются в файле yarn.constraints.js на Yarn Constraint Language. Constraints позволяют гарантировать, что все пакеты в монорепозитории используют одинаковую версию React или TypeScript.
React Native традиционно тесно связан с yarn. Expo CLI, React Native CLI и Create React Native App изначально использовали yarn. В React Native проектах yarn.lock фиксирует версии нативных модулей, что критически важно для стабильной компиляции через CocoaPods (iOS) и Gradle (Android). yarn workspaces популярны в монорепозиториях React Native с общим кодом.
yarn workspaces в React Native монорепозиториях: корневой package.json содержит "workspaces": ["packages/*", "mobile"]. yarn install создаёт единую папку node_modules на корневом уровне. Пакеты ссылаются друг на друга через симлинки. npx pod-install выполняется после изменения нативных зависимостей для обновления CocoaPods.
{
"private": true,
"workspaces": [
"packages/*",
"apps/mobile",
"apps/web"
],
"scripts": {
"mobile:start": "yarn workspace mobile start",
"mobile:ios": "yarn workspace mobile ios",
"lint": "yarn workspaces run lint"
}
}
Expo SDK 50+ официально рекомендует yarn для новых проектов, созданных через npx create-expo-app. yarn обеспечивает совместимость с Expo-модулями и автоматически генерирует правильный yarn.lock. Zero-Installs в yarn 3+ позволяет коммитить кеш в репозиторий — разработчики получают готовую среду без установки зависимостей после git clone.
npm и yarn решают одну задачу — управление пакетами Node.js. С выходом npm 5-7 функциональный разрыв практически исчез. npm 7+ включает workspaces, npm ci (аналог yarn install --frozen-lockfile) и parallel install. Однако yarn сохраняет преимущества в специфических сценариях: Plug'n'Play, Zero-Installs и зрелая система constraints.
| Характеристика | npm | yarn |
|---|---|---|
| Год создания | 2010 | 2016 |
| Lock-файл | package-lock.json (JSON) | yarn.lock (YAML) |
| Установка | Последовательная (npm 5+) | Параллельная |
| Plug'n'Play | Нет | Да (yarn 2+) |
| Workspaces | Да (npm 7+) | Да |
| Zero-Installs | Нет | Да (yarn 3+) |
| Кеш | node_modules с flattening | Глобальный ~/.cache/yarn |
| Язык реализации | JavaScript | TypeScript (yarn 2+) |
Когда выбрать yarn: проекты на Expo SDK 50+, крупные монорепозитории (100+ пакетов), команды, ценящие Zero-Installs для быстрой настройки окружения, и legacy-проекты, уже использующие yarn. Когда выбрать npm: стандартные проекты create-react-app, Next.js, Vite, команды без специфических требований к менеджеру пакетов.
yarn 4 (2024) представил улучшенную производительность, native ESM поддержку и оптимизацию для больших монорепозиториев. npm 10+ продолжает развиваться с фокусом на безопасность и совместимость. Выбор между npm и yarn сегодня — вопрос командных предпочтений и конкретных требований проекта, а не технического превосходства одного инструмента.
Часто задаваемые вопросы
yarn изначально опережал npm по скорости за счёт параллельной установки пакетов и агрессивного кеширования. yarn.lock автоматически генерируется при любой установке, в то время как package-lock.json появился в npm 5. yarn предлагает Plug'n'Play — альтернативу node_modules с нулевым временем установки. С npm 7+ разница в скорости и функционале для базовых сценариев минимальна.
yarn workspaces — механизм управления несколькими пакетами в одном репозитории. Корневой package.json содержит поле "workspaces": ["packages/*"]. yarn install устанавливает общие зависимости на верхнем уровне в единую node_modules, создаёт симлинки между локальными пакетами и избегает дублирования. Команды запускаются для всех workspace через yarn workspaces run <script>.
Plug'n'Play (PnP) — альтернатива традиционной папке node_modules, представленная в yarn 2. Вместо копирования файлов yarn создаёт карту зависимостей в .pnp.cjs и хранит пакеты в ZIP-архивах в глобальном кеше. Преимущества PnP: установка за секунды, время запуска Node.js сокращается на 30-50%, отсутствие node_modules и связанных с ней проблем с путями.
Установите yarn глобально: npm install -g yarn. В корне проекта выполните yarn import — yarn прочитает package-lock.json и создаст эквивалентный yarn.lock. Удалите node_modules и package-lock.json, выполните yarn install для проверки. Обновите CI/CD конфигурацию, заменив npm на yarn. yarn полностью совместим с package.json.
Ошибка "Integrity check failed" возникает при несоответствии yarn.lock и node_modules. Решение: удалите node_modules, yarn.lock и очистите кеш (yarn cache clean), затем выполните yarn install заново. Для конфликтов версий используйте yarn upgrade-interactive для выбора конкретных обновлений. yarn dedupe удалит дублирующиеся пакеты.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также