Node.js 18 (LTS depuis octobre 2022) a été une version charnière dans la modernisation de l'environnement JavaScript côté serveur. L'objectif principal : aligner Node.js sur les standards Web (Web APIs) pour permettre de partager du code entre le navigateur et le serveur sans adaptateurs.
Node.js 18 est en fin de vie (EOL) depuis octobre 2025. Si vous êtes encore sur Node 18, migrez vers Node 20 LTS ou Node 22 LTS.
1. Fetch API — Intégrée nativement
La feature la plus attendue : fetch() disponible nativement sans installer node-fetch ou axios.
// Avant Node 18 — obligatoire
import fetch from 'node-fetch';
// Node 18+ — natif, identique au navigateur
const response = await fetch('https://api.github.com/users/lion92');
const data = await response.json();
console.log(data.name);
// POST avec JSON
const res = await fetch('https://api.example.com/users', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ name: 'Kriss', role: 'dev' })
});
// Gestion des erreurs
if (!res.ok) {
throw new Error(`HTTP error: ${res.status}`);
}
// Streaming d'une réponse volumineuse
const reader = res.body.getReader();
while (true) {
const { done, value } = await reader.read();
if (done) break;
process.stdout.write(value);
}
2. Test Runner — Intégré au runtime
Node 18 introduit un test runner natif (node:test), réduisant la dépendance à Jest, Mocha ou Vitest pour les projets simples.
import test from 'node:test';
import assert from 'node:assert/strict';
// Test simple
test('addition fonctionne', () => {
assert.equal(2 + 2, 4);
});
// Test asynchrone
test('fetch utilisateur', async () => {
const user = await getUser(1);
assert.ok(user.name);
assert.equal(user.id, 1);
});
// Tests groupés avec describe
test('suite Utilisateur', async t => {
await t.test('créer un utilisateur', () => {
const user = { name: 'Kriss' };
assert.ok(user.name);
});
await t.test('valider l\'email', () => {
assert.match('kriss@example.com', /@/);
});
});
// Lancer : node --test monFichier.test.js
// ou : node --test (détecte *.test.js automatiquement)
3. Web Streams API
Node 18 expose les Web Streams (ReadableStream, WritableStream, TransformStream) à la racine du module global — identiques au navigateur.
import { pipeline } from 'node:stream/promises';
import { createReadStream, createWriteStream } from 'node:fs';
// Web Transform Stream — transformer des données en flux
const uppercaseTransform = new TransformStream({
transform(chunk, controller) {
controller.enqueue(chunk.toString().toUpperCase());
}
});
// Readable Web Stream depuis fetch
const res = await fetch('https://example.com/large-file.txt');
const transformed = res.body
.pipeThrough(uppercaseTransform);
// Convertir Web Stream ↔ Node Stream
import { Readable } from 'node:stream';
const nodeStream = Readable.fromWeb(transformed);
4. Mode Watch — Rechargement automatique
Plus besoin de nodemon pour le développement : Node 18 introduit --watch.
# Redémarre automatiquement quand le fichier change
node --watch server.js
# Surveiller des fichiers spécifiques
node --watch-path=./src server.js
# Dans package.json
{
"scripts": {
"dev": "node --watch src/index.js"
}
}
5. Autres nouveautés Node 18
Blob API
Blob natif pour manipuler des données binaires, identique au navigateur.
Web Crypto API
globalThis.crypto disponible sans import, compatibilité web totale.
BroadcastChannel
Communication inter-worker via BroadcastChannel, comme dans les browsers.
V8 10.2
findLast(), findLastIndex() sur Array, améliorations de performance.
const arr = [1, 2, 3, 4, 5];
// findLast — cherche depuis la fin
arr.findLast(x => x % 2 === 0); // 4
arr.findLastIndex(x => x % 2 === 0); // 3