yarn — un manager de pachete alternativ pentru Node.js, creat de Facebook împreună cu Exponent, Google și Tilde în 2016. yarn rezolva problemele de viteză și securitate ale npm 2-4: instalare paralelă, fișier de blocare strict și cache offline. Astăzi yarn își păstrează popularitatea în React Native, Expo și monorepozitorii. Mai multe pe yarn Documentation.
Principalele puncte
yarn (Yet Another Resource Negotiator) lansat în octombrie 2016 ca răspuns al Facebook la problemele npm 2-4: instalare lentă, lipsa fișierului de blocare și pachete nesigure. yarn a propus încărcarea paralelă a pachetelor, yarn.lock determinist și verificarea integrității prin sume de control. În 2020 yarn a trecut la versiunea 2 (Berry) cu Plug'n'Play și abordare TypeScript-first.
Arhitectura yarn diferă de npm: yarn încarcă pachetele în paralel (npm până la versiunea 5 — secvențial), cache-ază fiecare pachet în ~/.cache/yarn fără duplicare între proiecte și verifică integritatea prin checksum. yarn generează întotdeauna yarn.lock la orice instalare, în timp ce package-lock.json în npm a apărut doar în versiunea 5.
Începând cu yarn 2 (Berry, 2020), yarn a fost rescris complet în TypeScript și suportă Plug'n'Play, workspaces, constraints pentru monorepozitorii și protocoale de instalare din diferite surse (npm, git, tarball). yarn 3+ (2022) a adăugat Zero-Installs — stocarea cache-ului în repository pentru instalare instantanee fără rețea.
yarn install — comanda principală care citește package.json și yarn.lock și instalează dependențele. yarn încarcă pachetele în paralel, ceea ce accelerează instalarea de 2-3 ori comparativ cu npm 4 și versiunile anterioare. yarn utilizează cache-ul offline: dacă un pachet a fost deja descărcat în alt proiect, este copiat din cache, nu descărcat din nou.
# Comenzile principale yarn
$ yarn install
$ yarn add react-native-webview
$ yarn add --dev typescript
$ yarn global add expo-cli
# Actualizare interactivă
$ yarn upgrade-interactive
# Eliminarea pachetelor duplicate
$ yarn dedupe
yarn add — comanda pentru instalarea unui pachet nou. yarn add <package> adaugă în dependencies, yarn add --dev — în devDependencies. yarn actualizează automat yarn.lock. yarn upgrade actualizează pachetele la cele mai recente versiuni în intervalul semantic. yarn upgrade-interactive — modul interactiv de selectare a pachetelor specifice pentru actualizare.
yarn cache — cache-ul global în ~/.cache/yarn/v6. Fiecare pachet este stocat o singură dată într-o arhivă ZIP cu sumă de control. yarn cache se curăță automat, dar se poate executa yarn cache clean manual. yarn cache dir arată calea către cache. yarn cache list — lista pachetelor din cache.
yarn.lock — fișier de fixare a versiunilor exacte ale tuturor dependențelor și pachetelor lor tranzitive. Spre deosebire de package-lock.json (JSON), yarn.lock utilizează formatul YAML cu o structură plată. yarn.lock este întotdeauna generat automat la yarn install sau yarn add — aceasta garantează că toți dezvoltatorii și serverele CI primesc același set de pachete.
# Exemplu de structură 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..."
Câmpurile yarn.lock: version — versiunea exactă a pachetului, resolution — sursa și versiunea, dependencies — dependențele sale, checksum — suma de control pentru verificare. yarn.lock este comis în repository și este singura sursă de adevăr pentru dependențe. Dacă yarn.lock și package.json nu coincid, yarn emite un avertisment.
Yarn constraints — sistem de reguli pentru monorepozitorii care verifică și impune versiunile dependențelor în yarn.lock. Restricțiile sunt descrise în fișierul yarn.constraints.js în Yarn Constraint Language. Constraints permit garantarea că toate pachetele din monorepozitoriu utilizează aceeași versiune de React sau TypeScript.
React Native este în mod tradițional strâns legat de yarn. Expo CLI, React Native CLI și Create React Native App au folosit inițial yarn. În proiectele React Native, yarn.lock fixează versiunile modulelor native, ceea ce este critic pentru compilarea stabilă prin CocoaPods (iOS) și Gradle (Android). yarn workspaces sunt populare în monorepozitoriile React Native cu cod partajat.
yarn workspaces în monorepozitoriile React Native: package.json rădăcină conține "workspaces": ["packages/*", "mobile"]. yarn install creează un singur folder node_modules la nivelul rădăcină. Pachetele se referă unele la altele prin symlinkuri. npx pod-install se execută după modificarea dependențelor native pentru actualizarea 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+ recomandă oficial yarn pentru proiectele noi create prin npx create-expo-app. yarn asigură compatibilitatea cu modulele Expo și generează automat yarn.lock corect. Zero-Installs în yarn 3+ permite comiterea cache-ului în repository — dezvoltatorii primesc un mediu gata fără instalarea dependențelor după git clone.
npm și yarn rezolvă aceeași sarcină — gestionarea pachetelor Node.js. Odată cu lansarea npm 5-7, diferența funcțională a dispărut practic. npm 7+ include workspaces, npm ci (echivalentul yarn install --frozen-lockfile) și instalare paralelă. Cu toate acestea, yarn păstrează avantaje în scenarii specifice: Plug'n'Play, Zero-Installs și un sistem matur de constraints.
| Caracteristică | npm | yarn |
|---|---|---|
| Anul creării | 2010 | 2016 |
| Fișier de blocare | package-lock.json (JSON) | yarn.lock (YAML) |
| Instalare | Secvențială (npm 5+) | Paralelă |
| Plug'n'Play | Nu | Da (yarn 2+) |
| Workspaces | Da (npm 7+) | Da |
| Zero-Installs | Nu | Da (yarn 3+) |
| Cache | node_modules cu flattening | Global ~/.cache/yarn |
| Limbaj de implementare | JavaScript | TypeScript (yarn 2+) |
Când să alegeți yarn: proiecte pe Expo SDK 50+, monorepozitorii mari (100+ pachete), echipe care apreciază Zero-Installs pentru configurarea rapidă a mediului și proiecte moștenite care folosesc deja yarn. Când să alegeți npm: proiecte standard create-react-app, Next.js, Vite, echipe fără cerințe specifice față de managerul de pachete.
yarn 4 (2024) a introdus performanță îmbunătățită, suport nativ ESM și optimizare pentru monorepozitorii mari. npm 10+ continuă să se dezvolte cu accent pe securitate și compatibilitate. Alegerea între npm și yarn astăzi este o chestiune de preferințe ale echipei și cerințe specifice ale proiectului, nu de superioritate tehnică a unui instrument.
Întrebări frecvente
yarn a depășit inițial npm în viteză datorită instalării paralele a pachetelor și cache-ului agresiv. yarn.lock este generat automat la orice instalare, în timp ce package-lock.json a apărut în npm 5. yarn oferă Plug'n'Play — o alternativă la node_modules cu timp de instalare zero. Cu npm 7+ diferența de viteză și funcționalitate pentru scenariile de bază este minimă.
yarn workspaces — mecanism de gestionare a mai multor pachete într-un singur repository. package.json rădăcină conține câmpul "workspaces": ["packages/*"]. yarn install instalează dependențele comune la nivelul superior într-un singur node_modules, creează symlinkuri între pachetele locale și evită duplicarea. Comenzile se execută pentru toate workspace-urile prin yarn workspaces run <script>.
Plug'n'Play (PnP) — o alternativă la folderul tradițional node_modules, introdusă în yarn 2. În loc să copieze fișiere, yarn creează o hartă a dependențelor în .pnp.cjs și stochează pachetele în arhive ZIP în cache-ul global. Avantajele PnP: instalare în câteva secunde, timpul de pornire a Node.js se reduce cu 30-50%, absența node_modules și a problemelor de căi asociate.
Instalați yarn global: npm install -g yarn. În rădăcina proiectului executați yarn import — yarn va citi package-lock.json și va crea un yarn.lock echivalent. Ștergeți node_modules și package-lock.json, executați yarn install pentru verificare. Actualizați configurația CI/CD, înlocuind npm cu yarn. yarn este complet compatibil cu package.json.
Eroarea "Integrity check failed" apare la nepotrivirea dintre yarn.lock și node_modules. Soluție: ștergeți node_modules, yarn.lock și goliți cache-ul (yarn cache clean), apoi executați yarn install din nou. Pentru conflicte de versiuni utilizați yarn upgrade-interactive pentru a selecta actualizări specifice. yarn dedupe va elimina pachetele duplicate.
Concluzii
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și