Langage, moteur, runtime
JavaScript, V8 et Node : trois niveaux à ne pas confondre.
Objectifs
À la fin de cette leçon, vous saurez :
- distinguer précisément JavaScript, V8 et Node.js ;
- lister ce que Node apporte par-dessus le langage ;
- comprendre pourquoi « c'est du JavaScript » ne veut pas dire « ça tourne partout ».
🔗 Pour vous rafraîchir la mémoire : l'event loop
Trois niveaux à démêler
JavaScript = le LANGAGE (la norme ECMAScript : syntaxe, types, Promises...)
V8 = le MOTEUR (traduit et exécute le JS, développé par Google)
Node.js = le RUNTIME (V8 + bibliothèques système : fichiers, réseau...)
Le langage définit ce que vous pouvez écrire. Le moteur l'exécute. Le runtime décide à quoi votre code peut accéder.
Ce que Node ajoute au navigateur (et inversement)
| Capacité | Navigateur | Node.js |
|---|---|---|
| Manipuler le DOM | oui | non (pas de page !) |
| localStorage | oui | non |
| fetch | oui | oui (versions récentes) |
| Lire/écrire des fichiers | non | oui (node:fs) |
| Créer un serveur HTTP | non | oui (node:http) |
| Processus et variables d'env | limité | oui (node:process) |
Le navigateur vit dans une sandbox sécurisée orientée interface ; Node vit sur votre machine avec des pouvoirs système. Même langage, deux mondes d'accès.
Le schéma complet d'exécution
vous tapez node app.js
↓
Node démarre V8 + ses bibliothèques
↓
V8 parse puis exécute app.js
↓
app.js appelle require/import → les modules natifs s'activent
↓
l'event loop de Node fait tourner callbacks, timers, I/O
L'event loop que vous connaissez depuis le chapitre asynchronisme est fournie et orchestrée par Node (ou par le navigateur) — pas par le langage lui-même.
Pourquoi ce découpage compte
- Comprendre qu'une erreur
fs is not defineddans le navigateur est normale : le module n'y existe pas. - Choisir ses dépendances en connaissance de cause : un package « pour Node » ne tourne pas dans le navigateur.
- Préparer TypeScript : compiler produit du JS exécutable par N'IMPORTE quel moteur — la cible (navigateur ou Node) est un choix de déploiement.
Exercice
- Classez :
document.querySelector,require("node:fs"),fetch,process.env— navigateur, Node ou les deux ? - Pourquoi votre todo-list du chapitre précédent ne peut-elle pas tourner sous Node telle quelle ?
- Que gagne-t-on à séparer mentalement langage et runtime quand on lit une erreur ?
Résumé
- Langage ≠ moteur ≠ runtime ; Node = V8 + accès système + event loop.
- DOM/localStorage côté navigateur ; fs/http/process côté Node.
- Les erreurs d'environnement deviennent évidentes avec ce modèle.
Correction disponibleCherchez d’abord par vous-même.Voir la correction
Correction
Réponses détaillées
Question 1. document.querySelector : navigateur uniquement. require("node:fs") : Node uniquement. fetch : les deux (récent). process.env : Node (le navigateur a window.location, pas de process).
Question 2. Elle utilise document, addEventListener et localStorage : trois API navigateur absentes de Node. La logique métier (tableau, fonctions) tournerait ; toute la couche affichage devrait être remplacée.