Introduction à Node.js
Avec Node.js, on peut écrire des serveurs web, des scripts d’automatisation, des outils en ligne de commande, et bien plus — le tout en JavaScript. Dans ce cours, on construit des applications web complètes. Node.js nous permet d’utiliser un seul langage pour le client et le serveur.
Navigateur vs Node.js
JavaScript est le même langage dans les deux cas, mais l’environnement disponible change radicalement.
| Navigateur | Node.js | |
|---|---|---|
| Moteur | V8 (Chrome), SpiderMonkey (Firefox), JavaScriptCore (Safari) | V8 |
| Contexte | Page web (onglet) | Processus sur une machine |
| APIs disponibles | document, window, fetch, DOM |
fs, http, path, process |
| Accès système | ❌ Interdit (bac à sable) | ✅ Fichiers, réseau, OS |
| Modules | <script type="module"> |
CommonJS ou ES Modules |
| Utilisation | Interfaces utilisateur | Serveurs, scripts, outils |
Installation de Node.js
Rendez-vous sur nodejs.org et téléchargez la version LTS (Long Term Support) — c’est la version stable recommandée pour le développement.
L’installateur inclut deux programmes :
node— l’interpréteur JavaScriptnpm— le gestionnaire de paquets (Node Package Manager)
Vérification
Après l’installation, ouvrez un terminal et vérifiez :
node --version # ex: v22.15.0
npm --version # ex: 10.9.2
Exécuter du JavaScript
Exécuter un fichier :
node mon_script.js
Mode interactif (REPL) — utile pour tester rapidement :
node
> 2 + 2
4
> "Bonjour".toUpperCase()
'BONJOUR'
> .exit
Démarrer un projet Node.js
Un projet Node.js est un dossier contenant au minimum un fichier package.json qui décrit le projet et ses dépendances.
Initialisation
mkdir mon-projet
cd mon-projet
npm init -y
La commande npm init crée le fichier package.json qui définit les informations de ton projet (nom, version, description, auteur) ainsi que la liste de ses dépendances. Le drapeau -y répond oui à toutes les questions et génère le fichier avec des valeurs par défaut. Sans -y, npm pose une série de questions de façon interactive.
Installer un paquet
npm install express
Cette commande fait trois choses :
- Télécharge
expresset toutes ses dépendances dans le dossiernode_modules/ - Ajoute
expressà la sectiondependenciesdepackage.json - Crée ou met à jour
package-lock.json(verrouillage des versions exactes)
On peut en installer plusieurs d’un coup, ou cibler une version précise :
npm install lodash axios # plusieurs paquets à la fois
npm install express@4.21.0 # une version spécifique
Dépendances de production vs de développement
Toutes les dépendances ne servent pas au même moment. Certaines sont nécessaires pour que l’application fonctionne (ex: un serveur a besoin d’Express). D’autres ne servent qu’au développement : formateurs de code, outils de test, linters.
On les sépare avec -D (ou --save-dev) :
npm install -D prettier # ajouté à devDependencies
Les devDependencies ne sont pas installées en production. Cette distinction réduit le poids de l’environnement de production.
Dépendances globales
Certains outils en ligne de commande s’installent globalement, pour être disponibles depuis n’importe quel dossier (projet) :
npm install -g <paquet>
Structure d’un projet Node.js
mon-projet/
├── node_modules/ ← dépendances (généré, ne pas modifier)
├── src/
│ ├── index.js ← point d'entrée
│ ├── routes/ ← définition des routes
│ └── utils/ ← fonctions utilitaires
├── public/ ← fichiers statiques (HTML, CSS, images)
├── package.json ← manifeste du projet
├── package-lock.json ← versions verrouillées exactes
└── .gitignore ← doit contenir node_modules/
Règles essentielles
node_modules/ doit toujours apparaître dans .gitignore. Ce dossier peut contenir des milliers de fichiers et se régénère avec npm install. On ne versionne jamais les dépendances elles-mêmes — seulement la liste des dépendances dans package.json.
package-lock.json doit être versionné. Il garantit que tous les développeurs d’une équipe installent exactement les mêmes versions.
Un collaborateur qui clone le projet fait simplement :
git clone <url>
cd mon-projet
npm install # recrée node_modules/ à partir de package.json
Le fichier package.json
C’est le manifeste du projet — l’équivalent du pom.xml en Java. Il décrit le projet, ses dépendances, et ses scripts.
{
"name": "mon-serveur",
"version": "1.0.0",
"description": "Serveur web pour IFT3225",
"main": "src/index.js",
"type": "module",
"scripts": {
"start": "node src/index.js",
"dev": "node --watch src/index.js"
},
"dependencies": {
"express": "^4.21.0"
},
"devDependencies": {
"prettier": "^3.3.0"
}
}
Champs importants
"type": "module" — Active la syntaxe import/export (ES Modules).
Sans cette ligne, Node.js utilise l’ancien système require() (CommonJS).
"scripts" — Définit des commandes personnalisées exécutables via npm run <nom>. Le script "dev" ci-dessus utilise --watch, un mode qui redémarre automatiquement le serveur quand un fichier change.
"dependencies" — Les paquets nécessaires en production (le serveur en a besoin pour fonctionner).
"devDependencies" — Les paquets utilisés seulement pendant le développement (formateurs, outils de test, etc.).
Le préfixe ^ dans les versions (ex: "^4.21.0") signifie « compatible avec 4.21.0 » — npm pourra installer 4.21.5 ou 4.22.0, mais pas 5.0.0.
Les scripts npm
Les scripts automatisent les tâches répétitives du projet : lancer le serveur, exécuter les tests, construire le code. On les définit dans la section "scripts" du package.json :
"scripts": {
"start": "node src/index.js",
"dev": "node --watch src/index.js",
"test": "node --test"
}
On les exécute avec npm run <nom> :
npm run dev
Passer des arguments à un script
Le -- sépare les arguments destinés à npm de ceux destinés au script lui-même :
npm run dev -- --port 8080
Tout ce qui suit -- est transmis tel quel à la commande du script.
npx — exécuter sans installer
npx est livré avec npm. Il exécute un paquet sans l’installer globalement : npx le télécharge temporairement, l’exécute, puis le retire. C’est idéal pour les outils qu’on utilise rarement ou une seule fois.
npx create-astro@latest mon-site # échafauder un projet Astro
npx prettier --write . # formater sans installer prettier globalement
npm ci — installation reproductible
npm install peut modifier le package-lock.json (par exemple si une nouvelle version compatible est sortie). En production et en intégration continue (CI), on veut au contraire une installation strictement identique à chaque fois.
npm ci # installe exactement ce qui est dans package-lock.json
npm ci ignore le package.json pour les versions et suit le package-lock.json à la lettre.
Il supprime d’abord node_modules/ pour repartir propre, et échoue si le lock et le package.json ne sont pas cohérents.
C’est la commande à utiliser dans les scripts de déploiement et les pipelines CI.
Référence des commandes
Un récapitulatif des commandes npm les plus utilisées, pour consultation rapide.
Projet et dépendances
| Commande | Effet |
|---|---|
npm init -y |
Crée un package.json avec les valeurs par défaut |
npm install (ou npm i) |
Installe toutes les dépendances du package.json |
npm install <pkg> |
Installe un paquet et l’ajoute aux dependencies |
npm install <pkg>@<version> |
Installe une version précise |
npm install -D <pkg> |
Installe en devDependencies |
npm install -g <pkg> |
Installe globalement (hors projet) |
npm uninstall <pkg> |
Retire un paquet |
npm ci |
Installation reproductible depuis le lock (CI/déploiement) |
Mise à jour et inspection
| Commande | Effet |
|---|---|
npm update |
Met à jour selon les plages de versions autorisées |
npm update <pkg> |
Met à jour un paquet précis |
npm outdated |
Liste les paquets ayant une version plus récente |
npm list |
Affiche l’arbre des dépendances locales |
npm list -g |
Affiche les paquets installés globalement |
npm -v |
Affiche la version de npm |
Scripts et exécution
| Commande | Effet |
|---|---|
npm run <script> |
Exécute un script défini dans package.json |
npm run |
Liste tous les scripts disponibles |
npm start |
Raccourci pour npm run start |
npm test |
Raccourci pour npm run test |
npm run <script> -- <args> |
Passe des arguments au script |
npx <pkg> |
Exécute un paquet sans l’installer |