Introduction
Vos acquis en JavaScript
Lors de votre première année, vous avez découvert JavaScript comme langage de programmation pour rendre vos pages web interactives. Voici un rappel de ce que vous avez appris :
- Variables et types de données : Déclaration avec
const/let, manipulation de chaînes, nombres, booléens, tableaux et objets - Fonctions : Création de fonctions classiques et fléchées (
=>) pour organiser et réutiliser du code - Manipulation du DOM : Sélection d'éléments HTML (
querySelector,getElementById), modification de contenu et de styles, création dynamique d'éléments - Gestion des événements : Écoute et réaction aux actions utilisateur (clics, soumission de formulaires) avec
addEventListener - Programmation asynchrone : Requêtes HTTP avec
fetch(), gestion des promesses avec.then()ouasync/await
Node.js
JavaScript permet à la base la création de sites web dynamiques. Node.js est une bibliothèque basée sur JavaScript qui offre la possibilité de gérer un backend. En d'autres termes, il est interprété côté serveur et non plus côté client (navigateur). Bien que Node.js possède ses propres caractéristiques, il peut en partie être comparé à des langages tels que PHP ou Ruby.
Node.js permet principalement de gérer des interactions backend (côté serveur). L'une de ses spécificités est notamment de très bien gérer les requêtes multiples asynchrones (qui n'ont pas lieu en même temps).
Applications backend possibles avec Node.js
Node.js permet de créer une grande variété d'applications backend :
- API REST : Services web pour applications mobiles et SPA
- Applications temps réel (websocket) : Chat, messagerie instantanée, notifications live
- Streaming de données : Vidéo, audio, fichiers volumineux
- Authentification et autorisation : Systèmes de connexion, JWT, OAuth
- Tâches planifiées (cron) : Jobs automatisés, traitements batch
- Proxy et passerelles API : Routage et agrégation de requêtes
- Outils CLI : Scripts en ligne de commande pour automatisation
Limitations de JavaScript
Tout ce que vous avez appris fonctionne uniquement dans un navigateur web. JavaScript côté client (frontend) a des limitations importantes :
| Caractéristique | JavaScript (navigateur) | Node.js |
|---|---|---|
| Contexte d'exécution | Navigateur (Chrome, Firefox, etc.) | Côté serveur |
| Accès aux fichiers | Non | Oui (via le module fs) |
| Serveur web | Non | Oui (module http, Express) |
| Base de données | Non (risque de sécurité) | Oui (MySQL, MongoDB, PostgreSQL, etc.) |
| Modules intégrés | Aucun, sauf APIs du DOM | Oui (fs, http, path, etc.) |
| Modules tiers (npm) | Non | Oui, écosystème npm complet |
| Gestion multi-users | Chaque navigateur isolé | Serveur centralisé |
| Utilisation principale | Interaction utilisateur, DOM, animations | Backend, API, tâches système |
Comparaison avec les autres backend
Le problème du multi-threading traditionnel
Les serveurs classiques (PHP, Java) utilisent un système de multi-threading : chaque requête reçue est assignée à un thread dédié. Le problème ? Ce thread reste bloqué pendant les opérations longues comme les requêtes à la base de données ou les appels API externes.
Avec des milliers de requêtes simultanées, le serveur doit créer autant de threads, ce qui consomme énormément de ressources. À un moment donné, le serveur atteint une limite : il ne peut plus créer de threads. Les nouvelles requêtes doivent attendre, et les performances s'effondrent drastiquement.
Node.js : Single-threaded et asynchrone
Node.js fonctionne différemment : un seul thread gère toutes les requêtes de manière non-bloquante. Quand une opération est longue, Node.js ne l'attend pas ; il continue à traiter d'autres requêtes.
Exemple du fonctionnement :
- Requête 1 arrive → lance une requête base de données et continue
- Requête 2 arrive → lance une requête base de données et continue
- La base répond pour la requête 2 → Node.js la traite
- La base répond pour la requête 1 → Node.js la traite
Résultat : un seul thread gère des milliers de connexions simultanées sans ralentissement, en utilisant beaucoup moins de ressources qu'avec le multi-threading traditionnel. C'est pour cela que Node.js est parfait pour les applications web modernes à forte charge.
Archi d'une application moderne
┌─────────────────────────────────────────────────────────────┐
│ NAVIGATEUR (Frontend) │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ HTML + CSS + JavaScript │ │
│ │ - Manipulation du DOM │ │
│ │ - Événements utilisateur │ │
│ │ - Appels fetch() vers l'API │ │
│ └────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
↕ HTTP (fetch)
┌─────────────────────────────────────────────────────────────┐
│ SERVEUR NODE.JS (Backend) │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ Node.js + Express │ │
│ │ - Routes API (GET, POST, PUT, DELETE) │ │
│ │ - Authentification (JWT, sessions) │ │
│ │ - Validation des données │ │
│ │ - Connexion à la base de données │ │
│ └────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
↕
┌─────────────────────────────────────────────────────────────┐
│ BASE DE DONNÉES │
│ (MySQL, PostgreSQL, MongoDB...) │
└─────────────────────────────────────────────────────────────┘