Node.js

Introduction

Récapitulatif de vos acquis JavaScript et transition vers le développement backend avec Node.js

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() ou async/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éristiqueJavaScript (navigateur)Node.js
Contexte d'exécutionNavigateur (Chrome, Firefox, etc.)Côté serveur
Accès aux fichiersNonOui (via le module fs)
Serveur webNonOui (module http, Express)
Base de donnéesNon (risque de sécurité)Oui (MySQL, MongoDB, PostgreSQL, etc.)
Modules intégrésAucun, sauf APIs du DOMOui (fs, http, path, etc.)
Modules tiers (npm)NonOui, écosystème npm complet
Gestion multi-usersChaque navigateur isoléServeur centralisé
Utilisation principaleInteraction utilisateur, DOM, animationsBackend, 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 :

  1. Requête 1 arrive → lance une requête base de données et continue
  2. Requête 2 arrive → lance une requête base de données et continue
  3. La base répond pour la requête 2 → Node.js la traite
  4. 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...)                │
└─────────────────────────────────────────────────────────────┘