Si je devais résumer en quelques mots le rôle du fichier  package-lock.json je dirais qu'il sert à stocker une représentation exacte des dépendances installées dans le projet à un instant T.

Mais une autre question se pose alors :

Pourquoi est-ce que nous aurions besoin de connaître l'état exacte des  dépendances du projet alors que nous avons déjà le fichier package.json pour ça ?

Simplement parce que le fichier package.json n'indexe pas les paquets installés mais contient simplement des règles pour installer ces derniers selon une indication de version plus ou moins précise.

En utilisant des numéros de version comme "latest", "~1.1.0" ou "^1.1.0", impossible de prévoir quelle sera la version exacte qui sera installée au final.

On dit que l'exécution de la commande npm install est "non-déterministe" car l'exécuter plusieurs fois peut avoir des résultats différents.

Voilà donc un comportement qui peut poser problème lorsque deux développeurs d'une même équipe se retrouvent avec deux dossiers de dépendances différents, pourtant issus du même package.json

Voilà pourquoi depuis la version 5 de NPM sont apparus deux nouvelles fonctionnalités :

  • le fichier package-lock.json
  • la commande npm ci

package-lock.json

Le fichier package-lock.json liste toutes les dépendances installées, avec pour chacune :

  • la version exacte
  • l'url depuis laquelle elle a été installé
  • un checksum pour vérifier l'intégrité
  • les sous-dépendances

Ce qui permet d'avoir une photographie instantannée très précise des dépendances actuellement utilisées par le projet, qui sera mise à jour à chaque opération modifiant le contenu de "node_modules" ou du fichier package.json

npm ci

La commande "npm ci" est l'équivalent de la commande "npm install", mais au lieu d'aller chercher chaque dépendance dans le registre (registry.npmjs.org par exemple), ce dernier va d'abord regarder dans le cache (donc beaucoup plus rapide pour les redéploiement), et il ne sera pas basé sur le fichier package.json, mais bien sur le fichier package-lock.json

En plus de la rapidité d'exécution, "npm ci" permet par exemple de reprendre un état précédent d'une application (même datant de plusieurs mois), et de pouvoir retrouver chaque dépendance dans leur version d'origine, même si de nombreuses versions sont sorties depuis.

Voilà pourquoi le fichier package-lock.json est très utile, et voilà aussi la raison pour laquelle il faut absolument l'ajouter à vos commits vos différents projets !

J'espère que cet article vous aura été utile, et à bientôt sur le blog !

Les articles les plus populaires du blog

Envie de continuer à lire des articles autour du développement web (entre autres) ? Voici la sélection des articles de mon blog les plus lus par la communauté !

Voir la sélection 🚀

Recevez les articles de la semaine par e-mail pour ne rien manquer !

S'abonner à la newsletter 📧

À propos de l'auteur

Hello, je suis Nicolas Brondin-Bernard, ingénieur web indépendant depuis 2015 passionné par le partage d'expériences et de connaissances.

Aujourd'hui je suis aussi coach pour développeurs web juniors, tu peux me contacter sur nicolas@brondin.com, sur mon site ou devenir membre de ma newsletter pour ne jamais louper le meilleur article de la semaine et être tenu au courant de mes projets !


Photo par Pankaj Patel sur Unsplash