Gestire gli aggiornamenti delle dipendenze nel progetto Node.js

Completato

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 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 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 della npm shrinkwrap riga di comando ed è simile a package-lock.json. La differenza principale tra i comandi è che le versioni del pacchetto specificate in npm-shrinkwrap.json non possono essere sostituite dagli utenti. Inoltre, il npm-shrinkwrap.json file è compatibile con le versioni precedenti di npm (versioni 2-4), mentre package-lock.json è compatibile con npm versione 5 e successive. Pertanto, è possibile trovare npm-shrinkwrap.json quando si mantengono codebase legacy. La maggior parte degli sviluppatori userà package-lock.json anziché npm-shrinkwrap.json. Un'eccezione in cui npm-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'accordo package.json su una regola di versione, non esiste alcun conflitto. Ad esempio, se package.json specifica 1.x e package-lock.json specifica la versione 1.4, verrà installata la versione 1.4.
  • Se package.json specifica una versione più specifica, ad esempio 1.8.x, esegue l'override del package-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.

Il flusso di lavoro consigliato per gli aggiornamenti è:

  1. npm run test: verificare che i test esistenti vengano superati prima di avviare questo processo di aggiornamento.
  2. npm audit: per verificare la presenza di vulnerabilità nella versione corrente in uso. Le informazioni di npm audit possono consigliare l'aggiornamento a una versione principale. È consigliabile esaminare attentamente le modifiche che causano un'interruzione, se presenti nell'elenco.
  3. npm outdated: per elencare tutti i pacchetti obsoleti. Questo comando fornisce informazioni nelle colonne Wanted, Latest e Location.
  4. Aggiornare con npm update:
    • Per i progetti più piccoli (alcune dipendenze in package.json: è possibile provare npm 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.
  5. npm audit: verificare che non siano presenti vulnerabilità critiche o elevate. Se esistono ancora vulnerabilità, usare npm update con il nome del pacchetto e la versione principale consigliata in npm audit.
  6. npm run test di nuovo.
  7. Archiviare package.json e package-lock.json.