yarn — alternatywny menedżer pakietów dla Node.js, stworzony przez Facebook we współpracy z Exponent, Google i Tilde w 2016 roku. yarn rozwiązywał problemy szybkości i bezpieczeństwa npm 2-4: równoległa instalacja, ścisły plik blokady i offline'owy cache. Dziś yarn zachowuje popularność w React Native, Expo i monorepozytoriach. Więcej na yarn Documentation.
Najważniejsze
yarn (Yet Another Resource Negotiator) wydany w październiku 2016 roku jako odpowiedź Facebooka na problemy npm 2-4: powolna instalacja, brak pliku blokady i niebezpieczne pakiety. yarn zaproponował równoległe pobieranie pakietów, deterministyczny yarn.lock i weryfikację integralności za pomocą sum kontrolnych. W 2020 yarn przeszedł na wersję 2 (Berry) z Plug'n'Play i podejściem TypeScript-first.
Architektura yarn różni się od npm: yarn pobiera pakiety równolegle (npm do wersji 5 — sekwencyjnie), cache'uje każdy pakiet w ~/.cache/yarn bez duplikowania między projektami i weryfikuje integralność przez checksum. yarn zawsze generuje yarn.lock przy każdej instalacji, podczas gdy package-lock.json w npm pojawił się dopiero w wersji 5.
Począwszy od yarn 2 (Berry, 2020), yarn został całkowicie przepisany w TypeScript i obsługuje Plug'n'Play, workspaces, constraints dla monorepozytoriów oraz protokoły instalacji z różnych źródeł (npm, git, tarball). yarn 3+ (2022) dodał Zero-Installs — przechowywanie cache w repozytorium do błyskawicznej instalacji bez sieci.
yarn install — główne polecenie, które odczytuje package.json i yarn.lock oraz instaluje zależności. yarn pobiera pakiety równolegle, co przyspiesza instalację 2-3 razy w porównaniu z npm 4 i wcześniejszymi wersjami. yarn korzysta z offline'owego cache: jeśli pakiet został już pobrany w innym projekcie, jest kopiowany z cache, a nie pobierany ponownie.
# Główne polecenia yarn
$ yarn install
$ yarn add react-native-webview
$ yarn add --dev typescript
$ yarn global add expo-cli
# Aktualizacja interaktywna
$ yarn upgrade-interactive
# Usuwanie zduplikowanych pakietów
$ yarn dedupe
yarn add — polecenie do instalacji nowego pakietu. yarn add <package> dodaje do dependencies, yarn add --dev — do devDependencies. yarn automatycznie aktualizuje yarn.lock. yarn upgrade aktualizuje pakiety do najnowszych wersji w ramach zakresu semantycznego. yarn upgrade-interactive — tryb interaktywnego wyboru konkretnych pakietów do aktualizacji.
yarn cache — globalny cache w ~/.cache/yarn/v6. Każdy pakiet jest przechowywany raz w archiwum ZIP z sumą kontrolną. yarn cache czyści się automatycznie, ale można ręcznie wykonać yarn cache clean. yarn cache dir pokazuje ścieżkę do cache. yarn cache list — lista zapisanych w cache pakietów.
yarn.lock — plik blokady dokładnych wersji wszystkich zależności i ich pakietów przechodnich. W przeciwieństwie do package-lock.json (JSON), yarn.lock używa formatu YAML z płaską strukturą. yarn.lock jest zawsze generowany automatycznie podczas yarn install lub yarn add — gwarantuje to, że wszyscy programiści i serwery CI otrzymają identyczny zestaw pakietów.
# Przykład 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..."
Pola yarn.lock: version — dokładna wersja pakietu, resolution — źródło i wersja, dependencies — jego zależności, checksum — suma kontrolna do weryfikacji. yarn.lock jest commitowany do repozytorium i stanowi jedyne źródło prawdy dla zależności. Jeśli yarn.lock i package.json są niezgodne, yarn wyświetla ostrzeżenie.
Yarn constraints — system reguł dla monorepozytoriów, który sprawdza i wymusza wersje zależności w yarn.lock. Ograniczenia opisuje się w pliku yarn.constraints.js w języku Yarn Constraint Language. Constraints pozwalają zagwarantować, że wszystkie pakiety w monorepozytorium używają tej samej wersji React lub TypeScript.
React Native tradycyjnie jest ściśle związany z yarn. Expo CLI, React Native CLI i Create React Native App początkowo używały yarn. W projektach React Native yarn.lock blokuje wersje modułów natywnych, co jest kluczowe dla stabilnej kompilacji przez CocoaPods (iOS) i Gradle (Android). yarn workspaces są popularne w monorepozytoriach React Native ze współdzielonym kodem.
yarn workspaces w monorepozytoriach React Native: główny package.json zawiera "workspaces": ["packages/*", "mobile"]. yarn install tworzy jeden folder node_modules na głównym poziomie. Pakiety odwołują się do siebie przez symlinki. npx pod-install jest wykonywane po zmianie zależności natywnych w celu aktualizacji 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+ oficjalnie zaleca yarn dla nowych projektów tworzonych przez npx create-expo-app. yarn zapewnia kompatybilność z modułami Expo i automatycznie generuje poprawny yarn.lock. Zero-Installs w yarn 3+ pozwala commitować cache do repozytorium — programiści otrzymują gotowe środowisko bez instalowania zależności po git clone.
npm i yarn rozwiązują to samo zadanie — zarządzanie pakietami Node.js. Od wydania npm 5-7 różnica funkcjonalna praktycznie zniknęła. npm 7+ zawiera workspaces, npm ci (odpowiednik yarn install --frozen-lockfile) i instalację równoległą. Jednak yarn zachowuje przewagę w konkretnych scenariuszach: Plug'n'Play, Zero-Installs i dojrzały system constraints.
| Cecha | npm | yarn |
|---|---|---|
| Rok powstania | 2010 | 2016 |
| Plik blokady | package-lock.json (JSON) | yarn.lock (YAML) |
| Instalacja | Sekwencyjna (npm 5+) | Równoległa |
| Plug'n'Play | Nie | Tak (yarn 2+) |
| Workspaces | Tak (npm 7+) | Tak |
| Zero-Installs | Nie | Tak (yarn 3+) |
| Cache | node_modules z flattening | Globalny ~/.cache/yarn |
| Język implementacji | JavaScript | TypeScript (yarn 2+) |
Kiedy wybrać yarn: projekty na Expo SDK 50+, duże monorepozytoria (100+ pakietów), zespoły ceniące Zero-Installs do szybkiej konfiguracji środowiska oraz projekty legacy już używające yarn. Kiedy wybrać npm: standardowe projekty create-react-app, Next.js, Vite, zespoły bez specyficznych wymagań dotyczących menedżera pakietów.
yarn 4 (2024) wprowadził ulepszoną wydajność, natywną obsługę ESM i optymalizację dla dużych monorepozytoriów. npm 10+ nadal rozwija się z naciskiem na bezpieczeństwo i kompatybilność. Wybór między npm a yarn to dziś kwestia preferencji zespołu i konkretnych wymagań projektu, a nie technicznej przewagi jednego narzędzia.
Często zadawane pytania
yarn początkowo wyprzedzał npm pod względem szybkości dzięki równoległej instalacji pakietów i agresywnemu cache'owaniu. yarn.lock jest automatycznie generowany przy każdej instalacji, podczas gdy package-lock.json pojawił się w npm 5. yarn oferuje Plug'n'Play — alternatywę dla node_modules z zerowym czasem instalacji. Od npm 7+ różnica w szybkości i funkcjonalności dla podstawowych scenariuszy jest minimalna.
yarn workspaces — mechanizm zarządzania wieloma pakietami w jednym repozytorium. Główny package.json zawiera pole "workspaces": ["packages/*"]. yarn install instaluje wspólne zależności na najwyższym poziomie w jednym node_modules, tworzy symlinki między lokalnymi pakietami i unika duplikowania. Polecenia są uruchamiane dla wszystkich workspace przez yarn workspaces run <script>.
Plug'n'Play (PnP) — alternatywa dla tradycyjnego folderu node_modules, wprowadzona w yarn 2. Zamiast kopiowania plików yarn tworzy mapę zależności w .pnp.cjs i przechowuje pakiety w archiwach ZIP w globalnym cache. Zalety PnP: instalacja w kilka sekund, czas uruchamiania Node.js skrócony o 30-50%, brak node_modules i związanych z nimi problemów ze ścieżkami.
Zainstaluj yarn globalnie: npm install -g yarn. W katalogu głównym projektu wykonaj yarn import — yarn odczyta package-lock.json i utworzy równoważny yarn.lock. Usuń node_modules i package-lock.json, wykonaj yarn install w celu weryfikacji. Zaktualizuj konfigurację CI/CD, zastępując npm na yarn. yarn jest w pełni kompatybilny z package.json.
Błąd "Integrity check failed" występuje przy niezgodności yarn.lock i node_modules. Rozwiązanie: usuń node_modules, yarn.lock i wyczyść cache (yarn cache clean), następnie wykonaj yarn install od nowa. W przypadku konfliktów wersji użyj yarn upgrade-interactive do wyboru konkretnych aktualizacji. yarn dedupe usunie zduplikowane pakiety.
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również