yarn — alternativní správce balíčků pro Node.js, vytvořený Facebookem ve spolupráci s Exponent, Google a Tilde v roce 2016. yarn řešil problémy rychlosti a bezpečnosti npm 2-4: paralelní instalace, přísný lock soubor a offline cache. Dnes si yarn udržuje popularitu v React Native, Expo a monorepozitářích. Více na yarn Documentation.
Hlavní body
yarn (Yet Another Resource Negotiator) byl vydán v říjnu 2016 jako odpověď Facebooku na problémy npm 2-4: pomalá instalace, chybějící lock soubor a nebezpečné balíčky. yarn nabídl paralelní stahování balíčků, deterministický yarn.lock a ověření integrity pomocí kontrolních součtů. V roce 2020 yarn přešel na verzi 2 (Berry) s Plug'n'Play a přístupem TypeScript-first.
Architektura yarn se liší od npm: yarn stahuje balíčky paralelně (npm do verze 5 — sekvenčně), ukládá každý balíček do ~/.cache/yarn bez duplikování mezi projekty a ověřuje integritu pomocí checksum. yarn vždy generuje yarn.lock při každé instalaci, zatímco package-lock.json v npm se objevil až ve verzi 5.
Od yarn 2 (Berry, 2020) byl yarn kompletně přepsán v TypeScriptu a podporuje Plug'n'Play, workspaces, constraints pro monorepozitáře a protokoly instalace z různých zdrojů (npm, git, tarball). yarn 3+ (2022) přidal Zero-Installs — ukládání cache v repozitáři pro okamžitou instalaci bez sítě.
yarn install — hlavní příkaz, který čte package.json a yarn.lock a instaluje závislosti. yarn stahuje balíčky paralelně, což zrychluje instalaci 2-3krát oproti npm 4 a starším verzím. yarn používá offline cache: pokud byl balíček již stažen v jiném projektu, je zkopírován z cache, nikoli stažen znovu.
# Hlavní příkazy yarn
$ yarn install
$ yarn add react-native-webview
$ yarn add --dev typescript
$ yarn global add expo-cli
# Interaktivní aktualizace
$ yarn upgrade-interactive
# Odstranění duplicitních balíčků
$ yarn dedupe
yarn add — příkaz pro instalaci nového balíčku. yarn add <package> přidává do dependencies, yarn add --dev — do devDependencies. yarn automaticky aktualizuje yarn.lock. yarn upgrade aktualizuje balíčky na nejnovější verze v rámci sémantického rozsahu. yarn upgrade-interactive — interaktivní režim výběru konkrétních balíčků k aktualizaci.
yarn cache — globální cache v ~/.cache/yarn/v6. Každý balíček je uložen jednou v ZIP archivu s kontrolním součtem. yarn cache se čistí automaticky, ale lze ručně spustit yarn cache clean. yarn cache dir ukazuje cestu k cache. yarn cache list — seznam balíčků v cache.
yarn.lock — soubor pro fixaci přesných verzí všech závislostí a jejich tranzitivních balíčků. Na rozdíl od package-lock.json (JSON) používá yarn.lock formát YAML s plochou strukturou. yarn.lock je vždy automaticky generován při yarn install nebo yarn add — to zaručuje, že všichni vývojáři a CI servery obdrží identickou sadu balíčků.
# Příklad struktury 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..."
Pole yarn.lock: version — přesná verze balíčku, resolution — zdroj a verze, dependencies — jeho závislosti, checksum — kontrolní součet pro ověření. yarn.lock se commitue do repozitáře a je jediným zdrojem pravdy pro závislosti. Pokud yarn.lock a package.json nesouhlasí, yarn vydá varování.
Yarn constraints — systém pravidel pro monorepozitáře, který kontroluje a vynucuje verze závislostí v yarn.lock. Omezení jsou popsána v souboru yarn.constraints.js v jazyce Yarn Constraint Language. Constraints umožňují zaručit, že všechny balíčky v monorepozitáři používají stejnou verzi Reactu nebo TypeScriptu.
React Native je tradičně úzce spjat s yarn. Expo CLI, React Native CLI a Create React Native App původně používaly yarn. V React Native projektech yarn.lock fixuje verze nativních modulů, což je kritické pro stabilní kompilaci přes CocoaPods (iOS) a Gradle (Android). yarn workspaces jsou populární v React Native monorepozitářích se sdíleným kódem.
yarn workspaces v React Native monorepozitářích: kořenový package.json obsahuje "workspaces": ["packages/*", "mobile"]. yarn install vytvoří jedinou složku node_modules na kořenové úrovni. Balíčky na sebe odkazují přes symlinky. npx pod-install se spouští po změně nativních závislostí pro aktualizaci 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+ oficiálně doporučuje yarn pro nové projekty vytvořené přes npx create-expo-app. yarn zajišťuje kompatibilitu s Expo moduly a automaticky generuje správný yarn.lock. Zero-Installs v yarn 3+ umožňuje committovat cache do repozitáře — vývojáři obdrží hotové prostředí bez instalace závislostí po git clone.
npm a yarn řeší stejný úkol — správu balíčků Node.js. S vydáním npm 5-7 funkční propast prakticky zmizela. npm 7+ zahrnuje workspaces, npm ci (ekvivalent yarn install --frozen-lockfile) a paralelní instalaci. yarn si však udržuje výhody ve specifických scénářích: Plug'n'Play, Zero-Installs a vyspělý systém constraints.
| Vlastnost | npm | yarn |
|---|---|---|
| Rok vytvoření | 2010 | 2016 |
| Lock soubor | package-lock.json (JSON) | yarn.lock (YAML) |
| Instalace | Sekvenční (npm 5+) | Paralelní |
| Plug'n'Play | Ne | Ano (yarn 2+) |
| Workspaces | Ano (npm 7+) | Ano |
| Zero-Installs | Ne | Ano (yarn 3+) |
| Cache | node_modules s flatteningem | Globální ~/.cache/yarn |
| Jazyk implementace | JavaScript | TypeScript (yarn 2+) |
Kdy zvolit yarn: projekty na Expo SDK 50+, velké monorepozitáře (100+ balíčků), týmy oceňující Zero-Installs pro rychlé nastavení prostředí a legacy projekty již používající yarn. Kdy zvolit npm: standardní projekty create-react-app, Next.js, Vite, týmy bez specifických požadavků na správce balíčků.
yarn 4 (2024) představil vylepšený výkon, nativní podporu ESM a optimalizaci pro velké monorepozitáře. npm 10+ se nadále vyvíjí s důrazem na bezpečnost a kompatibilitu. Volba mezi npm a yarn je dnes otázkou týmových preferencí a konkrétních požadavků projektu, nikoli technické převahy jednoho nástroje.
Často kladené otázky
yarn původně předčil npm v rychlosti díky paralelní instalaci balíčků a agresivnímu cacheování. yarn.lock je automaticky generován při každé instalaci, zatímco package-lock.json se objevil v npm 5. yarn nabízí Plug'n'Play — alternativu k node_modules s nulovým časem instalace. Od npm 7+ je rozdíl v rychlosti a funkcionalitě pro základní scénáře minimální.
yarn workspaces — mechanismus správy více balíčků v jednom repozitáři. Kořenový package.json obsahuje pole "workspaces": ["packages/*"]. yarn install instaluje společné závislosti na horní úrovni do jediného node_modules, vytváří symlinky mezi lokálními balíčky a zabraňuje duplikování. Příkazy se spouštějí pro všechny workspace přes yarn workspaces run <script>.
Plug'n'Play (PnP) — alternativa k tradiční složce node_modules, představená v yarn 2. Místo kopírování souborů yarn vytvoří mapu závislostí v .pnp.cjs a ukládá balíčky v ZIP archivech v globální cache. Výhody PnP: instalace během sekund, doba spouštění Node.js se snižuje o 30-50%, absence node_modules a souvisejících problémů s cestami.
Nainstalujte yarn globálně: npm install -g yarn. V kořenu projektu spusťte yarn import — yarn přečte package-lock.json a vytvoří ekvivalentní yarn.lock. Smažte node_modules a package-lock.json, spusťte yarn install pro ověření. Aktualizujte konfiguraci CI/CD, nahraďte npm za yarn. yarn je plně kompatibilní s package.json.
Chyba "Integrity check failed" nastává při nesouladu mezi yarn.lock a node_modules. Řešení: smažte node_modules, yarn.lock a vyčistěte cache (yarn cache clean), poté znovu spusťte yarn install. Pro konflikty verzí použijte yarn upgrade-interactive k výběru konkrétních aktualizací. yarn dedupe odstraní duplicitní balíčky.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také