NPM - Node Package Manager
Découvrez NPM, le gestionnaire de paquets Node.js essentiel pour tout développeur JavaScript. Apprenez à gérer vos dépendances efficacement.
Qu'est ce que Npm (Node Package Manager)
Npm est un gestionnaire de paquets Node utilisé pour importer ou publier des paquets Node avec les autres développeurs qui utilisent Npm.
Npm se divise en 3 grands axes :
1. Le site Npm
Le site Npm sert à connaître les paquets Node disponibles sur le Registry Npm.
2. CLI ou l'Interface en Ligne de Commande
La CLI est une énorme partie du Npm puisque c'est par la CLI que vous interagissez avec Npm et avec le Registry Npm afin d'importer des paquets s'y trouvant ou de publier vos paquets.
3. Npm Registry ou le Dépôt
Le Registry Npm est en fait une énorme base de données qui va contenir des applications prêtes à l'emploi, ou simplement des paquets Node que vous pourrez télécharger afin de les utiliser ou les adapter à vos besoins pour les utiliser dans votre paquet.
Qu'est ce qu'Npx (Node Package Executer)
Npx est en fait un exécuteur des paquets Node. Grâce à Npx il est possible d'exécuter des packages Node depuis le registry plutôt que de le télécharger pour pouvoir l'exécuter, cette approche est intéressante dans le cadre où vous voudriez utiliser une application Node, vous n'auriez alors pas besoin de télécharger quoi que ce soit pour pouvoir utiliser l'application.
Note:
En général, cette approche est préférée pour des applications légères.
Node Packages (Paquets Node)
Un package Node est un fichier ou un dossier décrit par un fichier package.json (Le plus souvent un dossier).
Le fichier package.json va donner des informations à propos de votre package, c'est pourquoi il faut que ce fichier contienne les informations les plus détaillées possible.
Un package node peut être public ou privé, En savoir plus sur la visibilité des packages, comme il peut être restreint à une certaine portée ou non. En savoir plus sur la portée des packages
Un package node peut être tout ce qui suit (Et plus encore) :
- Un fichier ou un dossier décrit par un fichier package.json
- Un fichier compressé contenant (1.)
- Une URL pointant vers 2.
- L'url d'un repos GitHub qui lorsque cloné donnera un fichier ou un dossier décrit par un fichier package.json
Node Modules
Les modules Node sont des dépendances dont votre package aura besoin pour s'exécuter ou simplement qui vous seront nécessaire pour le développement de votre package.
Un module Node peut être :
- Un dossier
- Un fichier JS
Vous pouvez voir les modules Node dans le dossier node_modules
.
Note:
Il se peut qu'un module Node ne se soit pas correctement installé, dans ce cas, il est conseillé de supprimer le dossier node_modules
et de réinstaller tous les modules.
Puisqu'une image vaut mieux que mille mots :

