1. Qu'est-ce que Node.js ?

Node.js est un runtime JavaScript côté serveur basé sur le moteur V8 de Chrome. Il permet d'exécuter du JavaScript en dehors du navigateur — sur votre machine, un serveur, un conteneur Docker, etc.

Node.js utilise un modèle non-bloquant / event-driven : au lieu d'attendre qu'une opération (lecture disque, requête réseau) se termine, il enregistre un callback et continue à traiter d'autres événements. Cela le rend extrêmement performant pour les applications I/O intensives.

Cas d'usage principaux

  • API REST — backends légers et rapides (Express, Fastify, Hono)
  • Outils CLI — scripts de build, linters, générateurs de code
  • Serveurs temps réel — chat, notifications, WebSockets
  • Microservices — architecture distribuée
  • Build tooling — Webpack, Vite, Rollup, esbuild tournent tous sur Node.js

Node.js vs PHP vs Python pour les APIs

CritèreNode.jsPHPPython (Django/Flask)
Modèle I/OAsynchrone non-bloquantSynchrone bloquantSynchrone (async possible)
Performance I/OExcellentMoyenBon
Courbe d'apprentissageModéréeFacileFacile
Écosystème npm+2M packagesComposerPyPI
Language full-stackJavaScript partoutNonNon
Usage principalAPIs, temps réel, CLICMS, web classiqueData science, ML, web

Exemple minimal

// hello.js — votre premier script Node.js
console.log('Hello from Node.js !');
console.log('Version :', process.version);
console.log('Plateforme :', process.platform);

// Lancer avec : node hello.js
💡 Node.js n'est pas un langage — c'est un environnement d'exécution. Le langage reste JavaScript.

2. Installation & REPL

Téléchargez Node.js depuis nodejs.org. Choisissez la version LTS (Long Term Support) pour les projets de production. L'installation inclut également npm (Node Package Manager).

Vérifier l'installation

# Vérifier les versions installées
node --version    # ex: v20.11.0
npm --version     # ex: 10.2.4

# Exécuter une expression directement
node -e "console.log(process.version)"
node -e "console.log(2 ** 10)"  # 1024

Le REPL (Read-Eval-Print-Loop)

Le REPL est un interpréteur interactif. Tapez node dans votre terminal pour l'ouvrir. C'est idéal pour tester du code rapidement.

// Dans le terminal, tapez : node
// Vous entrez dans le REPL Node.js

> 2 + 2
4
> 'Hello' + ' World'
'Hello World'
> [1, 2, 3].map(x => x * 2)
[ 2, 4, 6 ]
> const obj = { name: 'Alice', age: 30 }
undefined
> obj.name
'Alice'
> .exit   // ou Ctrl+C deux fois pour quitter

process.argv — Arguments en ligne de commande

process.argv est un tableau contenant les arguments passés au script. argv[0] est le chemin de Node, argv[1] est le chemin du script, les suivants sont vos arguments.

// args.js
const args = process.argv.slice(2); // Ignorer node et le nom du script
console.log('Arguments reçus :', args);

// node args.js Alice 25
// Arguments reçus : [ 'Alice', '25' ]

3. Premier script Node.js

Créez un fichier hello.js et exécutez-le avec node hello.js. Node.js fournit plusieurs objets globaux utiles dès le départ.

Les méthodes console

// console.js — Les différents niveaux de log
console.log('ℹ️  Information standard');
console.warn('⚠️  Avertissement — affiché en jaune dans certains terminaux');
console.error('❌ Erreur — écrit sur stderr');
console.info('📋 Information (alias de log)');
console.table([{ nom: 'Alice', age: 30 }, { nom: 'Bob', age: 25 }]);
console.time('mesure');
// ... code à mesurer ...
console.timeEnd('mesure'); // mesure: 1.234ms

process.exit() et codes de sortie

// exit.js
const code = process.argv[2];

if (!code) {
  console.error('❌ Argument manquant');
  process.exit(1); // Code 1 = erreur (convention Unix)
}

console.log('✅ Code reçu :', code);
process.exit(0);  // Code 0 = succès

Variables d'environnement avec process.env

// env.js — Lire les variables d'environnement
const env = process.env.NODE_ENV || 'development';
const port = process.env.PORT || 3000;
const apiKey = process.env.API_KEY || 'non-configurée';

console.log(`Environnement : ${env}`);
console.log(`Port          : ${port}`);
console.log(`API Key       : ${apiKey}`);

