JavaScript est un langage de programmation ; Node.js est un runtime, un programme qui exécute du JavaScript en dehors du navigateur. La syntaxe, les types et les objets standard (Array, Promise, JSON) sont les mêmes dans les deux. Ce qui change, c'est l'environnement autour de votre code : un navigateur vous donne window et document pour travailler avec une page web, alors que Node.js vous donne global, process, require et des modules comme fs pour travailler avec les fichiers, les serveurs et le système d'exploitation.
Les globales du navigateur ont affiché undefined, celles de Node.js object ou function, et la dernière ligne true, car dans Node.js globalThis et global sont le même objet. Collez les six premières lignes dans la console d'un navigateur et les résultats s'inversent.
La différence en un tableau
| JavaScript dans un navigateur | JavaScript dans Node.js | |
|---|---|---|
| Ce que c'est | Le langage, exécuté par le moteur du navigateur | Le même langage, exécuté par le runtime Node.js (V8) |
| Objet global | window | global |
| Travaille sur | La page : document, le DOM, les événements | La machine : fs, http, process, os |
| Modules | <script type="module">, import | require (CommonJS) et import (modules ES) |
| Packages | Intégrés à la page par le bundler | Installés dans node_modules avec npm |
| Entrées | Clics, formulaires, événements clavier | Arguments de ligne de commande, entrée standard, requêtes HTTP |
Array, Promise, JSON, setTimeout, console | Oui | Oui |
La ligne des modules est celle qui piège le plus de monde. Node.js prend en charge les deux systèmes, require et import, alors que les navigateurs ne comprennent que import. La page CommonJS ou modules ES explique lequel choisir.
Le langage est le même
Une fonction qui n'utilise que le langage tourne partout. Ce bloc ne contient rien de propre à Node, et il afficherait les mêmes lignes dans un navigateur :
Le programme a affiché {"best":95,"average":85} et Passed: 2 of 3. La syntaxe de décomposition, reduce, les template strings et JSON font partie du langage, défini par le standard ECMAScript, donc tous les runtimes les ont.
Ce que seul Node.js possède
La partie propre à Node, ce sont les modules intégrés et les globales qui parlent au système d'exploitation :
Il a écrit un fichier, l'a relu et a affiché .txt 2 lines, puis une liste vide d'arguments. Ni l'accès aux fichiers ni process.argv n'existent dans un navigateur, où une page ne peut pas toucher à votre disque.
Quelles fonctionnalités du langage vous avez
Le langage a des versions (ES2015, ES2020, ES2024, etc.), et chaque moteur ajoute les nouveautés à son rythme. Node.js embarque un moteur V8 précis par version, donc c'est votre version de Node.js qui décide quelles fonctionnalités marchent : Object.groupBy et Array.prototype.findLast, par exemple, demandent une version récente. Un tableau de compatibilité des navigateurs liste donc Node.js comme une colonne de plus à côté de Chrome, Firefox et Safari. Lancez node --version quand une syntaxe récente échoue avec une SyntaxError ou qu'une méthode vaut undefined, et mettez à jour avant de chercher un polyfill.
Écrire du code qui tourne dans les deux
Les auteurs de bibliothèques vérifient parfois où tourne leur code avant d'utiliser une API propre à un environnement :
const isNode = typeof process !== 'undefined' && process.versions?.node != null;
const isBrowser = typeof window !== 'undefined';
Quand c'est possible, testez la fonctionnalité dont vous avez besoin plutôt que le nom de l'environnement : typeof fetch === 'function' en dit plus que « est-ce que c'est Node ». Les deux ont aujourd'hui fetch, URL, TextEncoder, setTimeout et structuredClone, donc moins de code a besoin d'une vérification qu'il y a quelques années.
Erreurs fréquentes
Utiliser document ou window dans un script Node.js. Vous obtenez ReferenceError: document is not defined. Ce code a sa place dans un navigateur.
Utiliser require dans un navigateur. Les navigateurs ne l'ont pas. Utilisez import, ou un bundler qui transforme les appels require en un seul fichier.
Penser que Node.js est un autre langage. Ce n'est pas le cas. Si un tutoriel JavaScript l'enseigne, ça marche en Node.js, sauf s'il utilise le DOM.
Questions fréquentes
Peut-on apprendre Node.js sans apprendre JavaScript ?
Pas vraiment. Chaque ligne écrite en Node.js est du JavaScript, donc le langage vient en premier. Une fois que vous connaissez les fonctions, les objets et les promesses, Node.js est un ensemble d'API en plus à apprendre.
Pourquoi j'obtiens « document is not defined » en Node.js ?
document est le DOM du navigateur, et Node.js n'a aucune page pour vous en fournir un. Le code qui touche document ou window doit tourner dans un navigateur, ou dans un environnement de test qui simule le DOM, comme jsdom.
TypeScript, c'est la même chose que Node.js ?
Non. TypeScript est une version typée de JavaScript qui se compile en JavaScript. Vous pouvez exécuter le résultat dans Node.js ou dans un navigateur, et les versions récentes de Node.js peuvent aussi exécuter directement beaucoup de fichiers .ts en retirant les types.