Skip to main content

Welcome to a Grasp lesson

Create a free account to keep studying and create your own study path.

Lesson 7

Managing Dependencies with npm

Recommended resources

Bonjour ! J'espère que vous êtes prêt à prendre en main l'un des outils les plus fondamentaux de l'écosystème JavaScript.

Introduction

Dans la leçon précédente, nous avons vu comment structurer notre code en modules avec import et export. Vous avez découvert le fichier package.json et son rôle crucial pour dire à Node.js de traiter vos fichiers comme des modules ES via la propriété "type": "module".

Aujourd'hui, nous allons nous concentrer entièrement sur cet écosystème : npm (Node Package Manager). Si package.json est le plan de votre projet, npm est l'architecte et le contremaître qui gère les matériaux.

Étant donné votre expérience avec Laravel, vous pouvez voir npm comme l'équivalent de Composer dans le monde PHP. Tout comme Composer gère les dépendances de votre projet PHP via un fichier composer.json, npm gère les dépendances de votre projet Node.js via package.json.

L'objectif de cette leçon est de vous rendre capable d'utiliser npm pour initialiser un projet et gérer ses dépendances. C'est une compétence essentielle qui vous permettra d'intégrer des milliers de bibliothèques open-source pour accélérer votre développement.


1. Qu'est-ce que npm et pourquoi en avons-nous besoin ?

npm est le gestionnaire de paquets par défaut pour Node.js. Il remplit deux fonctions principales :

  1. C'est une interface en ligne de commande (CLI) pour installer et gérer les paquets (les "dépendances").
  2. C'est un registre en ligne (npmjs.com) qui héberge une immense collection de paquets JavaScript open-source.

Utiliser un gestionnaire de paquets comme npm évite d'avoir à "réinventer la roue". Au lieu d'écrire vous-même une fonction pour gérer les dates ou faire des requêtes HTTP, vous pouvez installer un paquet robuste, testé et maintenu par la communauté.

What is NPM, and why do we need it? | Tutorial for beginners

Pour bien saisir l'importance de npm, regardez cette courte introduction de la chaîne Coder Coder. L'analogie avec la construction d'une voiture est particulièrement parlante.

Regardez la vidéo de 00:44 à 02:15. Elle explique de manière très claire pourquoi on utilise des paquets pré-construits plutôt que de tout coder à partir de zéro.


2. Initialiser un projet Node.js

Chaque projet qui utilise npm doit avoir un fichier package.json. Ce fichier est le manifeste de votre projet. Il contient des métadonnées (nom, version, etc.) et, surtout, la liste de toutes ses dépendances.

Pour créer ce fichier, on utilise la commande npm init.

NPM Node Package Manager Modules | NPM Tutorial for Beginners

La vidéo suivante de Dave Gray vous guide pas à pas dans la création de votre premier package.json.

Regardez la section de 04:57 à 07:10. Observez bien les questions posées par la commande npm init et comment elle génère le fichier package.json. La vidéo mentionne aussi le raccourci npm init -y pour accepter toutes les valeurs par défaut.

Pour résumer le processus :

  1. Créez un nouveau dossier pour votre projet et naviguez dedans avec votre terminal.
  2. Exécutez npm init.
  3. Répondez aux questions (nom du paquet, version, description, etc.). Vous pouvez simplement appuyer sur Entrée pour accepter les valeurs par défaut.
  4. Une fois terminé, un fichier package.json sera créé dans votre dossier.

Voici à quoi ressemble le processus dans le terminal :

Initializing a Node.js Project with `npm init`
Le processus interactif de `npm init` vous guide dans la création du fichier `package.json`, qui sert de carte d'identité à votre projet.

Astuce pratique : Si vous êtes pressé, utilisez npm init -y. Cette commande saute toutes les questions et génère immédiatement un package.json avec les valeurs par défaut.


3. Gestion des dépendances

Maintenant que notre projet est initialisé, nous pouvons commencer à ajouter des dépendances. Il en existe deux types principaux : dependencies et devDependencies.

dependencies vs devDependencies

  • dependencies : Ce sont les paquets dont votre application a besoin pour fonctionner en production. Par exemple, le framework Express, une bibliothèque de connexion à la base de données, etc.
  • devDependencies : Ce sont les paquets utilisés uniquement pendant le développement et les tests. Par exemple, un outil pour redémarrer automatiquement le serveur (nodemon), un framework de test (jest), ou un linter (eslint).

Cette distinction est importante car lors du déploiement en production, on n'installe généralement que les dependencies pour garder l'application finale la plus légère possible.

La vidéo suivante illustre parfaitement comment installer ces deux types de dépendances.

NPM Node Package Manager Modules | NPM Tutorial for Beginners

Continuons avec la vidéo de Dave Gray. Il va maintenant installer une dépendance de production (date-fns) et une dépendance de développement (nodemon).

Regardez les deux segments suivants : De 07:10 à 08:39 : Installation d'une dépendance de production. Observez comment la section "dependencies" est ajoutée au package.json et comment les dossiers node_modules et package-lock.json apparaissent. De 11:09 à 11:57 : Installation d'une dépendance de développement avec le flag -D. Voyez comment la section "devDependencies" est créée.

Commandes à retenir :

  • Installer une dépendance de production : npm install <nom-du-paquet> (ou npm i <nom-du-paquet>)
  • Installer une dépendance de développement : npm install <nom-du-paquet> --save-dev (ou npm i <nom-du-paquet> -D)

Les fichiers et dossiers générés

