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) и паралелна инсталация. Въпреки това, 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) представи подобрена производителност, родна 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 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също