yarn: същност, алтернативен мениджър на пакети за React Native

Автор: IT Sectr Публикувано: 2026-02-13 Време за четене: 10 мин

yarn — алтернативен мениджър на пакети за Node.js, създаден от Facebook съвместно с Exponent, Google и Tilde през 2016 г. yarn решаваше проблемите със скоростта и сигурността на npm 2-4: паралелна инсталация, строг lock-файл и офлайн кеш. Днес yarn запазва популярността си в React Native, Expo и монорепозиториумите. Повече — на yarn Documentation.

Основни точки

  • yarn — мениджър на пакети за Node.js, създаден от Facebook през 2016 г. за решаване на проблемите на npm
  • yarn.lock — файл за фиксиране на точни версии на всички зависимости, създаван автоматично
  • yarn install — паралелна инсталация на пакети с използване на глобален кеш без дублиране
  • yarn workspaces — механизъм за управление на монорепозиториуми с обща папка node_modules
  • Plug'n'Play — алтернатива на node_modules със съхранение на пакети в ZIP архиви в глобалния кеш

Какво е yarn — мениджър на пакети?

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 управлява инсталацията на зависимости

yarn install — основната команда, която чете package.json и yarn.lock и инсталира зависимости. yarn изтегля пакети паралелно, което ускорява инсталацията 2-3 пъти в сравнение с npm 4 и по-ранни версии. yarn използва офлайн кеш: ако пакет вече е изтеглен в друг проект, той се копира от кеша, а не се изтегля отново.

bash
# Основни 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: предназначение и структура на файла

yarn.lock — файл за фиксиране на точни версии на всички зависимости и техните транзитивни пакети. За разлика от package-lock.json (JSON), yarn.lock използва YAML формат с плоска структура. yarn.lock винаги се генерира автоматично при yarn install или yarn add — това гарантира, че всички разработчици и CI сървъри получават идентичен набор от пакети.

yaml
# Пример за структура на 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.

yarn в екосистемата на React Native

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.

json
{
  "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.

yarn и npm: сравнителен анализ

npm и yarn решават една и съща задача — управление на пакети за Node.js. С излизането на npm 5-7 функционалната разлика практически изчезна. npm 7+ включва workspaces, npm ci (еквивалент на yarn install --frozen-lockfile) и паралелна инсталация. Въпреки това, yarn запазва предимства в специфични сценарии: Plug'n'Play, Zero-Installs и зряла система от constraints.

Характеристикаnpmyarn
Година на създаване20102016
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
Език на имплементацияJavaScriptTypeScript (yarn 2+)

Кога да изберем yarn: проекти на Expo SDK 50+, големи монорепозиториуми (100+ пакета), екипи, които ценят Zero-Installs за бързо настройване на среда, и legacy проекти, които вече използват yarn. Кога да изберем npm: стандартни проекти create-react-app, Next.js, Vite, екипи без специфични изисквания към мениджъра на пакети.

yarn 4 (2024) представи подобрена производителност, родна ESM поддръжка и оптимизация за големи монорепозиториуми. npm 10+ продължава да се развива с фокус върху сигурността и съвместимостта. Изборът между npm и yarn днес е въпрос на екипни предпочитания и конкретни изисквания на проекта, а не на техническо превъзходство на един инструмент.

Често задавани въпроси

Каква е основната разлика между yarn и npm?

yarn първоначално превъзхождаше npm по скорост благодарение на паралелната инсталация на пакети и агресивното кеширане. yarn.lock се генерира автоматично при всяка инсталация, докато package-lock.json се появи в npm 5. yarn предлага Plug'n'Play — алтернатива на node_modules с нулево време за инсталация. От npm 7+ разликата в скорост и функционалност за основни сценарии е минимална.

Как работят yarn workspaces в монорепозиториумите?

yarn workspaces — механизъм за управление на множество пакети в едно хранилище. Кореновият package.json съдържа полето "workspaces": ["packages/*"]. yarn install инсталира общите зависимости на горното ниво в единна node_modules, създава симлинкове между локалните пакети и избягва дублиране. Командите се изпълняват за всички workspace чрез yarn workspaces run <script>.

Какво е yarn Plug'n'Play и за какво служи?

Plug'n'Play (PnP) — алтернатива на традиционната папка node_modules, представена в yarn 2. Вместо копиране на файлове, yarn създава карта на зависимостите в .pnp.cjs и съхранява пакетите в ZIP архиви в глобалния кеш. Предимства на PnP: инсталация за секунди, времето за стартиране на Node.js се намалява с 30-50%, липса на node_modules и свързаните с нея проблеми с пътища.

Как да мигрираме проект от npm към yarn?

Инсталирайте 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.

Как да поправим грешки при блокиране на версии в yarn?

Грешката "Integrity check failed" възниква при несъответствие между yarn.lock и node_modules. Решение: изтрийте node_modules, yarn.lock и изчистете кеша (yarn cache clean), след което изпълнете отново yarn install. За конфликти на версии използвайте yarn upgrade-interactive за избор на конкретни актуализации. yarn dedupe ще премахне дублиращите се пакети.

Резюме

  • yarn — алтернативен мениджър на пакети за Node.js, създаден от Facebook през 2016 г.
  • yarn.lock — файл за фиксиране на точни версии на всички зависимости в YAML формат
  • yarn install — паралелна инсталация на пакети с използване на глобален офлайн кеш
  • Plug'n'Play — иновативен механизъм на yarn 2+ без папка node_modules
  • yarn workspaces — управление на монорепозиториуми с единна node_modules
  • yarn в React Native — стандартен мениджър на пакети за Expo и React Native проекти
  • Zero-Installs — комитване на кеша в хранилището за моментална инсталация без изтегляне на пакети

Ще разработим мобилно приложение под ключ

IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.

Обсъдете проекта

Прочетете също