Gestion des mises à jour de dépendances dans un projet Node.js

Effectué

En tant que développeur chez Tailwind Traders, il est important de maintenir nos packages à jour. Cela permet de s’assurer que nous utilisons les dernières fonctionnalités et les derniers correctifs. Il nous aide également à éviter les vulnérabilités de sécurité. Dans cette unité, vous allez apprendre à gérer les dépendances dans un projet Node.js. Vous allez apprendre à mettre à jour des packages, à utiliser le contrôle de version sémantique et à gérer les problèmes de sécurité.

Considérations avant la mise à jour d’un package

Avant de mettre à jour un package, envisagez les éléments suivants :

  • Type de mise à jour : Comprenez s’il s’agit d’un correctif mineur, d’une nouvelle fonctionnalité ou d’une modification majeure susceptible d’interrompre votre code. Le contrôle de version sémantique peut vous aider à identifier cela.
  • Configuration de projet : Vérifiez que votre projet est défini pour recevoir uniquement les mises à jour souhaitées pour éviter les modifications inattendues.
  • Sécurité : Tenez compte des vulnérabilités potentielles. Utilisez la fonctionnalité d’audit de npm pour identifier et mettre à jour des packages problématiques.
  • Test : Vérifiez que vos tests réussissent après la mise à jour. Si vous n’avez pas de tests, envisagez de les ajouter. Votre application peut se comporter différemment après une mise à jour et les tests valident le comportement correct .

Gestion sémantique des versions pour définir le comportement de mise à jour

Le contrôle de version sémantique est une norme clé dans le développement de logiciels. Il est essentiel pour la publication et l’utilisation de packages npm. Il permet de gérer les risques de mise à jour en indiquant le type de modifications dans une nouvelle version. Un numéro de version comporte des sections spécifiques pour refléter ces modifications :

Version Type Position Syntaxe Que se passe-t-il ? Mise à jour de l’approche
Major 1st x.0.0 ou * Les modifications de la version 1.0.0 à 2.0.0 indiquent des changements cassants. Les ajustements de code peuvent être nécessaires. À l’aise avec les mises à jour immédiates de la dernière version majeure, reconnaissant les modifications potentielles du code.
Minor 2nd 1.x.1 ou ^ Passe de 1.2.9 à 1.3.0 introduisent de nouvelles fonctionnalités. Le code existant doit toujours fonctionner. Les mises à jour sont généralement sécurisées. Ouvrez les nouvelles fonctionnalités, mais pas les changements cassants.
Patch 3e 1.1.x ou ~ Passe de 1.0.7 à 1.0.8 corrections de bogues moyennes. Les mises à jour doivent être sécurisées. Acceptation des correctifs de bogues.

Pour les petits projets Node.js, vous pouvez librement effectuer une mise à jour vers les dernières versions. Mais pour les projets plus volumineux, les mises à jour ont besoin d’une réflexion minutieuse et ne sont pas toujours automatiques. En règle générale, la mise à jour de dépendances plus petites, avec moins de leurs propres dépendances, facilite le processus.

Avant de mettre à jour une ou plusieurs dépendances, vous devez configurer votre fichier package.json afin d’obtenir un comportement prévisible lorsque vous exécutez la commande npm update <name of dependency>. Node.js utilise un ensemble de symboles qui vous permet de définir la façon dont vos packages doivent être mis à jour.

Mettre à jour un package avec l’interface CLI npm

Vous pouvez installer un package à l’aide de la commande install ou update dans npm. Ces commandes sont désormais principalement interchangeables. Pour mettre à jour un package, vous utilisez généralement :

  • Dernière version : npm update <package name>@latest.
  • Version spécifique : npm update <package name>@<optional version number>.

Le processus de mise à jour dépend de deux facteurs :

  • Argument de version : Si un numéro de version est spécifié dans la commande npm update, npm récupère et installe cette version spécifique.
  • Entrée de fichier manifeste : Le fichier package.json contient des règles pour la mise à jour des dépendances. Par exemple, "dependencyName": "1.1.x" signifie que npm récupère la version qui correspond à ce modèle.

Comprendre le contrôle de version

Trois fichiers gèrent le contrôle de version de dépendances :

  • package.json : Ce fichier définit la version du package que vous souhaitez utiliser. Il s’agit du fichier manifeste de votre projet. Il contient les métadonnées de votre projet, notamment les dépendances.
  • package-lock.json : Ce fichier décrit l’arborescence exacte générée, de sorte que les installations suivantes puissent générer des arborescences identiques, quelles que soient les mises à jour de dépendance intermédiaires. Ce fichier est destiné à être validé dans des référentiels sources.
  • shrinkwrap.json : Ce fichier est créé par la commande CLI npm shrinkwrap et est similaire à package-lock.json. La principale différence entre les commandes réside dans le fait que les utilisateurs ne peuvent pas remplacer les versions de package spécifiées dans npm-shrinkwrap.json. En outre, le fichier npm-shrinkwrap.json est compatible avec les versions antérieures de npm (versions 2-4), tandis que package-lock.json est compatible avec version 5 de npm et ultérieure. Par conséquent, vous pouvez trouver npm-shrinkwrap.json lors de la maintenance des codebases héritées. La plupart des développeurs utiliseront package-lock.json plutôt que npm-shrinkwrap.json. Une exception dans laquelle il est préférable d’utiliser npm-shrinkwrap.json correspond aux installations globales de démons et d’outils de ligne de commande dans lesquelles les développeurs souhaitent vérifier que les versions exactes des packages spécifiés sont installées.

