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 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.