Cette image explique à quel point les modules Node sont lourds.
Note:
Il est très important de ne pas omettre le node_modules
dans votre .gitignore
afin de ne pas envoyer tous les modules sur votre dépôt distant.
Le fichier package.json
Comme expliqué plus haut, le fichier package.json est un fichier qui est essentiel à votre package Node.
Ce fichier fait office de carte pour votre package, vous allez renseigner beaucoup d'informations dans ce fichier. Vous pourrez y mettre toutes les informations qui suivent (Et bien plus encore, liste non exhaustive) :
{
"name": "Le nom de votre package",
"version": "La version de votre package",
"description": "La description de votre package",
"keywords": ["Ce champ est plutôt optionnel"],
"homepage": "Page de référence liée à votre package",
"bugs": "Où remonter les bugs liés à votre package",
"author": "Quelques informations à propos de vous",
"main": "Point d'entrée de votre package (Habituellement index.js)",
"scripts": {
"test": "Configuration avancée pour votre package"
},
"dependencies": {
"express": "4.18.3"
},
"devDependencies": {
"nodemon": "^2.0.20"
},
"private": true
}
Npm se chargera de générer des valeurs par défaut à des champs non renseignés, par exemple pour le champ script
.
Npm initialisera le champ avec une valeur de test.
Semantic Versioning ou le Versionnage sémantique
Le versionnage sémantique est un standard que vous devriez suivre lors de modifications significatives de votre package.
Il est recommandé de publier vos modifications avec différentes versions de votre package, champ version
de votre package.json.
De ce fait, les autres développeurs utilisant votre package pourront comprendre l'étendue des modifications apportées pour chaque version de votre package.
Pour aborder ce qui suit, vous devez comprendre quelques termes :
- MAJOR : Version qui ne sera pas rétrocompatible
- MINOR : Version qui modifiera votre code (Ajout d'une fonctionnalité par exemple) mais qui restera rétrocompatible
- PATCH : Version qui aura pour effet direct de corriger des bugs, tout en restant rétrocompatible
Spécificités du versionnage sémantique
- Il est recommandé de commencer le développement de votre package en version
1.0.0
- Lorsque vous voudrez faire une mise à jour PATCH, votre package passera en version
1.0.1
- Lorsque vous voudrez faire une mise à jour MINOR, votre package passera en version
1.1.0
(le nombre de patch a été remis à 0) - Lorsque vous voudrez faire une mise à jour MAJOR, votre package passera en version
2.0.0
(le nombre de minor a été remis à 0)
Note:
Chaque chiffre n'est pas limité à 9, une version telle que 2.3.19
est une version totalement correcte.
Pour approfondir sur le sujet, consultez la documentation officielle.
dependencies
et devDependencies
Différence entre Le champ dependencies
vous permettra de lister les dépendances dont votre package aura besoin pour s'exécuter.
Le champ devDependencies
quant à lui vous permettra de lister les dépendances dont vous aurez besoin afin de développer votre package.
Analogie
Si vous voulez cuisiner un gâteau par exemple et le manger :
Pour la préparation de votre gâteau, vous pourrez utiliser un batteur électrique ou simplement utiliser une fourchette.
Dans cet exemple, le batteur électrique représente une devDependency
, utile, mais optionnel puisqu'il vous est possible d'utiliser une fourchette.
Et la fourchette représente elle, à la fois une devDependency
ainsi qu'une dependency
puisque vous pourrez utiliser cette même fourchette pour manger votre gâteau.
Le fichier package-lock.json
Le fichier package-lock.json est automatiquement généré par Npm lorsqu'une opération affectant l'arborescence du dossier node_modules
ou le fichier package.json
est effectuée.
Le package-lock.json va contenir une description exacte de l'arborescence des dépendances. Ce fichier est prévu pour être inclus au dépôt, il peut être utilisé pour :
- Obtenir une seule définition de l'arborescence des dépendances
- Obtenir un moyen simple de retracer les états du
node_modules
- Obtenir une meilleure visibilité des changements apportés à l'arborescence
- Optimiser l'installation des dépendances, afin de ne pas avoir à re-télécharger les dépendances déjà installées
Commandes essentielles
Initialiser un projet Npm
Si vous voulez initialiser un projet Node.js vous devez utiliser la commande :
npm init
Cette commande doit être exécutée dans le dossier racine de votre projet, et sert à créer le fichier package.json.
Installer des dépendances
Dépendances de production
npm install <nom_du_package>
# ou
npm i <nom_du_package>
Exemple pour utiliser la librairie Express :
npm i express
Dépendances de développement
npm install <nom_du_package> --save-dev
Exemple concret :
npm install winston --save-dev
Réinstaller des dépendances
Dans le cas où vous importez un projet Node.js sans node_modules
:
npm install
Ce qui aura pour effet de télécharger toutes les dépendances connues du projet.
Note:
Vous pouvez utiliser la commande npm install --dev
afin de télécharger uniquement les dépendances de développement.