À propos de ce cours
Cette leçon compare Node.js aux principales technologies serveur, PHP, Python et Java, à partir d'une même petite API écrite dans les quatre langages. Elle explique les deux grands modèles d'exécution (un fil par requête ou une boucle d'événements), compare typage, frameworks, gestionnaires de paquets, points forts, hébergement et usages typiques dans un tableau, indique quand choisir Node.js et quand préférer une autre technologie, et présente les alternatives Deno et Bun, avec une étude de cas, une activité de lecture de code et un quiz.
Objectifs
- Comparer Node.js aux principales technologies serveur : PHP, Python et Java.
- Comprendre les deux grands modèles d'exécution : un fil par requête ou une boucle d'événements.
- Savoir quand Node.js est un bon choix, et quand il vaut mieux en choisir un autre.
Le même service dans quatre langages
- Voici une petite API qui renvoie le même message en JSON à l'adresse
/api/bonjour. Observez ce qui se ressemble et ce qui diffère. - PHP (sans framework) :
<?php // bonjour.php header('Content-Type: application/json'); echo json_encode(['message' => 'Bonjour', 'langage' => 'PHP']);- Voici une petite API qui renvoie le même message en JSON à l'adresse
- Python avec le framework Flask :
- Java avec Spring Boot (seulement le contrôleur) :
- Node.js avec Express :
- Les quatre versions font la même chose. Les différences importantes ne se voient pas dans ces quelques lignes : elles portent sur la façon dont le serveur exécute ce code quand mille personnes l'appellent en même temps, sur le typage et sur l'écosystème.
Deux modèles d'exécution
- Un fil (ou un processus) par requête: c'est le modèle classique de PHP avec PHP-FPM, de Python avec Gunicorn, et de Java avec Spring MVC. Chaque requête reçoit son propre fil d'exécution. Le code est simple à écrire, car il est séquentiel : on attend la base de données, puis on continue. Mais chaque fil consomme de la mémoire, même quand il ne fait qu'attendre.
- Une boucle d'événements: c'est le modèle de Node.js. Un seul fil traite toutes les requêtes, sans jamais attendre. Il est très économe quand il y a beaucoup de connexions simultanées (API, temps réel), mais il impose d'écrire du code asynchrone et d'éviter les calculs longs.
- Les frontières se sont rapprochées : Python propose aussi l'asynchrone (asyncio, FastAPI), Java a ses threads virtuels (Java 21) et ses frameworks réactifs, et PHP a des solutions asynchrones (Swoole, ReactPHP). Mais pour Node.js, l'asynchrone est la règle par défaut, dans tout l'écosystème.
Tableau comparatif
- Il n'y a pas de « meilleur » langage dans l'absolu : chacun brille dans son domaine. Un même projet combine d'ailleurs souvent plusieurs technologies : par exemple, une API Node.js pour l'application mobile et un service Python pour les recommandations.
Critère Node.js PHP Python Java Modèle par défaut boucle d'événements, non bloquant un processus par requête un processus par requête, ou asynchrone (FastAPI) pool de threads, ou réactif Typage dynamique (TypeScript en option) dynamique, types optionnels dynamique, annotations optionnelles statique Frameworks web Express, NestJS, Fastify Laravel, Symfony Django, Flask, FastAPI Spring Boot Gestionnaire de paquets npm Composer pip Maven, Gradle Points forts un seul langage front et back, temps réel, API, très grand écosystème simplicité, hébergement partout, WordPress lisibilité, données, IA, science robustesse, performance en calcul, grands systèmes d'entreprise Points faibles calculs lourds, rigueur nécessaire avec l'asynchrone temps réel moins naturel moins rapide en calcul pur que Java plus verbeux, démarrage plus lent, plus de mémoire Hébergement VPS, PaaS, conteneurs (parfois en mutualisé) tout hébergement mutualisé VPS, PaaS, conteneurs VPS, conteneurs, serveurs d'applications Usage typique API, SPA full stack, chat, outils sites, CMS, e-commerce API de données, IA, scripts banque, assurance, systèmes critiques Quand choisir Node.js ?
- Bon choix:
- l'équipe connaît JavaScript, et on veut un seul langage du navigateur au serveur (application Full Stack JS, objectif de ce cours) ;
- une API REST qui dialogue beaucoup avec une base de données ou d'autres services ;
- du temps réel: messagerie, notifications, suivi de livraison, collaboration en direct ;
- des microservices légers, des outils en ligne de commande, du rendu côté serveur (Next.js, Nuxt).
- Moins bon choix:
- des calculs lourds: traitement vidéo, apprentissage automatique (Python, Java, Go ou C++ y sont plus adaptés) ;
- un site vitrine ou un blog sur un hébergement mutualisé bon marché : WordPress (PHP) est souvent plus simple ;
- une équipe déjà experte dans une autre technologie, sur un projet sans besoin particulier.
- Bon choix:
Les autres environnements JavaScript : Deno et Bun
- Deno (2020), créé par Ryan Dahl lui-même : sécurisé par défaut (un script n'accède ni aux fichiers ni au réseau sans autorisation), avec TypeScript intégré.
- Bun (2023) : axé sur la vitesse ; il regroupe environnement d'exécution, gestionnaire de paquets et exécuteur de tests.
- Les deux sont largement compatibles avec les paquets npm. Node.js reste toutefois la référence : c'est lui qu'on trouve dans la grande majorité des entreprises, des hébergeurs et des offres d'emploi. Ce que vous apprenez ici vous servira aussi avec Deno et Bun.
Activité 1 : choisir la bonne technologie
- Pour chaque projet, proposez une technologie serveur et justifiez votre choix en une ou deux phrases :
- un site vitrine de 6 pages pour une boulangerie, avec un hébergement à 3 € par mois ;
- une application de messagerie pour les stagiaires d'un centre de formation, avec indicateur « en train d'écrire… » ;
- un service qui analyse 10 000 photos par jour pour détecter des défauts de fabrication ;
- l'API d'une application mobile de réservation de salles de sport, développée par une équipe qui fait déjà son front en Angular ;
- le système de gestion des comptes d'une grande banque.
- PHP (WordPress) : hébergement mutualisé très bon marché, peu de besoins dynamiques.
- Node.js avec Socket.IO : temps réel et nombreuses connexions ouvertes en même temps, son point fort.
- Python: bibliothèques d'analyse d'image et d'IA ; calcul lourd, à ne pas faire dans la boucle d'événements de Node.js.
- Node.js (Express ou NestJS) : API riche en entrées / sorties, et même langage que l'équipe front.
- Java (Spring Boot) : typage statique, robustesse et écosystème d'entreprise. D'autres choix restent défendables s'ils sont bien justifiés.
Voir des éléments de corrigé
- Pour chaque projet, proposez une technologie serveur et justifiez votre choix en une ou deux phrases :
Activité 2 : lire du code dans un autre langage
- Reprenez les quatre versions de l'API « bonjour ». Pour chacune, repérez :
- l'endroit où l'adresse
/api/bonjourest définie ; - la façon dont l'objet est transformé en JSON ;
- la version qui n'utilise aucun framework.
- l'endroit où l'adresse
- Python : décorateur
@app.get; Java : annotation@GetMapping; Node.js :app.get(…); PHP : c'est le nom du fichier (bonjour.php) qui fait office d'adresse. - PHP appelle
json_encode; Flask et Spring convertissent automatiquement le dictionnaire ou laMaprenvoyés ; Express utiliseres.json(). - La version PHP. Avec Node.js, la même chose sans framework se fait avec le module
http, comme dans la leçon d'introduction.
Voir le corrigé
- Reprenez les quatre versions de l'API « bonjour ». Pour chacune, repérez :
À retenir
- PHP, Python et Java utilisent classiquement un fil ou un processus par requête; Node.js utilise une boucle d'événements non bloquante.
- Node.js excelle pour les API, le temps réel et le full stack JavaScript; il est moins adapté aux calculs lourds.
- Le bon choix dépend du projet, de l'équipe et de l'hébergement, pas d'un classement absolu.
- Deno et Bun sont des alternatives récentes ; Node.js reste la référence.
Testez-vous
- 1. Quel est l'avantage du modèle « un fil par requête » ? Et son inconvénient ?
- 2. Citez le framework web le plus connu de chaque technologie : Node.js, PHP, Python, Java.
- 3. Pourquoi Node.js convient-il bien à une application de messagerie ?
- 4. Qui a créé Deno, et pourquoi ?
- Avantage : le code est séquentiel, simple à écrire. Inconvénient : chaque fil consomme de la mémoire, même quand il attend.
- Node.js : Express (ou NestJS) ; PHP : Laravel (ou Symfony) ; Python : Django (ou Flask, FastAPI) ; Java : Spring Boot.
- Une messagerie maintient beaucoup de connexions ouvertes qui attendent la plupart du temps : la boucle d'événements les gère avec peu de ressources.
- Ryan Dahl, le créateur de Node.js, pour corriger les choix qu'il regrettait dans Node.js : sécurité par défaut, TypeScript intégré.
Voir les réponses
from flask import Flask
app = Flask(__name__)
@app.get('/api/bonjour')
def bonjour():
return {'message': 'Bonjour', 'langage': 'Python'}
@RestController
public class BonjourController {
@GetMapping("/api/bonjour")
public Map<String, String> bonjour() {
return Map.of("message", "Bonjour", "langage", "Java");
}
}
// Node.js avec Express
import express from 'express';
const app = express();
app.get('/api/bonjour', (req, res) => {
res.json({ message: 'Bonjour', langage: 'Node.js' });
});
app.listen(3000);