Leçon 2 / 8
Leçon 02 · Node.js

npm et modules

npm : le gestionnaire de paquets de Node.js

npm (Node Package Manager) est l'outil qui vient avec Node.js. Il te permet d'installer des milliers de bibliothèques et d'outils prêts à l'emploi publiés sur npmjs.com — le plus grand registre de packages JavaScript au monde.

Besoin d'envoyer des emails, de manipuler des dates, de faire des requêtes HTTP, de chiffrer des données ? Il existe un package npm pour ça. Au lieu de tout coder toi-même, tu réutilises du code vérifié par la communauté.

💡

npmjs.com héberge plus de 2 millions de packages. Chaque package est versionné selon la norme semver (ex : 1.4.2). Tu peux rechercher un package, lire sa documentation et voir ses dépendances directement sur le site.

Pour démarrer un nouveau projet Node.js, crée un dossier et initialise npm :

Terminal
# Crée un dossier pour ton projet
mkdir mon-projet
cd mon-projet

# Initialise npm avec les valeurs par défaut
npm init -y

Le flag -y répond "oui" à toutes les questions et crée un fichier package.json immédiatement. Sans -y, npm te pose des questions interactives (nom du projet, version, auteur…).

package.json : la carte d'identité du projet

Le fichier package.json décrit ton projet : son nom, sa version, ses scripts et ses dépendances. C'est le premier fichier que tu regardes quand tu reprends un projet.

package.json
{
  "name": "mon-projet",
  "version": "1.0.0",
  "scripts": {
    "start": "node index.js",
    "dev":   "nodemon index.js"
  },
  "dependencies": {
    "express": "^4.18.2"
  },
  "devDependencies": {
    "nodemon": "^3.1.0"
  }
}

Les champs importants :

  • name — nom du projet (minuscules, sans espaces)
  • version — version du projet au format majeur.mineur.patch
  • scripts — des raccourcis de commandes lancés avec npm run <nom>
  • dependencies — packages nécessaires en production
  • devDependencies — packages utilisés uniquement en développement

Pour lancer le script start défini dans package.json, tape npm start. Pour les autres scripts, utilise npm run dev, npm run build, etc.

Installer, désinstaller des packages

Les commandes npm essentielles pour gérer tes dépendances :

Terminal
# Installer un package (ajouté dans "dependencies")
npm install express

# Installer plusieurs packages en une seule commande
npm install express dotenv axios

# Installer un package de développement uniquement
# (ajouté dans "devDependencies")
npm install --save-dev nodemon

# Désinstaller un package
npm uninstall axios

# Installer toutes les dépendances d'un projet existant
npm install

La distinction entre dependencies et devDependencies est importante. nodemon redémarre automatiquement ton serveur à chaque modification du code : utile en développement, mais inutile en production. --save-dev l'indique clairement.

⚠️

npm install --save-dev peut aussi s'écrire npm i -D. De même, npm install s'abrège en npm i. Ces raccourcis sont courants dans les tutoriels et la documentation.

node_modules et .gitignore

Quand tu installes un package, npm crée un dossier node_modules/ dans ton projet et y télécharge le package ainsi que toutes ses dépendances. Ce dossier peut rapidement contenir des centaines de fichiers et peser plusieurs dizaines de Mo.

.gitignore
# Ne jamais versionner node_modules
node_modules/

# Fichiers d'environnement (mots de passe, clés API)
.env

# Logs npm
npm-debug.log*

Tu ne mets jamais node_modules/ dans Git. Le fichier package.json (et package-lock.json) suffit : quand quelqu'un clone ton dépôt, un simple npm install recrée le dossier node_modules/ avec exactement les mêmes versions.

CommonJS : require() et module.exports

Node.js supporte deux systèmes de modules. Le plus ancien — et le plus répandu dans les tutoriels — est CommonJS. Il utilise les fonctions require() pour importer et module.exports pour exporter.

math.js — module à exporter
// On définit des fonctions
function additionner(a, b) {
  return a + b;
}

function multiplier(a, b) {
  return a * b;
}

// On exporte ce qu'on veut rendre disponible
module.exports = { additionner, multiplier };
index.js — fichier qui importe
// Importer son propre module (chemin relatif avec ./)
const { additionner, multiplier } = require('./math');

// Importer un package npm (sans ./ ni chemin)
const express = require('express');

