npm (Node Package Manager) è il gestore di pacchetti standard per la piattaforma Node.js, incluso nell'installazione di Node.js. npm gestisce le dipendenze di progetti JavaScript e TypeScript: installa librerie in node_modules, aggiorna le versioni dei pacchetti, risolve i conflitti di versione. package.json è il file di configurazione centrale con metadati ed elenco delle dipendenze. npm Registry è il più grande registro di pacchetti. Scopri di più su npm Registry.
Punti chiave
npm è stato creato nel 2010 da Isaac Schlueter come soluzione per la gestione delle dipendenze di Node.js. Dal 2014 npm è gestito da npm, Inc., acquisita da Microsoft/GitHub nel 2020. Lo strumento è composto da due parti: la CLI (riga di comando) per installare e gestire i pacchetti, e il Registry — il repository centrale di tutti i moduli pubblicati su registry.npmjs.org.
npm Registry è il più grande registro di pacchetti: oltre 2 milioni di pacchetti e più di 10 miliardi di download mensili. Ogni pacchetto ha una versione SemVer, descrizione, dipendenze, licenza e autori. La pubblicazione del proprio pacchetto avviene tramite npm publish. npm supporta pacchetti con ambito per organizzazioni (@scope/package), registri privati e audit di sicurezza integrato.
Node.js versione 18+ include npm 9+ con prestazioni migliorate, spazi di lavoro per monorepository e un meccanismo di dipendenze peer rielaborato. L'ecosistema npm copre JavaScript lato server, frontend (React, Vue, Angular), sviluppo mobile (React Native), strumenti di build (Webpack, Vite) e utilità CLI. npm è il canale principale di distribuzione delle librerie JavaScript.
npm install — il comando principale che legge package.json e package-lock.json per installare tutte le dipendenze in node_modules. Al primo avvio, npm calcola il grafo delle dipendenze, risolve i conflitti di versione e genera package-lock.json. Il comando npm install <package> installa un pacchetto specifico; il flag --save-dev lo aggiunge a devDependencies, --global lo installa globalmente.
npx — un esecutore di pacchetti incluso in npm dalla versione 5.2. npx consente di eseguire utilità CLI senza installazione globale: npx react-native init o npx create-react-app my-app. npx scarica il pacchetto in una cache temporanea, lo esegue e lo pulisce al termine. npx è utile anche per eseguire versioni specifiche di strumenti.
npm audit scansiona l'albero delle dipendenze alla ricerca di vulnerabilità note dal database npm. Il comando produce un report con livelli di gravità (critical, high, moderate) e raccomanda npm audit fix per aggiornare automaticamente i pacchetti vulnerabili. npm cache memorizza i pacchetti scaricati localmente. npm cache clean --force pulisce la cache in caso di problemi di installazione. npm outdated mostra i pacchetti obsoleti.
# Comandi npm di base
$ npm install
$ npm install react-native-webview --save
$ npm install typescript --save-dev
# Esecuzione senza installazione globale
$ npx react-native init MyApp
# Audit di sicurezza
$ npm audit --fix
package.json è un file JSON nella radice del progetto che ne descrive metadati, dipendenze e configurazione. Campi obbligatori: name (nome unico del pacchetto) e version (versione SemVer, ad esempio 1.0.0). Il file viene creato con npm init -y per un'inizializzazione rapida o manualmente.
Semantic Versioning (SemVer) è uno standard di versionamento nel formato MAJOR.MINOR.PATCH. La versione major cambia con modifiche API incompatibili, la minor con l'aggiunta di funzionalità (retrocompatibile), la patch con la correzione di bug. Il simbolo ^ prima di una versione consente aggiornamenti minor e patch, mentre ~ consente solo aggiornamenti patch.
{
"name": "my-app",
"version": "1.0.0",
"private": true,
"scripts": {
"start": "expo start",
"android": "expo start --android",
"ios": "expo start --ios"
},
"dependencies": {
"react": "^18.3.0",
"react-native": "^0.76.0"
},
"devDependencies": {
"typescript": "^5.5.0",
"@types/react": "^18.3.0"
}
}
| Campo | Scopo | Valore d'esempio |
|---|---|---|
| scripts | Comandi di esecuzione per npm run | "start": "node index.js" |
| dependencies | Dipendenze di produzione dell'applicazione | "react": "^18.3.0" |
| devDependencies | Strumenti di sviluppo e test | "jest": "^29.7.0" |
| peerDependencies | Dipendenze host per librerie | "react": ">=17.0.0" |
| engines | Requisiti di versione Node.js | {"node": ">=18.0.0"} |
I progetti React Native utilizzano attivamente npm per la gestione delle dipendenze. Il set standard include react, react-native, librerie di navigazione (React Navigation), di richieste HTTP (axios), di gestione dello stato (Redux, Zustand) e componenti dell'interfaccia utente. npm consente di installare migliaia di pacchetti compatibili dal registro.
npx pod-install — un comando obbligatorio dopo l'installazione di moduli nativi in React Native per iOS. npm genera automaticamente un Podfile.lock basato su package-lock.json. Nei progetti Expo si usa expo install invece di npm install, poiché seleziona versioni compatibili con la versione corrente di Expo SDK.
I conflitti di versione sono un problema comune in React Native: react-native-reanimated, react-native-gesture-handler e react-native-safe-area-context richiedono versioni allineate. La soluzione è aggiornare tutti i pacchetti alle ultime versioni compatibili o usare --legacy-peer-deps. package-lock.json è fondamentale per i moduli nativi compilati tramite CocoaPods e Gradle.
npm è il gestore di pacchetti standard incluso con Node.js. Le principali alternative: yarn (creato da Facebook nel 2016) e pnpm (veloce, con collegamenti fisici). Da npm 5, la differenza di velocità e funzionalità tra npm e yarn è minima. npm 7+ ha aggiunto gli spazi di lavoro, rendendolo competitivo per i monorepository.
| Caratteristica | npm | yarn | pnpm |
|---|---|---|---|
| Anno di creazione | 2010 | 2016 | 2017 |
| File di blocco | package-lock.json | yarn.lock | pnpm-lock.yaml |
| Installazione | Sequenziale (npm 5+) | Parallela | Parallela |
| Spazio su disco | Standard | Standard | Minimo (link) |
| Spazi di lavoro | Sì (npm 7+) | Sì | Sì |
| Plug'n'Play | No | Sì | No |
Secondo State of JS 2025: 62% degli sviluppatori usa npm, il 35% usa yarn (principalmente progetti vecchi e appassionati di PnP) e il 3% usa pnpm. Per i progetti React Native, entrambi gli strumenti sono ugualmente validi, ma npm è più comune nei progetti con Expo SDK 50+ e nelle nuove inizializzazioni React Native.
yarn conserva il suo vantaggio nei monorepository estremamente grandi (100+ pacchetti) grazie all'implementazione più matura degli spazi di lavoro e di Plug'n'Play. pnpm vince nel risparmio di spazio su disco grazie ai collegamenti fisici a un archivio globale. La scelta del gestore dipende dalle preferenze del team e dall'infrastruttura.
Domande frequenti
npm install aggiorna package-lock.json e può installare nuove versioni minori nell'intervallo semantico. npm ci (Clean Install) rimuove node_modules e installa i pacchetti rigorosamente da package-lock.json senza aggiornarlo. npm ci è più veloce, viene utilizzato in CI/CD e garantisce un ambiente identico su tutte le macchine. Se package-lock.json è mancante, npm ci genera un errore.
Da npm 7, i conflitti di dipendenze peer causano errori di compilazione. Soluzioni: aggiornare tutti i pacchetti a versioni compatibili tramite npm update, usare il flag --legacy-peer-deps per la modalità npm 6, o aggiungere una sezione overrides in package.json per forzare una versione specifica di un pacchetto. L'opzione migliore è aggiornare le dipendenze a versioni compatibili.
npm audit scansiona l'albero delle dipendenze alla ricerca di vulnerabilità note dal database npm Security Advisory. Il comando produce un report con livello di gravità (critical, high, moderate, low) e raccomanda npm audit fix per aggiornare automaticamente i pacchetti vulnerabili a versioni sicure. Eseguire regolarmente npm audit è una pratica di sicurezza di base per i progetti JavaScript.
Gli spazi di lavoro npm consentono di gestire più pacchetti in un unico repository. Aggiungi il campo "workspaces": ["packages/*"] al package.json radice. Vantaggi: installazione unica di tutte le dipendenze in un node_modules condiviso, collegamenti simbolici automatici tra pacchetti locali, esecuzione di script per tutti i pacchetti dalla radice e eliminazione della duplicazione delle versioni.
package-lock.json blocca le versioni esatte di tutte le dipendenze e dei loro pacchetti transitivi. Senza di esso, diversi sviluppatori e server CI potrebbero ottenere versioni diverse delle librerie nell'intervallo semantico, portando a errori del tipo «funziona sulla mia macchina». Eseguire il commit del file di blocco garantisce build riproducibili e un comportamento identico in tutti gli ambienti.
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