Gestire gli aggiornamenti delle dipendenze nel progetto Node.js
In qualità di sviluppatore di Tailwind Traders, è importante mantenere aggiornati i pacchetti. In questo modo è possibile assicurarsi di usare le funzionalità e le correzioni più recenti. Consente anche di evitare vulnerabilità di sicurezza. In questa unità si apprenderà come gestire le dipendenze in un progetto Node.js. Si apprenderà come aggiornare i pacchetti, usare il controllo delle versioni semantiche e gestire i problemi di sicurezza.
Considerazioni prima di aggiornare un pacchetto
Prima di aggiornare un pacchetto, prendere in considerazione:
- Tipo di aggiornamento: comprendere se si tratta di una correzione secondaria, di una nuova funzionalità o di una modifica importante che potrebbe interrompere il codice. Il controllo delle versioni semantico consente di identificare questo problema.
- Configurazione progetto: assicurarsi che il progetto sia impostato per ricevere solo gli aggiornamenti desiderati per evitare modifiche impreviste.
- Sicurezza: rimanere consapevoli delle potenziali vulnerabilità. Usare la funzionalità di controllo di npm per identificare e aggiornare i pacchetti problematici.
- Test: assicurarsi che i test vengano superati dopo l'aggiornamento. Se non si hanno test, è consigliabile aggiungerli. L'applicazione può comportarsi in modo diverso dopo un aggiornamento e i test convalidano il comportamento corretto .
Controllo delle versioni semantico per definire il comportamento di aggiornamento
Il controllo delle versioni semantiche è uno standard chiave nello sviluppo di software. È essenziale sia per la pubblicazione che per l'uso di pacchetti npm. Consente di gestire i rischi di aggiornamento indicando il tipo di modifiche in una nuova versione. Un numero di versione include sezioni specifiche per riflettere queste modifiche:
Tipo di versione | Position | Sintassi | Che succede | Approccio di aggiornamento |
---|---|---|---|---|
Major | 1° | x.0.0 o * | Le modifiche dalla versione 1.0.0 alla 2.0.0 indicano modifiche di rilievo. Potrebbe essere necessario apportare modifiche al codice. | È possibile acquisire familiarità con gli aggiornamenti immediati alla versione principale più recente, confermando potenziali modifiche al codice. |
Minor | 2° | 1.x.1 o ^ | Modifiche dalla versione 1.2.9 alla versione 1.3.0 introduce nuove funzionalità. Il codice esistente deve comunque funzionare. Aggiornamenti sono in genere sicuri. | Aprire a nuove funzionalità, ma non apportare modifiche di rilievo. |
Patch | Firewall | 1.1.x o ~ | Modifiche dalla versione 1.0.7 alla versione 1.0.8 correzioni di bug medio. Aggiornamenti dovrebbe essere sicuro. | Accettazione di correzioni di bug. |
Per i progetti Node.js di piccole dimensioni, è possibile eseguire liberamente l'aggiornamento alle versioni più recenti. Tuttavia, per i progetti di grandi dimensioni, gli aggiornamenti richiedono un'attenta riflessione e non sono sempre automatici. In genere, l'aggiornamento di dipendenze più piccole, con un minor numero di dipendenze, semplifica il processo.
Prima di aggiornare una o più dipendenze, è necessario configurare il package.json
file in modo da ottenere un comportamento prevedibile quando si esegue il npm update <name of dependency>
comando. Node.js usa un set di simboli che consente di definire la modalità di aggiornamento dei pacchetti.
Aggiornare un pacchetto con l'interfaccia della riga di comando di npm
È possibile installare un pacchetto usando il install
comando o update
in npm. Questi comandi sono ora principalmente intercambiabili. Per aggiornare un pacchetto, in genere si usa:
- Versione più recente:
npm update <package name>@latest
. - Versione specifica:
npm update <package name>@<optional version number>
.
Il processo di aggiornamento dipende da due fattori:
- Argomento versione: se nel comando viene specificato
npm update
un numero di versione, npm recupera e installa tale versione specifica. - Voce del file manifesto: il
package.json
file contiene regole per l'aggiornamento delle dipendenze. Ad esempio,"dependencyName": "1.1.x"
significa che npm recupererà la versione corrispondente a questo modello.
Informazioni sul controllo delle versioni
Tre file controllano il controllo delle versioni delle dipendenze:
package.json
: questo file definisce la versione del pacchetto che si vuole usare. Si tratta del file manifesto per il progetto. Contiene i metadati per il progetto, incluse le dipendenze.package-lock.json
: questo file descrive l'albero esatto generato, in modo che le installazioni successive siano in grado di generare alberi identici, indipendentemente dagli aggiornamenti intermedi delle dipendenze. Questo file deve essere eseguito il commit nei repository di origine.shrinkwrap.json
: questo file viene creato dal comando dell'interfaccia dellanpm shrinkwrap
riga di comando ed è simile apackage-lock.json
. La differenza principale tra i comandi è che le versioni del pacchetto specificate innpm-shrinkwrap.json
non possono essere sostituite dagli utenti. Inoltre, ilnpm-shrinkwrap.json
file è compatibile con le versioni precedenti di npm (versioni 2-4), mentrepackage-lock.json
è compatibile con npm versione 5 e successive. Pertanto, è possibile trovarenpm-shrinkwrap.json
quando si mantengono codebase legacy. La maggior parte degli sviluppatori useràpackage-lock.json
anzichénpm-shrinkwrap.json
. Un'eccezione in cuinpm-shrinkwrap.json
è preferibile è per le installazioni globali di daemon e strumenti da riga di comando in cui gli sviluppatori vogliono garantire l'installazione delle versioni esatte dei pacchetti specificati.
Esempio di determinazione della versione del pacchetto
Si consideri uno scenario in cui si usa la versione 1.2 nel codice e quindi viene rilasciata la versione 1.4, interrompendo il codice. Se qualcuno installa l'app a questo punto, otterrà un'app non funzionale. Tuttavia, se è presente un package-lock.json
file che specifica la versione 1.2, tale versione verrà installata.
Ecco un esempio di determinazione della versione di un pacchetto installata:
- Se i file e
package-lock.json
sono d'accordopackage.json
su una regola di versione, non esiste alcun conflitto. Ad esempio, sepackage.json
specifica1.x
epackage-lock.json
specifica la versione 1.4, verrà installata la versione 1.4. - Se
package.json
specifica una versione più specifica, ad esempio1.8.x
, esegue l'override delpackage-lock.json
file, che indica la versione precedente della versione 1.4. In questo caso, verrà installata la versione 1.8.0 o una versione di patch successiva, se disponibile.
Trovare e aggiornare pacchetti obsoleti con npm obsoleto
Il npm outdated
comando viene usato per identificare i pacchetti con versioni più recenti disponibili. Quando viene eseguito, fornisce un elenco di questi pacchetti obsoleti:
Package Current Wanted Latest Location Depended by
lodash 1.0.0 1.0.0 4.17.19 lock-test main-code-file
node-fetch 1.2.0 1.2.0 2.6.0 lock-test function-code-file
Le colonne nell'output includono:
Colonna | Descrizione |
---|---|
Pacchetto | Pacchetto obsoleto. |
Corrente | Versione installata corrente del pacchetto. |
Volevo | Versione più recente che corrisponde al modello semantico specificato nel package.json file. |
Più recente | La versione più recente del pacchetto. |
Ufficio | Percorso della dipendenza del pacchetto. Il outdated comando esegue la ricerca per indicizzazione in tutti i pacchetti installati nelle varie node_modules cartelle. |
Dipende da | Pacchetto che ha la dipendenza. |
Gestire i problemi di sicurezza con il controllo npm
Ogni volta che si installa o si aggiorna un pacchetto, si ottiene una risposta di log che indica quale versione è stata installata e se sono presenti vulnerabilità. Il log elenca le vulnerabilità. Se si verificano vulnerabilità critiche o elevate, è necessario aggiornare il pacchetto.
Un esempio di risposta al log è:
+ lodash@1.3.1
added 1 package from 4 contributors and audited 1 package in 0.949s
found 3 vulnerabilities (1 low, 2 high)
run `npm audit fix` to fix them, or `npm audit` for details
Per risolvere un problema e applicare un aggiornamento, è possibile eseguire il npm audit
comando . Questo comando elenca ogni vulnerabilità.
Il npm audit fix
comando tenta di risolvere le vulnerabilità eseguendo l'aggiornamento a una versione secondaria in cui il problema non esiste. Tuttavia, questo potrebbe non essere disponibile se la correzione è effettivamente nella versione principale successiva.
In questi casi, potrebbe essere necessario usare npm audit fix --force
, che può introdurre modifiche di rilievo eseguendo l'aggiornamento alla versione principale. L'esecuzione di questo comando è una decisione da prendere con attenzione. È necessario essere consapevoli delle modifiche di rilievo e dell'uso npm update
per aggiornare il codice, incluse le vulnerabilità.
Una vulnerabilità è un difetto del codice che può essere sfruttato dagli utenti malintenzionati per eseguire azioni dannose, potenzialmente compromettendo i dati e i sistemi. È fondamentale risolvere tempestivamente queste vulnerabilità.
Data la frequente individuazione delle vulnerabilità, GitHub ha una funzionalità che analizza i repository e crea automaticamente richieste pull che suggeriscono gli aggiornamenti alle versioni più sicure. L'esecuzione npm audit
regolare è una procedura consigliata per identificare e correggere le vulnerabilità, contribuendo alla sicurezza complessiva del progetto.
Flusso di lavoro di aggiornamento consigliato
Il flusso di lavoro consigliato per gli aggiornamenti è:
npm run test
: verificare che i test esistenti vengano superati prima di avviare questo processo di aggiornamento.npm audit
: per verificare la presenza di vulnerabilità nella versione corrente in uso. Le informazioni dinpm audit
possono consigliare l'aggiornamento a una versione principale. È consigliabile esaminare attentamente le modifiche che causano un'interruzione, se presenti nell'elenco.npm outdated
: per elencare tutti i pacchetti obsoleti. Questo comando fornisce informazioni nelle colonne Wanted, Latest e Location.- Aggiornare con
npm update
:- Per i progetti più piccoli (alcune dipendenze in
package.json
: è possibile provarenpm update
ad aggiornare tutte le dipendenze e quindi eseguire i test. - Per i progetti di dimensioni maggiori (con molte dipendenze in
package.json
: aggiornare un singolo pacchetto o una famiglia di pacchetti, ad esempio Next.js e React), quindi eseguire i test.
- Per i progetti più piccoli (alcune dipendenze in
npm audit
: verificare che non siano presenti vulnerabilità critiche o elevate. Se esistono ancora vulnerabilità, usarenpm update
con il nome del pacchetto e la versione principale consigliata innpm audit
.npm run test
di nuovo.- Archiviare
package.json
epackage-lock.json
.