Exemple de détermination de la version de package

Envisagez un scénario dans lequel vous utilisez la version 1.2 dans votre code, puis la version 1.4 est publiée, ce qui interrompt votre code. Si quelqu’un installe votre application à ce stade, il obtient une application non fonctionnelle. Toutefois, s’il existe un fichier package-lock.json spécifiant la version 1.2, cette version sera installée.

Voici un exemple de détermination de la version d’un package installée :

  • Si les fichiers package.json et package-lock.json conviennent d’une règle de version, il n’existe aucun conflit. Par exemple, si package.json spécifie 1.x et package-lock.json spécifie la version 1.4, la version 1.4 est installée.
  • Si package.json spécifie une version plus spécifique comme 1.8.x, elle remplace le fichier package-lock.json , qui indique l’ancienne version de la version 1.4. Dans ce cas, la version 1.8.0 ou une version ultérieure du correctif sera installée, le cas échéant.

Rechercher et mettre à jour des packages obsolètes avec npm obsolète

La commande npm outdated est utilisée pour identifier les packages qui ont des versions plus récentes disponibles. Lors de l’exécution, il fournit la liste de ces packages obsolètes :

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 sortie comporte les colonnes suivantes :

Colonne Description
Package Package obsolète.
Actuel Version installée actuelle du package.
Voulu Dernière version qui correspond au modèle sémantique que vous avez spécifié dans le fichier package.json.
Plus récent La version la plus récente du package.
Emplacement Emplacement de la dépendance de package. La commande outdated analyse tous les packages installés dans les différents dossiers node_modules.
Dépend de Package qui a la dépendance.

Gérer les problèmes de sécurité avec l’audit npm

Chaque fois que vous installez ou mettez à jour un package, vous obtenez une réponse de journal qui vous indique quelle version a été installée et s’il existe des vulnérabilités. Le journal répertorie les vulnérabilités. Si vous avez des vulnérabilités critiques ou élevées, vous devez mettre à jour le package.

Voici un exemple de réponse de journal :

+ 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

Pour résoudre un problème et appliquer une mise à jour, vous pouvez exécuter la commande npm audit. Cette commande liste chaque vulnérabilité.

La commande npm audit fix tente de résoudre les vulnérabilités en effectuant une mise à niveau vers une version mineure où le problème n’existe pas. Toutefois, cela peut ne pas être disponible si le correctif se trouve réellement dans la prochaine version principale.

Dans ce cas, vous devrez peut-être utiliser npm audit fix --force, ce qui peut introduire des modifications cassants en mettant à jour vers la version principale. L’exécution de cette commande est une décision que vous devez prendre avec soin. Vous devez connaître les changements cassants et utiliser npm update pour mettre à jour votre code, y compris les vulnérabilités.

Une vulnérabilité est une faille de code qui peut être exploitée par des attaquants pour effectuer des actions malveillantes, ce qui peut compromettre vos données et vos systèmes. Il est essentiel de résoudre ces vulnérabilités rapidement.

Compte tenu de la détection fréquente des vulnérabilités, GitHub dispose d’une fonctionnalité qui analyse les référentiels et crée automatiquement des demandes de tirage suggérant des mises à niveau vers des versions plus sûres. L’exécution régulière de npm audit est une bonne pratique pour identifier et corriger les vulnérabilités, contribuant à la sécurité globale de votre projet.

Le flux de travail recommandé pour les mises à jour est le suivant :

  1. npm run test : Vérifiez que vos tests existants réussissent avant de démarrer ce processus de mise à jour.
  2. npm audit: pour rechercher les vulnérabilités dans la version actuelle que vous utilisez. Les informations de npm audit peuvent recommander la mise à jour vers une version majeure. Vous devez examiner attentivement les changements cassants si des modifications sont répertoriées.
  3. npm outdated: pour répertorier tous les packages obsolètes. Cette commande fournit des informations dans les colonnes Wanted, Latest et Location.
  4. Mise à jour avec npm update :
    • Pour les projets plus petits (quelques dépendances dans le package.json: vous pouvez essayer npm update de mettre à jour toutes les dépendances, puis d’exécuter vos tests.
    • Pour les projets plus volumineux (avec de nombreuses dépendances dans package.json : mettez à jour un package ou une famille de packages unique (par exemple, Next.js et React), puis exécutez les tests.
  5. npm audit: vérifiez qu’il n’y a pas de vulnérabilités critiques ou élevées. Si des vulnérabilités existent toujours, utilisez npm update avec le nom du package et la version principale recommandée dans npm audit.
  6. npm run test encore.
  7. Vérifiez votre package.json et package-lock.json.