Proč řešit správu balíčků v ekosystému Node.js
Správa balíčků je páteří vývoje v Node.js. Nástroje npm a Yarn řídí instalaci závislostí, verzování, skripty, workspaces v monorepech i publikaci modulů. Cílem je deterministická, bezpečná a rychlá reprodukovatelnost prostředí napříč týmy, CI/CD a produkcí. Tento článek srovnává klíčové koncepty, postupy a rozdíly mezi npm a Yarn (Classic i Berry) a představuje doporučené postupy.
Architektura: registry, klient, resolver a linker
- Registr: Výchozím je veřejný registr npm. Lze využít privátní registry a proxy (např. Verdaccio, Nexus, Artifactory) pro ukládání do mezipaměti a řízení přístupu.
- Resolver: Řeší strom závislostí podle pravidel semver, peer závislostí a rozlišení přímých a tranzitivních závislostí.
- Linker: Vytváří fyzickou reprezentaci stromu (adresář
node_modules, nebo u Yarn PnP virtuální mapování).
Základní workflow a inicializace projektu
- Inicializace:
npm init -yneboyarn init -2(Yarn Berry) vytvořípackage.jsona případně.yarnrc.yml. - Instalace závislostí:
npm install, respektiveyarn install. Přidání balíčku:npm i reactneboyarn add react. - Odstranění:
npm uninstalloprotiyarn remove; aktualizace:npm updateoprotiyarn up.
Soubor package.json: kontrakt projektu
package.json definuje metadata balíčku, skripty a závislosti. Klíčové sekce:
- name, version: Identita balíčku a jeho verze podle semver.
- scripts: Příkazy spouštěné přes
npm runneboyarn(např.build,test,start). - dependencies, devDependencies: Běhové a vývojové závislosti.
- peerDependencies, optionalDependencies: Závislosti pro pluginy a volitelné funkce s mírnějšími požadavky.
- engines: Požadované verze Node.js a npm/yarn pro konzistentní běh.
- exports, main, types: Vstupní body pro ESM/CJS a deklarace typů.
Semver a rozsahy verzí
- Major.Minor.Patch:
1.2.3; major může obsahovat změny narušující zpětnou kompatibilitu, minor přidává funkce a patch opravuje chyby. - Rozsahy:
^1.2.3povoluje minor/patch,~1.2.3pouze patch; pevné připnutí verze minimalizuje drift. - Předběžná verze:
1.2.3-beta.1vyžaduje explicitní povolení v resolveru.
Lockfile: deterministická reprodukovatelnost
- npm:
package-lock.jsonuzamyká přesné verze a kontrolní součty integrity. - Yarn:
yarn.lock(Classic) neboyarn.locks metadaty Berry; verze lockfile se mezi generacemi liší. - Praxe: Zařazujte do VCS, ručně neupravujte a při změně registru zneplatněte. V CI používejte
npm cineboyarn install --immutablepro přísnou konzistenci.
Node_modules vs. Plug’n’Play (Yarn Berry)
- Model node_modules: Tradiční fyzický strom závislostí, kompatibilní se všemi nástroji; může být rozsáhlý a obsahovat duplicity.
- Yarn PnP: Virtuální mapování bez
node_modules; rychlejší instalace a rozlišení závislostí; vyžaduje kompatibilitu nástrojů a PnP loader. - Volba linkeru: Yarn umožňuje přepnout na
nodeLinker: node-moduleskvůli kompatibilitě.
Workspaces a monorepo
- npm workspaces: Definice balíčků v monorepu, sdílený lockfile a lokální propojení balíčků.
- Yarn workspaces: Pokročilé funkce (constraints, protocache,
yarn workspaces foreach), podrobné řízení spouštění skriptů a paralelizace. - Doporučený postup: Jeden lockfile v kořenovém adresáři, konzistentní omezení verzí a centralizované skripty.
Skripty a lifecycle
- Spouštění:
npm run buildneboyarn build; implicitní mapování nanode_modules/.bin. - Lifecycle hooky:
prebuild,postbuild,prepare(užitečné pro instalace založené na Git),prepublishOnlypro kontrolu před publikací. - Orchestrace: Paralelní běh přes
npm run -wsneboyarn workspaces foreach -p.
Peer dependencies a jejich rozlišení
- Smysl: Plugin očekává hostitelský balíček (např. plugin pro React vyžaduje React v určité verzi).
- npm: Moderní npm může peer závislosti automaticky instalovat pouze za určitých podmínek, odpovědnost však stále nese hostitel.
- Yarn: Berry nabízí pravidla rozlišení a položky
resolutionsnebopackageExtensionspro nápravu chyb v cizích balíčcích.
Resolutions, overrides a deduplikace
- npm overrides: Sekce
overridesvynucuje konkrétní verze tranzitivních závislostí. - Yarn resolutions: Pole
resolutions(Classic) a pokročilejšíconstraints(Berry) definující pravidla pro závislosti. - Deduplikace:
npm dedupeneboyarn dedupezmenší strom a sníží jeho prostorovou náročnost.
Cache, výkon a determinismus v CI
- Adresáře cache: Cache
~/.npm,~/.cache/yarna případně.yarn/cache(Berry) mezi běhy CI. - Neměnné instalace:
npm ciayarn install --immutable --check-cachezajistí shodu s lockfile. - Offline instalace: Yarn Berry umožňuje plně offline instalaci z
.yarn/caches předem staženými artefakty.
Zabezpečení a audit
- Audit zranitelností:
npm auditanpm audit fix; Yarn může auditovat registr npm příkazemyarn npm audit(Berry) nebo pomocí pluginů. - Integrita: Kontrolní součty v lockfile brání podvržení artefaktů; doporučuje se ověřovat integritu v CI.
- Tokeny a 2FA: K publikaci a přístupu k soukromým registrům slouží přístupové tokeny; doporučuje se povolit dvoufaktorové ověřování.
Publikace balíčků
- npm publish: Publikuje podle položek
files,.npmignoreapublishConfig. Štítky (dist-tags), jakolatestanext, umožňují bezpečné postupné nasazování. - Yarn: Ve verzi Classic využívá
yarn publish(obal nad npm); Berry nabízíyarn npm publisha správu verzí pomocíyarn version. - Monorepo: Verzování balíčků koordinujte nástroji typu Changesets, případně pluginy Yarn
version.
ESM vs. CJS a rozložení balíčků
- Duální publikace: Exportní pole
exportss podmínkami pro ESM/CJS, poletype: modulea kompatibilní položkymain/module. - Typy: Položka
typesa sdružování deklarací pro TypeScript, případně jejich generování pomocítscnebo nástrojů pro sestavení.
Migrace mezi npm a Yarn
- Lockfile: Při přechodu vygenerujte nový lockfile pro daný nástroj, původní nemažte bez zálohy a otestujte reprodukovatelnost.
- Kompatibilita s PnP: Pokud nástroje s PnP nefungují, přepněte Yarn na
node-modules. - Workspaces: Ujistěte se, že skripty a kroky sestavení odpovídají syntaxi konkrétního nástroje.
Konfigurace a správa registrů
- .npmrc a .yarnrc.yml: Nastavení registrů, tokenů,
always-auth, zásad pro cache a audity. - Registr pro konkrétní scope: Např.
@company:registry=https://registry.example.compro interní balíčky.
Diagnostika a řešení problémů
- Čistá instalace: Smažte
node_modulesa lockfile, poté spusťtenpm cineboyarn install --immutable. - Konflikty peerDeps: Upravte verze hostitelských balíčků, použijte
overrides/resolutionsnebopackageExtensions. - Odchylky verzí: Upravte rozsahy v
package.jsona podle míry rizika uzamkněte minor/patch verze.
Doporučení pro výkon a provoz
- Menší strom závislostí: Omezte používání náročných knihoven nástrojů a upřednostňujte standardní API nebo malé moduly s jediným účelem.
- Sestavování v CI: Ukládejte do cache Node.js a balíčky, používejte deterministické skripty, neměnné instalace a repozitáře artefaktů.
- Bezpečné skripty: Nepoužívejte zbytečně
postinstalls nedůvěryhodným kódem a kontrolujte zdroje závislostí.
Yarn Classic vs. Yarn Berry: praktické rozdíly
- Classic (v1): Tradiční
node_modules,yarn.lock,workspaces,resolutions. - Berry (v2+): Konfigurace v
.yarnrc.yml, PnP, offline cache v repozitáři, příkazyyarn up,yarn dlx, constraints a systém pluginů. - Kompatibilita: Přepínatelný linker a cílené zavádění podle potřeb projektu a nástrojového řetězce.
Zabezpečení dodavatelského řetězce a správa
- Kontrola závislostí: Seznamy schválených závislostí, pravidelné aktualizace a testy kompatibility.
- Neměnné CI a podpisy: Uzamčené prostředí, kontrola integrity a případné ověřování artefaktů.
- Soukromé registry: Integrace SSO/SCIM, auditní logy, doba uchovávání a zrcadlení veřejného registru s filtrováním.
Doporučené postupy pro týmy
- Standardizujte jeden nástroj (npm nebo Yarn) pro každý repozitář a sjednoťte verze pomocí
enginesa.nvmrc/.node-version. - Zařazujte lockfile do verzovacího systému a v CI používejte neměnné instalace.
- Využívejte workspaces a monorepo pro sdílení kódu a předcházejte duplicitám a odchylkám verzí.
- Zaveďte audit a pravidelné aktualizace s canary releasy.
- Dokumentujte skripty a konvence; každou změnu závislostí podrobte kontrole kódu.
Závěr
Npm i Yarn poskytují robustní správu balíčků pro celý životní cyklus projektu: od inicializace přes vývoj a testování až po publikaci a provoz. Npm vyniká jednoduchostí a všudypřítomností, Yarn (zejména Berry) nabízí pokročilou optimalizaci, PnP a bohatý ekosystém pluginů. Volba závisí na požadavcích týmu a nástrojů, klíčové principy však zůstávají stejné: determinismus (lockfile), bezpečnost (audit, integrita), konzistence (engines, CI) a udržitelná správa závislostí v čase.