Quand vous installez votre première dépendance, vous voyez apparaître deux choses :

  • Le dossier node_modules : C'est là que npm télécharge et stocke le code de toutes vos dépendances (et de leurs propres dépendances !). Ce dossier peut devenir très volumineux.
  • Le fichier package-lock.json : Ce fichier est un "instantané" de votre dossier node_modules. Il enregistre les versions exactes de chaque paquet installé. Nous verrons son importance capitale dans la section suivante.

Ignorer node_modules

Le dossier node_modules ne doit jamais être inclus dans votre système de contrôle de version (comme Git). Il est lourd et peut être entièrement recréé à partir des fichiers package.json et package-lock.json.

NPM Node Package Manager Modules | NPM Tutorial for Beginners

Voici comment s'assurer que Git ignore bien le dossier node_modules.

Regardez la vidéo de 08:33 à 09:52. Elle montre comment créer un fichier .gitignore et y ajouter node_modules. Elle explique ensuite le workflow clé : comment une autre personne (ou un serveur de déploiement) peut cloner votre projet et recréer l'environnement exact en exécutant une seule commande.

La commande magique est simplement npm install. Si vous exécutez cette commande dans un dossier contenant un package.json (et idéalement un package-lock.json), npm lira ces fichiers et installera toutes les dépendances nécessaires dans un nouveau dossier node_modules.


4. Versionnement et builds reproductibles

Semantic Versioning (SemVer)

Vous avez peut-être remarqué des numéros de version comme ^4.17.1 dans votre package.json. C'est du Semantic Versioning (SemVer). Une version est structurée en MAJOR.MINOR.PATCH.

  • PATCH (ex: 4.17.1 -> 4.17.2) : Pour les corrections de bugs rétro-compatibles.
  • MINOR (ex: 4.17.1 -> 4.18.0) : Pour les nouvelles fonctionnalités rétro-compatibles.
  • MAJOR (ex: 4.17.1 -> 5.0.0) : Pour les changements non rétro-compatibles (breaking changes).

Les symboles ^ (caret) et ~ (tilde) définissent la plage de versions que npm peut installer :

  • ^4.17.1 : Autorise les mises à jour de PATCH et MINOR, mais pas de MAJOR. (ex: accepte 4.18.0 mais refuse 5.0.0). C'est le comportement par défaut.
  • ~4.17.1 : Autorise uniquement les mises à jour de PATCH. (ex: accepte 4.17.2 mais refuse 4.18.0).

NPM Node Package Manager Modules | NPM Tutorial for Beginners

Cette partie du versionnement peut être déroutante au début. La vidéo suivante explique en détail le rôle de ces symboles.

Regardez la section de 18:46 à 21:51. Concentrez-vous sur la signification des numéros de version et des symboles ^ et ~.

Le rôle essentiel de package-lock.json

Le package.json avec ses ^ peut être source d'ambiguïté. Si vous et votre collègue exécutez npm install à des moments différents, vous pourriez obtenir des versions mineures différentes d'une même dépendance, ce qui pourrait introduire des bugs.

C'est là que package-lock.json entre en jeu. Il ignore les ^ et ~ et enregistre l'arbre exact des dépendances avec les versions précises de chaque paquet installé.

Lorsque vous exécutez npm install, si un package-lock.json existe, npm l'utilisera comme source de vérité pour recréer l'environnement à l'identique, garantissant ainsi des builds reproductibles sur n'importe quelle machine. C'est pourquoi, contrairement à node_modules, vous devez toujours commiter le fichier package-lock.json dans Git.


5. Scripts npm et commandes utiles

npm n'est pas seulement un gestionnaire de dépendances, c'est aussi un exécuteur de tâches. La section "scripts" de votre package.json vous permet de définir des alias pour des commandes que vous utilisez souvent.

NPM Node Package Manager Modules | NPM Tutorial for Beginners

Voyons comment créer et exécuter des scripts personnalisés pour démarrer notre application en mode développement et production.

Regardez le segment de 11:57 à 14:05. Il montre comment définir un script "start" (utilisant node) et un script "dev" (utilisant nodemon) et comment les lancer avec npm start et npm run dev.

Quelques commandes utiles pour finir :

  • Mettre à jour les paquets : npm update. Cette commande met à jour vos dépendances vers les dernières versions autorisées par les plages de SemVer dans votre package.json.
  • Désinstaller un paquet : npm uninstall <nom-du-paquet>. N'oubliez pas d'ajouter -D si vous supprimez une dépendance de développement.

Conclusion

Félicitations ! Vous maîtrisez maintenant les rouages de npm, l'outil indispensable de tout développeur JavaScript. Vous êtes désormais capable de créer des projets structurés et d'y intégrer la puissance de l'écosystème open-source.

Points clés à retenir :

  • npm init initialise un projet et crée le fichier package.json.
  • Les dépendances sont gérées via npm install et sont classées en dependencies (pour la production) et devDependencies (pour le développement).
  • Le dossier node_modules contient le code des dépendances et doit être ignoré par Git.
  • Le fichier package-lock.json garantit des installations reproductibles et doit être commité dans Git.
  • Semantic Versioning (^, ~) contrôle la flexibilité des mises à jour des dépendances.
  • La section scripts de package.json permet de créer des raccourcis de commandes, comme npm start ou npm run dev.

Dans la prochaine leçon, nous allons mettre tout cela en pratique. Nous utiliserons les connaissances acquises pour construire notre toute première application web avec Node.js : un serveur HTTP simple en utilisant le module http intégré.