console.log(additionner(3, 4));  // 7
console.log(multiplier(3, 4)); // 12

Pour tes propres fichiers, le chemin commence par ./ (dossier courant) ou ../ (dossier parent). Pour les packages npm, tu écris juste le nom du package.

ES Modules : import / export

Les ES Modules (ESM) sont le système de modules standard de JavaScript, utilisé nativement dans les navigateurs. Node.js les supporte depuis la version 12. La syntaxe utilise import et export.

Pour activer les ES Modules dans Node.js, ajoute "type": "module" dans ton package.json — ou utilise l'extension .mjs pour tes fichiers.

package.json — activer ESM
{
  "name": "mon-projet",
  "version": "1.0.0",
  "type": "module"
}
math.js — exports nommés
// Export nommé : on exporte directement chaque fonction
export function additionner(a, b) {
  return a + b;
}

export function multiplier(a, b) {
  return a * b;
}
index.js — imports
// Import nommé depuis un fichier local
import { additionner, multiplier } from './math.js';

// Import depuis un package npm
import express from 'express';

console.log(additionner(5, 3)); // 8
💡

CommonJS ou ESM ? Les deux coexistent. CommonJS reste très présent dans les projets existants et l'écosystème serveur. ESM est le standard moderne, recommandé pour les nouveaux projets. Dans ce cours, tu verras les deux. L'essentiel : ne mélange pas les deux systèmes dans le même projet sans configuration spécifique.

Modules natifs de Node.js

Node.js inclut des modules intégrés (built-in) disponibles sans installation. Voici les plus utiles :

modules-natifs.js (CommonJS)
const path   = require('path');
const os     = require('os');
const { URL } = require('url');
const crypto = require('crypto');

// path — manipuler les chemins de fichiers
const fichier = '/home/user/projet/index.js';
console.log(path.basename(fichier));  // index.js
console.log(path.dirname(fichier));   // /home/user/projet
console.log(path.extname(fichier));   // .js
console.log(path.join('dossier', 'sous', 'fichier.txt'));
// dossier/sous/fichier.txt  (séparateur adapté à l'OS)

// os — infos sur le système
console.log(os.platform());  // linux, darwin, win32
console.log(os.hostname());  // nom de la machine
console.log(os.homedir());   // /home/user
console.log(os.cpus().length); // nombre de coeurs CPU

// url — manipuler des URLs
const monUrl = new URL('https://example.com/page?id=42');
console.log(monUrl.hostname);              // example.com
console.log(monUrl.searchParams.get('id')); // 42

// crypto — hacher des données
const hash = crypto
  .createHash('sha256')
  .update('mon-mot-de-passe')
  .digest('hex');
console.log(hash); // empreinte sha256 en hexadécimal

Ces modules s'importent exactement comme un package npm, mais tu n'as rien à installer. Le module path est particulièrement utile pour construire des chemins de fichiers portables (Windows utilise \, Linux et macOS utilisent /).

npx : exécuter sans installer globalement

npx (inclus avec npm) te permet de lancer un package directement, sans l'installer dans ton projet ni globalement sur ta machine. C'est idéal pour les outils qu'on utilise une seule fois ou pour initialiser des projets.

Terminal
# Créer un projet React sans installer create-react-app globalement
npx create-react-app mon-app

# Créer un projet Express avec le générateur officiel
npx express-generator mon-api

# Lancer un serveur HTTP statique temporaire dans le dossier courant
npx serve .

# Vérifier la version d'un outil sans l'installer
npx cowsay "Bonjour !"

npx télécharge le package, l'exécute, puis ne le conserve pas. Ton système reste propre, et tu utilises toujours la dernière version du package sans avoir à le mettre à jour manuellement.

// À retenir
  • npm est le gestionnaire de paquets de Node.js — il installe des bibliothèques depuis npmjs.com.
  • npm init -y crée un package.json avec les valeurs par défaut.
  • npm install express ajoute express dans dependencies.
  • npm install --save-dev nodemon ajoute nodemon dans devDependencies.
  • Ne jamais versionner node_modules/ — l'ajouter dans .gitignore.
  • CommonJS : require() / module.exports — système historique de Node.js.
  • ESM : import / export — standard moderne, activer avec "type": "module".
  • Modules natifs utiles : path, os, url, crypto — aucune installation nécessaire.
  • npx exécute un package sans l'installer globalement.