yarn — un gestore di pacchetti alternativo per Node.js, creato da Facebook insieme a Exponent, Google e Tilde nel 2016. yarn ha risolto i problemi di velocità e sicurezza di npm 2-4: installazione parallela, file di blocco rigoroso e cache offline. Oggi yarn rimane popolare in React Native, Expo e monorepo. Scopri di più su yarn Documentation.
Punti chiave
yarn (Yet Another Resource Negotiator) è stato rilasciato nell'ottobre 2016 come risposta di Facebook ai problemi di npm 2-4: installazione lenta, mancanza di file di blocco e pacchetti non sicuri. yarn ha introdotto download paralleli di pacchetti, yarn.lock deterministico e verifica dell'integrità tramite checksum. Nel 2020 yarn è passato alla versione 2 (Berry) con Plug'n'Play e un approccio TypeScript-first.
L'architettura di yarn differisce da npm: yarn scarica i pacchetti in parallelo (npm prima della versione 5 — sequenzialmente), memorizza nella cache ogni pacchetto in ~/.cache/yarn senza duplicazione tra progetti e verifica l'integrità tramite checksum. yarn genera sempre yarn.lock a ogni installazione, mentre package-lock.json in npm è apparso solo nella versione 5.
A partire da yarn 2 (Berry, 2020), yarn è stato completamente riscritto in TypeScript e supporta Plug'n'Play, workspaces, constraints per monorepo e protocolli di installazione da diverse fonti (npm, git, tarball). yarn 3+ (2022) ha aggiunto Zero-Installs — memorizzare la cache nel repository per un'installazione istantanea senza accesso alla rete.
yarn install — il comando principale che legge package.json e yarn.lock e installa le dipendenze. yarn scarica i pacchetti in parallelo, accelerando l'installazione di 2-3 volte rispetto a npm 4 e versioni precedenti. yarn utilizza una cache offline: se un pacchetto è già stato scaricato in un altro progetto, viene copiato dalla cache invece di essere scaricato nuovamente.
# Comandi base di yarn
$ yarn install
$ yarn add react-native-webview
$ yarn add --dev typescript
$ yarn global add expo-cli
# Aggiornamento interattivo
$ yarn upgrade-interactive
# Rimuovi pacchetti duplicati
$ yarn dedupe
yarn add — il comando per installare un nuovo pacchetto. yarn add <package> aggiunge a dependencies, yarn add --dev — a devDependencies. yarn aggiorna automaticamente yarn.lock. yarn upgrade aggiorna i pacchetti alle ultime versioni nell'intervallo semantico. yarn upgrade-interactive — una modalità interattiva per selezionare pacchetti specifici da aggiornare.
yarn cache — una cache globale in ~/.cache/yarn/v6. Ogni pacchetto viene memorizzato una volta in un archivio ZIP con un checksum. La cache di yarn viene pulita automaticamente, ma è possibile eseguire yarn cache clean manualmente. yarn cache dir mostra il percorso della cache. yarn cache list — elenca i pacchetti in cache.
yarn.lock — un file di blocco che registra le versioni esatte di tutte le dipendenze e dei loro pacchetti transitivi. A differenza di package-lock.json (JSON), yarn.lock utilizza un formato YAML con struttura piatta. yarn.lock viene sempre generato automaticamente durante yarn install o yarn add — questo garantisce che tutti gli sviluppatori e i server CI ottengano un set identico di pacchetti.
# Esempio di struttura 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..."
Campi di yarn.lock: version — versione esatta del pacchetto, resolution — sorgente e versione, dependencies — le sue dipendenze, checksum — checksum per la verifica. yarn.lock viene committato nel repository ed è l'unica fonte di verità per le dipendenze. Se yarn.lock e package.json divergono, yarn emette un avviso.
Yarn constraints — un sistema di regole per monorepo che verifica e impone le versioni delle dipendenze in yarn.lock. I vincoli sono descritti nel file yarn.constraints.js utilizzando Yarn Constraint Language. I constraints consentono di garantire che tutti i pacchetti in un monorepo utilizzino la stessa versione di React o TypeScript.
React Native è stato tradizionalmente strettamente legato a yarn. Expo CLI, React Native CLI e Create React Native App utilizzavano inizialmente yarn. Nei progetti React Native, yarn.lock blocca le versioni dei moduli nativi, il che è criticamente importante per la compilazione stabile tramite CocoaPods (iOS) e Gradle (Android). yarn workspaces sono popolari nei monorepo React Native con codice condiviso.
yarn workspaces nei monorepo React Native: il package.json radice contiene "workspaces": ["packages/*", "mobile"]. yarn install crea un'unica cartella node_modules a livello radice. I pacchetti si riferiscono l'un l'altro tramite symlink. npx pod-install viene eseguito dopo aver modificato le dipendenze native per aggiornare 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+ raccomanda ufficialmente yarn per i nuovi progetti creati tramite npx create-expo-app. yarn garantisce la compatibilità con i moduli Expo e genera automaticamente il corretto yarn.lock. Zero-Installs in yarn 3+ consente di committare la cache nel repository — gli sviluppatori ottengono un ambiente pronto all'uso senza installare dipendenze dopo git clone.
npm e yarn risolvono lo stesso problema — la gestione dei pacchetti Node.js. Con il rilascio di npm 5-7, il divario funzionale è praticamente scomparso. npm 7+ include workspaces, npm ci (equivalente a yarn install --frozen-lockfile) e installazione parallela. Tuttavia, yarn mantiene vantaggi in scenari specifici: Plug'n'Play, Zero-Installs e un sistema maturo di constraints.
| Caratteristica | npm | yarn |
|---|---|---|
| Anno di creazione | 2010 | 2016 |
| File di blocco | package-lock.json (JSON) | yarn.lock (YAML) |
| Installazione | Sequenziale (npm 5+) | Parallela |
| Plug'n'Play | No | Sì (yarn 2+) |
| Workspaces | Sì (npm 7+) | Sì |
| Zero-Installs | No | Sì (yarn 3+) |
| Cache | node_modules con flattening | Globale ~/.cache/yarn |
| Linguaggio di implementazione | JavaScript | TypeScript (yarn 2+) |
Quando scegliere yarn: progetti su Expo SDK 50+, grandi monorepo (100+ pacchetti), team che apprezzano Zero-Installs per una configurazione rapida dell'ambiente e progetti legacy che già utilizzano yarn. Quando scegliere npm: progetti standard create-react-app, Next.js, Vite, team senza requisiti specifici di gestore di pacchetti.
yarn 4 (2024) ha introdotto prestazioni migliorate, supporto nativo ESM e ottimizzazione per grandi monorepo. npm 10+ continua a evolversi con focus su sicurezza e compatibilità. La scelta tra npm e yarn oggi è una questione di preferenze del team e requisiti specifici del progetto, non di superiorità tecnica di uno strumento sull'altro.
Domande frequenti
yarn inizialmente ha superato npm in velocità grazie all'installazione parallela dei pacchetti e alla memorizzazione aggressiva nella cache. yarn.lock viene generato automaticamente a ogni installazione, mentre package-lock.json è apparso in npm 5. yarn offre Plug'n'Play — un'alternativa a node_modules con tempo di installazione zero. Con npm 7+, la differenza in velocità e funzionalità per scenari di base è minima.
yarn workspaces — un meccanismo per gestire più pacchetti in un singolo repository. Il package.json radice contiene il campo "workspaces": ["packages/*"]. yarn install installa le dipendenze condivise al livello superiore in un unico node_modules, crea symlink tra i pacchetti locali ed evita la duplicazione. I comandi vengono eseguiti per tutti i workspaces tramite yarn workspaces run <script>.
Plug'n'Play (PnP) — un'alternativa alla cartella node_modules tradizionale, introdotta in yarn 2. Invece di copiare file, yarn crea una mappa delle dipendenze in .pnp.cjs e memorizza i pacchetti in archivi ZIP in una cache globale. Vantaggi di PnP: installazione in secondi, tempo di avvio di Node.js ridotto del 30-50%, nessun node_modules e problemi di percorso associati.
Installa yarn globalmente: npm install -g yarn. Nella radice del progetto, esegui yarn import — yarn legge package-lock.json e crea un yarn.lock equivalente. Elimina node_modules e package-lock.json, esegui yarn install per verificare. Aggiorna la configurazione CI/CD sostituendo npm con yarn. yarn è completamente compatibile con package.json.
L'errore "Integrity check failed" si verifica quando yarn.lock e node_modules non sono sincronizzati. Soluzione: elimina node_modules, yarn.lock e pulisci la cache (yarn cache clean), quindi esegui nuovamente yarn install. Per i conflitti di versione, utilizza yarn upgrade-interactive per selezionare aggiornamenti specifici. yarn dedupe rimuoverà i pacchetti duplicati.
Riepilogo
Svilupperemo un'applicazione mobile chiavi in mano
IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.
Leggi anche