La gestion de paquets — ce que npm install installe, et où

Cet article fait partie du cours Les bases de l'informatique, qui construit depuis zéro les connaissances informatiques pratiques indispensables pour programmer et faire du vibe coding.
Quand tu tapes npm install react, un dossier node_modules apparaît dans my-app et une ligne s'ajoute à package.json. Les schémas suivent tout ce que déclenche cette seule ligne.

Cet article traite de la gestion de paquets.

C'est le mécanisme qui récupère une bibliothèque externe par son nom avec une seule ligne, comme npm install, et la place à un endroit défini.

Ce que la seule ligne npm install react met en place, et où
Tapernpm install reactnpm le récupèredepuis le registreUn dossier apparaîtdans node_modulesUne ligne s'ajouteà package.jsonapp.js nechange pas
La ligne de gauche passe à npm, au centre, et le résultat se dépose aux deux endroits de droite. Le fichier app.js que tu as écrit ne change pas.

Tu ne tapes que la ligne de gauche, et ce sont les deux éléments de droite qui s'ajoutent.

Seuls le dossier node_modules et une ligne de package.json s'ajoutent ; le fichier app.js que tu as écrit ne change pas d'un caractère.

Ce qu'est un paquet — une bibliothèque externe que tu récupères par son nom

Une bibliothèque externe rassemblée sous une forme récupérable par son nom est un paquet (package ; bibliothèque externe mise sous une forme que l'on récupère en indiquant son nom), et le numéro qui désigne son contenu à un instant donné est la version (version).

Pour afficher les dates de façon lisible dans l'application de réservation my-app, tu peux écrire ce traitement toi-même, mais il est aussi distribué sous forme de paquet.

Afficher une date : l'écrire soi-même ou la récupérer
Afficher des dateslisiblementL'écrire soi-mêmeUtiliser un paquetÉcrire beaucoup,corriger soi-mêmeRécupérer par nom,appeler en 1 ligneLe même affichageapparaît à l'écran
De haut en bas, le flux se sépare en deux puis se rejoint à la fin. Ce qui change, c'est la quantité de code écrit ; l'écran obtenu est le même.

À gauche, toutes les lignes écrites t'appartiennent ; à droite, tu te contentes d'appeler en une ligne ce que tu as récupéré.

Ce que contient un seul paquet, react
Le paquet react
Nom
  • La chaîne que tu indiques au moment de le récupérer
  • Désigne une seule chose dans le registre
Version
  • Un nouveau numéro s'ajoute à chaque révision
  • Les anciens numéros restent disponibles
Les fichiers de code source
  • Le programme lui-même, qui s'exécute quand on l'appelle
  • Tu ne les modifies pas toi-même
Les noms des autres paquets dont il a besoin
  • Ce qui manque à react pour fonctionner est listé ici
  • Ils viennent avec au moment de la récupération
Le cadre extérieur est un paquet, react. Ce que tu indiques au moment de le récupérer, c'est le nom et la version ; les fichiers à l'intérieur viennent avec.

Ce que tu indiques au moment de récupérer, c'est seulement le nom tout en haut.

Ce sont « les noms des autres paquets dont il a besoin », tout en bas, qui feront augmenter le nombre de dossiers.

Un paquet est une bibliothèque externe que l'on récupère par son nom

Un paquet, c'est un programme écrit par quelqu'un d'autre, nommé et mis sous une forme distribuable.

Indiquer le nom suffit à faire venir son contenu sur ton ordinateur, et la version est le numéro qui distingue les révisions portant le même nom.

Ce qui apparaît dans my-app quand tu tapes npm install react

Ce qui récupère par le nom, c'est le gestionnaire de paquets (package manager ; programme qui récupère les paquets et les place à un endroit défini), et celui de JavaScript est npm.

Les deux commandes tiennent chacune sur une seule ligne dans le terminal, et supposent toutes deux que tu les tapes à l'intérieur de my-app.

# Se placer d'abord dans le dossier my-app
cd my-app

# Récupérer un paquet portant le nom react
npm install react

# Récupérer d'un coup tous les noms listés dans le fichier manifeste
npm install

Les paquets récupérés vont dans node_modules (dossier que npm crée dans my-app pour y placer les paquets récupérés).

Dans my-app : ce que tu écris et ce que npm crée
my-app (dossier de l'application de réservation)
Les fichiers que tu écris
  • app.js — le code source du traitement des réservations
  • package.json — le fichier qui liste les noms à récupérer
node_modules (créé par npm)
react
  • Le code source du paquet récupéré
  • C'est ce contenu que tu appelles
Les paquets dont le paquet récupéré a besoin
  • Un dossier est créé par nom
  • S'il n'a besoin de rien, il n'y en a aucun
Le cadre extérieur est le dossier my-app. Le cadre du haut contient les fichiers que tu écris, celui du bas le dossier que npm crée et modifie.

Les fichiers que tu écris et le dossier que npm crée sont séparés à l'intérieur du même my-app.

Pour une même ligne, le résultat change selon la façon de la taper et selon les fautes dans le nom.

La ligne tapéeCe que fait npmRésultat dans my-app
npm install reactRécupère ce nom et ses dépendancesDes dossiers apparaissent dans node_modules
npm installRécupère d'un coup tous les noms de package.jsonnode_modules est créé en entier
npm install reacttttCherche et ne trouve pas404 Not Found, rien ne s'ajoute

Comme à la troisième ligne, si un nom mal tapé n'existe pas dans le registre, rien n'est installé.

Si un nom mal tapé existe par hasard, c'est autre chose qui s'installe : copie les noms depuis la page officielle.

Pourquoi récupérer un seul paquet ajoute plusieurs dossiers
npm install expressexpressPaquets requispar expressPaquets requispar ceux-làPaquets requisplus loin encorenode_modules :des dizaines de dossiers
Cela se déploie de haut en bas puis se rassemble à la fin. Ce dont le paquet récupéré a besoin, et ce dont ceux-là ont besoin à leur tour, arrivent avec lui. Pour un paquet qui n'a besoin de rien, comme react, il n'y a qu'un seul dossier.

Les paquets dont react a besoin, puis ceux dont ces derniers ont besoin, arrivent tous ensemble.

Ne pas avoir à chercher soi-même cet ensemble et à le récupérer un par un, c'est la raison d'utiliser un gestionnaire de paquets.

Récupérer un seul paquet ne veut pas dire qu'un seul dossier apparaît dans node_modules.

Le registre est un autre ordinateur, de l'autre côté d'Internet.

Le seul endroit où sont placés les paquets récupérés, c'est node_modules, dans le dossier my-app.

Le fichier app.js que tu as écrit appelle les paquets qui s'y trouvent et les utilise.

Ce que tu récupères va dans node_modules

Ce que tu récupères va dans le dossier node_modules créé à l'intérieur de my-app.

Le fichier app.js que tu as écrit ne change pas, et il y a plus de dossiers que de noms indiqués parce que ce dont le paquet récupéré a besoin arrive aussi.

package.json — le fichier manifeste où sont listés les noms des paquets récupérés

Le contenu de node_modules est créé par npm, et tu ne le modifies pas toi-même.

La seule chose que tu gères, c'est un unique fichier où sont listés les noms récupérés.

C'est le fichier manifeste (package.json en JavaScript ; fichier où sont inscrits les noms des paquets nécessaires au fonctionnement de l'application), et chacun des noms qui y figurent s'appelle une dépendance (dependency ; paquet nécessaire au fonctionnement de ton propre code).

{
  "name": "my-app",
  "dependencies": {
    "react": "^19.0.0",
    "express": "^5.1.0"
  }
}

Les deux entrées listées sous dependencies sont les dépendances de ce my-app.

À droite figure la version à récupérer ; les numéros servent à cet exemple, et en pratique c'est celle du moment de la récupération qui s'y trouve.

Le ^ en tête indique que « les versions plus récentes compatibles avec le numéro écrit sont également autorisées ».

Outre les dépendances, package.json contient d'autres informations.

Ce qui est listé dans package.json
package.json
name
  • Le nom de l'application elle-même
  • Il y est écrit my-app
dependencies
  • Liste les noms des paquets nécessaires au fonctionnement
  • npm install lit cette partie
  • Récupérer react y ajoute une ligne
scripts
  • L'endroit où l'on donne un nom court aux commandes fréquentes
  • S'appelle avec npm run start
Le cadre extérieur est le seul fichier package.json. Ce que npm install lit, c'est la partie dependencies, au milieu.

Ce que npm install lit, c'est la partie dependencies, au milieu.

Une seule et même chose porte trois noms, selon l'endroit d'où on la regarde.

La même chose porte un nom différent selon l'endroit d'où on la regarde
==Dans le registrePaquetStocké avec un nomet une versionDans package.jsonDépendanceListée comme nomrequis par my-appDans app.jsBibliothèque externeUn programme quetu appelles
À gauche l'endroit d'où l'on regarde, au milieu le nom qui y est employé, à droite la façon dont elle y est traitée. Les trois reliés par un double trait sont la même chose.

Grâce au fichier manifeste, tu n'as pas à transmettre node_modules à qui que ce soit.

Ce que tu as transmis à un autre ordinateurQuand la personne tape npm installmy-app fonctionne-t-il ?
app.js et package.jsonRécupère tous les noms de la listeLe même ensemble est là et ça fonctionne
app.js seulImpossible de savoir quels noms récupérerL'appel provoque une erreur
app.js et node_modulesLe contenu est là sans rien taperÇa fonctionne, mais tu transmets des centaines de dossiers

Tu transmets app.js et package.json, et la personne tape npm install une fois.

npm ne lit que les dependencies de package.json, récupère depuis le registre les noms qui y figurent et reconstruit node_modules.

Il n'y a pas besoin de transmettre node_modules lui-même.

Avec la seule liste des noms, le contenu se reconstruit

package.json est le fichier qui liste les noms des paquets nécessaires au fonctionnement de ce my-app.

npm install lit ce fichier et récupère tous les noms d'un coup, donc node_modules peut être reconstruit à tout moment et n'a jamais besoin d'être transmis.

Pareil en Python — pip, requirements.txt et l'environnement virtuel qui sépare les emplacements

Jusqu'ici, les noms employés étaient ceux de JavaScript.

En Python, seuls les noms diffèrent : ce qui est fait est identique.

Ce qui joue le même rôle en JavaScript et en Python
===JavaScriptnpmpackage.jsonnode_modulesPythonpiprequirements.txtsite-packagesRôleRécupérer enindiquant un nomLister les nomsà récupérerOù vont lespaquets récupérés
La rangée du haut est JavaScript, celle du milieu les noms Python, celle du bas le rôle. Les deux reliés par un double trait ne diffèrent que par le nom ; le rôle est le même.

pip récupère, et requirements.txt est le fichier manifeste qui liste les noms.

Les rôles étant les mêmes, apprendre l'un permet de lire l'autre de la même façon.

La seule différence, c'est l'emplacement : sans environnement virtuel, pip installe les paquets sur tout l'ordinateur.

Ce que l'on crée pour l'éviter, c'est un environnement virtuel (virtual environment ; mécanisme qui crée, sous forme de dossier, un emplacement de paquets réservé à cette application).

L'emplacement des paquets, séparé par application
Ton ordinateur
my-app (application de réservation)
  • node_modules — les dépendances vont ici
  • Invisible depuis une autre application
other-app (une autre application)
  • Possède son propre node_modules
  • Des versions différentes du même nom n'entrent pas en conflit
Une application Python sans environnement virtuel
  • site-packages est unique pour tout l'ordinateur
  • Si une autre application exige une autre version, il y a conflit
Le cadre extérieur est ton ordinateur. Les deux du haut ont leur emplacement à l'intérieur de leur dossier ; seul celui du bas partage un emplacement unique pour tout l'ordinateur.

Quand les dossiers sont séparés par application, des versions différentes du même nom cohabitent sans conflit.

Si les procédures d'installation commencent par faire créer un environnement virtuel, c'est pour établir cette séparation.

D'un langage à l'autre, les trois rôles sont les mêmes

Chaque langage a un programme qui récupère, un fichier manifeste qui liste les noms, et un emplacement où se range ce qui arrive.

En JavaScript, ce sont npm, package.json et node_modules ; en Python, pip et requirements.txt, et Python est le seul où les paquets vont sur tout l'ordinateur tant qu'aucun environnement virtuel n'est créé.

QUIZ

Vérification des connaissances

Répondez à chaque question une par une.

Question 1Quand tu tapes npm install react dans le dossier my-app, où va le paquet récupéré ?

Question 2Pour faire tourner le même my-app sur un autre ordinateur, pourquoi n'as-tu pas besoin de transmettre node_modules ?

Question 3Pourquoi récupérer un seul paquet peut-il créer plus d'un dossier dans node_modules ?