// Lancer avec : NODE_ENV=production PORT=8080 node env.js
// Ou sur Windows : set NODE_ENV=production && node env.js

Script complet avec arguments

// greet.js — Script complet
const [,, prenom, age] = process.argv;

if (!prenom) {
  console.error('Usage: node greet.js  [age]');
  process.exit(1);
}

const ageMsg = age ? `, vous avez ${age} ans` : '';
console.log(`Bonjour ${prenom}${ageMsg} ! 👋`);
console.log(`Node.js ${process.version} sur ${process.platform}`);
Bonne pratique : toujours utiliser process.exit(1) en cas d'erreur dans un script CLI. Les outils de CI/CD utilisent ce code de retour pour détecter les échecs.

4. Modules CommonJS

Node.js utilise le système de modules CommonJS (CJS) par défaut. Chaque fichier est un module isolé. Vous importez avec require() et exportez avec module.exports.

Créer un module : math.js

// math.js — Définir un module
function additionner(a, b) { return a + b; }
function soustraire(a, b)  { return a - b; }
function multiplier(a, b)  { return a * b; }
function diviser(a, b) {
  if (b === 0) throw new Error('Division par zéro !');
  return a / b;
}

const PI = 3.14159265;

// Exporter un objet avec les fonctions
module.exports = { additionner, soustraire, multiplier, diviser, PI };

Utiliser un module local

// main.js — Importer et utiliser math.js
const math = require('./math'); // .js est optionnel

console.log(math.additionner(5, 3));  // 8
console.log(math.multiplier(4, 7));   // 28
console.log(math.PI);                 // 3.14159265

// Destructuration pour plus de clarté
const { diviser, soustraire } = require('./math');
console.log(diviser(10, 2));   // 5
console.log(soustraire(9, 3)); // 6

Raccourci exports.xxx

// utils.js — Utiliser exports directement
exports.majuscule = str => str.toUpperCase();
exports.minuscule = str => str.toLowerCase();
exports.capitaliser = str => str.charAt(0).toUpperCase() + str.slice(1).toLowerCase();

// ⚠️ Ne PAS mélanger exports.xxx et module.exports = {...}
// Choisir l'un ou l'autre dans un fichier

Types de modules

TypeImportExemple
Module localrequire('./fichier')require('./math')
Module natifrequire('nom')require('fs'), require('path')
Module npmrequire('nom')require('express')
⚠️ require() est synchrone et mis en cache. Node.js charge le module une seule fois et retourne le même objet lors des appels suivants.

5. npm & package.json

npm (Node Package Manager) est le gestionnaire de packages officiel de Node.js. Il vous permet d'installer des bibliothèques tierces et de gérer les scripts de votre projet.

Initialiser un projet

# Créer un dossier et initialiser le projet
mkdir mon-projet && cd mon-projet
npm init -y          # Crée package.json avec des valeurs par défaut

# Installer des dépendances
npm install express           # Dépendance de production
npm install --save-dev nodemon  # Dépendance de développement uniquement
npm install dayjs             # Autre exemple

# Raccourcis courants
npm i express        # npm install express
npm i -D nodemon     # npm install --save-dev nodemon

# Désinstaller
npm uninstall express

Scripts npm

{
  "scripts": {
    "start": "node server.js",
    "dev": "nodemon server.js",
    "test": "node tests/index.js",
    "build": "node scripts/build.js"
  }
}
// Lancer avec : npm start, npm run dev, npm test

Semantic Versioning (SemVer)

NotationSignificationExemple
1.2.3Version exacteExactement 1.2.3
^1.2.3Compatible mineur1.2.3 à <2.0.0
~1.2.3Compatible patch1.2.3 à <1.3.0
*Toute version⚠️ Dangereux
>=1.0.0Supérieur ou égal1.0.0 et plus

package.json complet

{
  "name": "mon-api-node",
  "version": "1.0.0",
  "description": "API REST avec Node.js",
  "main": "server.js",
  "scripts": {
    "start": "node server.js",
    "dev": "nodemon server.js",
    "test": "node tests/index.js"
  },
  "dependencies": {
    "express": "^4.18.2",
    "dotenv": "^16.3.1"
  },
  "devDependencies": {
    "nodemon": "^3.0.2"
  },
  "engines": {
    "node": ">=18.0.0"
  },
  "author": "Votre Nom",
  "license": "MIT"
}
💡 package-lock.json verrouille les versions exactes de toutes les dépendances (y compris transitives). Commitez-le dans votre dépôt Git pour garantir des installations reproductibles.
← Accueil Exercices →