Slovník pojmů
Yarn
Yarn spravuje verze a instalaci JavaScriptových balíčků, projektové příkazy a workspaces. Není to JavaScriptový runtime, registry balíčků ani nástroj pro řízení build grafu monorepa.
Stručná definice
Správce závislostí s více způsoby instalace.
JavaScriptový projekt v package.json deklaruje přímé závislosti, přijatelné rozsahy verzí a scripts. Yarn z těchto údajů, konfigurace projektu a existujícího yarn.lock sestaví úplný strom včetně nepřímých závislostí. Vyřešené verze a kontrolní údaje zapíše do lockfile, aby tým a CI mohly opakovat stejné rozhodnutí.
Moderní Yarn používá jako výchozí instalační strategii Plug’n’Play neboli PnP. Místo běžného adresáře node_modules vytvoří loader .pnp.cjs, který mapuje požadavky balíčků na jejich skutečné umístění. Projekt ale může v .yarnrc.yml zvolit také stabilní node-modules linker nebo pnpm linker; konkrétní podoba instalace tedy závisí na konfiguraci, nikoli pouze na názvu Yarn.
Node.js je runtime, ve kterém JavaScript běží, zatímco Yarn je vývojový nástroj pro správu balíčků. npm řeší podobný problém jiným klientem, konfigurací a lockfilem. Veřejný npm registry nebo privátní registry je samostatná síťová služba, se kterou Yarn komunikuje; není součástí Yarnu ani jeho synonymem.
Jaký problém řeší
Udržuje závislosti a příkazy projektu opakovatelné.
Bez správce balíčků by tým ručně vybíral verze, stahoval archivy a hledal kompatibilní nepřímé závislosti. Yarn tento postup sjednocuje, ale bezpečnost a správnost vybraného kódu musí stále ověřit projekt.
- přidávání, aktualizace a odstraňování knihoven a vývojových nástrojů
- opakovatelná instalace schváleného stromu závislostí podle yarn.lock
- spouštění testů, lintu, buildu nebo lokálního serveru přes scripts v package.json
- správa více aplikací a sdílených balíčků v jednom workspace projektu
- použití veřejných i privátních registrů podle konfigurace a oprávnění
- volba instalační strategie podle kompatibility nástrojů a požadavků týmu
Praktický příklad
Dvě aplikace sdílejí jeden UI balíček.
Kořenový package.json vymezuje workspaces apps/web, apps/admin a packages/ui. Každá část má vlastní manifest a deklaruje jen závislosti, které skutečně používá. Aplikace mohou uvést interní balíček například jako „@shop/ui“: „workspace:^“, takže Yarn odkaz vyřeší proti workspace stejného jména a při publikování zachová odpovídající verzovací rozsah.
Příkaz yarn install se spouští v kořeni a pracuje s jedním projektovým yarn.lock. Skript yarn test:web cíleně spustí test z workspace @shop/web. Yarn tím balíčky rozpozná a zpřístupní jejich závislosti; neodvozuje však automaticky build graf ani nevytváří vzdálenou cache výstupů.
Kořenový package.json
{
"name": "shop-workspace",
"private": true,
"workspaces": ["apps/*", "packages/*"],
"scripts": {
"test:web": "yarn workspace @shop/web test"
}
}
Jak funguje instalace
package.json → resolution → yarn.lock → fetch → link → použití.
Instalace není pouhé kopírování souborů. Yarn nejprve určí konkrétní strom a teprve potom připraví balíčky způsobem zvoleným pro projekt.
- Manifesty Yarn načte kořenový package.json i manifesty workspaces, jejich přímé, vývojové, volitelné a peer závislosti.
- Resolution Rozsahy a protokoly převede na konkrétní balíčky. Existující yarn.lock drží předchozí výsledek, pokud stále odpovídá deklaracím.
- Fetch Chybějící balíčky získá z nastaveného registry nebo jiného deklarovaného zdroje a ověří dostupné kontrolní údaje.
- Link Podle nodeLinker vytvoří PnP mapu, klasické node_modules nebo pnpm-style strukturu se symlinky a hardlinky.
- Build a scripts Podle konfigurace může instalace spustit povolené build lifecycle scripts. Projektové příkazy se následně volají přes yarn run nebo zkráceně yarn název.
Hlavní části a koncepty
Manifest, lockfile, linker a workspaces mají rozdílnou odpovědnost.
Dobře nastavený projekt tyto vrstvy verzováním sváže, ale nezaměňuje jejich účel.
package.json
Manifest popisuje balíček: název, scripts, workspaces a rozsahy dependencies, devDependencies či peerDependencies. Pole packageManager může připnout konkrétní verzi Yarnu pro nástroje, které jej respektují.
yarn.lock
Generovaný lockfile zachycuje konkrétní resolutions celého projektu a patří do verzovacího systému. Nemá se ručně upravovat ani bez kontroly nahrazovat lockfilem jiného správce balíčků.
Dependency resolution
Yarn rozlišuje požadavek na balíček od konkrétního výsledku. Semver rozsah sám neurčuje jedinou verzi; výsledek ovlivní lockfile, dostupné verze, peer závislosti, protokoly a nastavení projektu.
Scripts
Položky v poli scripts poskytují týmu společné příkazy a zpřístupňují binární nástroje lokálních závislostí. Instalační lifecycle scripts cizích balíčků mohou podle konfigurace spouštět kód, proto patří do bezpečnostního review.
Workspaces
Workspace je samostatný balíček uvnitř jednoho Yarn projektu. Workspaces usnadňují společnou instalaci a lokální odkazy, ale samy neurčují architekturu aplikací ani plný dependency graph build úloh.
PnP a další linkery
PnP je současná výchozí strategie a používá .pnp.cjs bez node_modules. node-modules i pnpm linkery jsou stabilní volby; druhý pouze volí pnpm-style rozložení, neznamená použití správce balíčků pnpm.
Výhody, omezení a časté chyby
Přesné rozlišení pomáhá, kompatibilitu je ale nutné ověřit.
Konkrétní přínosy
- jeden verzovaný lockfile pro aplikace a balíčky v projektu
- nativní propojení workspaces a možnost explicitního workspace: protokolu
- volitelný PnP model, který odhaluje nedeklarované závislosti a omezuje práci se stromem node_modules
- jednotné scripts a připnutí verze package manageru pro lokální vývoj a CI
Omezení a časté chyby
- některé nástroje potřebují pro PnP úpravu, editorový SDK nebo packageExtensions
- smíchání yarn.lock s package-lock.json a střídání správců zhoršuje reprodukovatelnost
- necommitnutý nebo svévolně přepsaný lockfile může změnit nepřímé závislosti
- instalační skripty a balíčky představují kód dodavatelského řetězce, ne pouhá data
- workspace projekt může bez jasných hranic vytvořit těsně provázané monorepo
Praktické použití a porovnání
Yarn spravuje balíčky; další vrstvy řeší běh a orchestraci.
Yarn a npm jsou správci balíčků. Oba čtou package.json, instalují závislosti a spouštějí scripts, ale používají vlastní lockfile, konfiguraci a instalační model. Projekt má zvolit jeden nástroj, připnout jeho verzi a používat jej konzistentně v lokálním vývoji i CI.
Node.js spouští aplikaci a většinu JavaScriptového toolingu. Yarn může zajistit, aby byla konkrétní knihovna nebo CLI dostupné, ale není runtime a neurčuje podporovanou verzi Node.js místo samotného projektu. Registry je zase vzdálený zdroj balíčků; Yarn může používat veřejný npm registry i řízený privátní zdroj.
Turborepo řeší jinou vrstvu monorepa: plánuje úlohy podle jejich závislostí a pracuje s cache výstupů. Yarn workspaces především vymezují balíčky, řeší jejich závislosti a lokální propojení. Oba nástroje mohou spolupracovat, ale jeden automaticky nenahrazuje druhý.
Pro jednu aplikaci může Yarn přinést jednotný lockfile a zvolený linker bez nutnosti monorepa. Workspaces dávají smysl, pokud dvě aplikace skutečně sdílejí balíček nebo se změny potřebují verzovat společně. Samotná existence adresářů apps a packages není důvodem sloučit nesouvisející systémy do jednoho repozitáře.
PnP je vhodné zkusit u nového projektu, protože zpřesňuje deklaraci závislostí a vynechává tradiční node_modules. Pokud cílový nástroj PnP nepodporuje a oprava nedává ekonomický smysl, stabilní node-modules linker je legitimní kompatibilní volba. Rozhodnutí patří do verzované .yarnrc.yml a musí projít vývojovým prostředím, testy i buildem.
Bezpečnost a kvalita
Lockfile, verze Yarnu a konfigurace tvoří jeden celek.
Reprodukovatelná instalace vyžaduje stejné vstupy a kontrolované změny, ne pouze stejný příkaz.
- commitnout package.json, yarn.lock, .yarnrc.yml a další záměrně verzované Yarn soubory společně
- připnout verzi správce balíčků a ověřit, že ji lokální prostředí i CI skutečně používají
- v CI používat yarn install --immutable, aby nesoulad manifestů a lockfile skončil chybou
- při review zkontrolovat změny přímých i nepřímých závislostí, zdroj balíčku a lifecycle scripts
- neukládat registry tokeny do package.json, yarn.lock ani sdílené konfigurace repozitáře
- u PnP otestovat editor, test runner, bundler a deployment; problém neskrývat importem nedeklarované závislosti
- neudržovat v jednom projektu více lockfile různých package managerů bez výslovného a dokumentovaného důvodu
Časté otázky
Yarn bez historických zkratek
Je Yarn JavaScriptový runtime?
Ne. Runtime je například Node.js. Yarn je správce balíčků, který řeší závislosti a spouští projektové scripts pomocí dostupného runtime.
Vytváří současný Yarn vždy node_modules?
Ne. Výchozí strategií moderního Yarnu je Plug’n’Play s loaderem .pnp.cjs. Projekt může přes nodeLinker zvolit také stabilní node-modules nebo pnpm režim.
Jaký je rozdíl mezi package.json a yarn.lock?
package.json deklaruje přímé závislosti a přijatelné rozsahy. yarn.lock zachycuje konkrétní vyřešený strom projektu, aby další instalace neopakovala výběr od začátku.
Jsou Yarn workspaces totéž co Turborepo?
Ne. Workspaces vymezují a propojují balíčky v jednom Yarn projektu. Turborepo nad monorepem plánuje úlohy a cachuje jejich výstupy; může Yarn workspaces využít.
Má být yarn.lock v Gitu?
U týmové aplikace ano. Lockfile má být verzovaný a kontrolovaný společně se změnou manifestu, aby vývojáři a CI instalovali stejná rozhodnutí o závislostech.
Osobní zkušenost
Vývojové nástroje mají podporovat opakovatelný build a čitelné hranice projektu.
Při práci na webových aplikacích posuzuji závislosti, CI a strukturu repozitáře společně, aby lokální vývoj odpovídal ověřenému nasazení.