Il 5 maggio 2026 il team di Node.js ha rilasciato la versione 26.0.0, denominata “Current”, che introduce cambiamenti significativi alla piattaforma runtime JavaScript server-side più diffusa al mondo. Node.js 26 entrerà in Long-Term Support (LTS) nell’ottobre 2026: da quel momento sarà la release raccomandata per ambienti di produzione. Nel frattempo, i sei mesi di status “Current” sono il momento ideale per esplorare le novità e valutare l’impatto sulle proprie applicazioni.
Temporal API abilitata di default
La novità più attesa di Node.js 26 è l’abilitazione di default della Temporal API, la moderna API JavaScript per la gestione di date e orari. Per anni, la community ha convissuto con i limiti dell’oggetto Date: mancanza di supporto per i fusi orari, comportamenti incoerenti, mutabilità non controllata, e risultati controintuitivi in molti scenari di internazionalizzazione.
Temporal risolve tutti questi problemi alla radice, introducendo un sistema di tipi ricco e immutabile:
Temporal.PlainDate: una data senza orario né fuso orarioTemporal.PlainTime: un orario senza data né fuso orarioTemporal.PlainDateTime: data e orario senza fuso orarioTemporal.ZonedDateTime: data e orario con fuso orario esplicitoTemporal.Instant: un momento preciso nel tempo (come un timestamp Unix)Temporal.Duration: un intervallo di tempo
Ecco un esempio pratico di come Temporal semplifica operazioni che con Date richiedevano librerie esterne come Luxon o date-fns:
// Ottenere la data di oggi in un fuso orario specifico
const oggi = Temporal.Now.plainDateISO('Europe/Rome');
console.log(oggi.toString()); // "2026-05-07"
// Aggiungere 30 giorni senza preoccuparsi dei mesi
const traThentaGiorni = oggi.add({ days: 30 });
console.log(traThentaGiorni.toString()); // "2026-06-06"
// Calcolare la differenza tra due date
const inizio = Temporal.PlainDate.from('2026-01-01');
const fine = Temporal.PlainDate.from('2026-12-31');
const differenza = inizio.until(fine);
console.log(differenza.days); // 364
// Lavorare con fusi orari in modo esplicito
const appuntamento = Temporal.ZonedDateTime.from({
year: 2026,
month: 5,
day: 15,
hour: 14,
minute: 30,
timeZone: 'America/New_York'
});
const inRoma = appuntamento.withTimeZone('Europe/Rome');
console.log(inRoma.toLocaleString('it-IT'));
Fino a Node.js 25, Temporal era disponibile ma richiedeva il flag --harmony-temporal. Ora è parte integrante del runtime e non serve alcuna configurazione aggiuntiva.
V8 14.6: due nuove proposte TC39
Il motore JavaScript V8 è stato aggiornato alla versione 14.6.202.33 (Chromium 146), portando con sé due importanti proposte TC39 ora disponibili nativamente:
Upsert: Map.prototype.getOrInsert()
La proposta Upsert introduce i metodi getOrInsert() e getOrInsertComputed() su Map e WeakMap. Si tratta di un pattern molto comune nello sviluppo: controllare se una chiave esiste in una mappa, e se non esiste, inserire un valore di default e restituirlo.
// Prima di Node.js 26 - verboso e ripetitivo
function getOrCreate(map, key, defaultValue) {
if (!map.has(key)) {
map.set(key, defaultValue);
}
return map.get(key);
}
const cache = new Map();
const utenti = getOrCreate(cache, 'admin', []);
utenti.push('mario');
// Con Node.js 26 - conciso e leggibile
const cache = new Map();
const utenti = cache.getOrInsert('admin', []);
utenti.push('mario');
// Versione con factory function (lazy initialization)
const grandi = cache.getOrInsertComputed('admin', (key) => {
return recuperaUtentiDalDb(key); // calcolato solo se necessario
});
Iterator sequencing: Iterator.concat()
La proposta Iterator sequencing introduce Iterator.concat(), che permette di concatenare più iteratori senza materializzarli tutti in memoria contemporaneamente:
// Concatenare lazily più sorgenti di dati
const paginaUno = [1, 2, 3][Symbol.iterator]();
const paginaDue = [4, 5, 6][Symbol.iterator]();
const paginaTre = [7, 8, 9][Symbol.iterator]();
const tuttiGliElementi = Iterator.concat(paginaUno, paginaDue, paginaTre);
for (const elemento of tuttiGliElementi) {
console.log(elemento); // 1, 2, 3, 4, 5, 6, 7, 8, 9
}
Undici 8.0: il client HTTP di nuova generazione
La libreria Undici, il client HTTP integrato in Node.js, è stata aggiornata alla versione 8.0.2. Undici è il motore dietro fetch() nativo in Node.js ed è progettato per prestazioni e correttezza del protocollo HTTP/1.1 e HTTP/2. La versione 8 porta miglioramenti all’implementazione di WebSocket, gestione delle connessioni e supporto per proxy avanzati.
Deprecazioni e rimozioni importanti
Come ogni major version, Node.js 26 rimuove API che erano state deprecate nelle versioni precedenti. Ecco le più impattanti:
Rimozione di http.Server.prototype.writeHeader()
Il metodo writeHeader() è stato definitivamente rimosso. Era già deprecato da anni: la forma corretta è writeHead().
// ❌ Non funziona più in Node.js 26
res.writeHeader(200, { 'Content-Type': 'application/json' });
// ✅ Forma corretta
res.writeHead(200, { 'Content-Type': 'application/json' });
Rimozione dei moduli legacy _stream_*
I moduli interni _stream_wrap, _stream_readable, _stream_writable, _stream_duplex, _stream_transform e _stream_passthrough sono stati rimossi definitivamente. Se li state importando direttamente (cosa sconsigliata ma ancora diffusa in codice datato), dovete migrare all’API pubblica:
// ❌ Non funziona più
const { Readable } = require('_stream_readable');
// ✅ Sempre corretto
const { Readable } = require('stream');
// o con ESM:
import { Readable } from 'node:stream';
Rimozione di –experimental-transform-types
Il flag --experimental-transform-types, che abilitava la trasformazione automatica dei tipi TypeScript a runtime, è stato rimosso. Per eseguire TypeScript in Node.js, la raccomandazione ufficiale rimane l’uso di --experimental-strip-types (disponibile dalla v22.6+) oppure di tool dedicati come tsx o ts-node.
Deprecazioni runtime
Diverse API passano ora a deprecazione a runtime, il che significa che genereranno un avviso quando utilizzate, senza però bloccare l’esecuzione:
module.register()— deprecato in favore diimport.meta.urlpatterns- Alcune API crypto (DEP0203, DEP0204) legate a formati di chiavi obsoleti
- Alcune API stream (DEP0201)
Come aggiornare
Per installare Node.js 26 tramite nvm:
nvm install 26
nvm use 26
node --version # v26.0.0
Con fnm:
fnm install 26
fnm use 26
Prima di aggiornare i progetti in produzione, si raccomanda di:
- Verificare che tutte le dipendenze siano compatibili con Node.js 26 (controllate le note di release dei principali package)
- Cercare nel codice le API rimosse:
writeHeader,_stream_*,--experimental-transform-types - Testare il comportamento della Temporal API se il vostro codice ha workaround per
Date - Abilitare i log delle deprecazioni runtime con
NODE_OPTIONS='--trace-deprecation'
Conclusioni
Node.js 26 è una release di maturazione: la Temporal API è finalmente pronta per la produzione, V8 14.6 porta proposte TC39 da lungo tempo attese, e le rimozioni puliscono la piattaforma dagli artefatti del passato. Per chi lavora su progetti Node.js, questo è il momento di iniziare i test su questa versione in vista dell’ingresso in LTS di ottobre 2026.
Fonte: Node.js 26.0.0 Release Notes — nodejs.org, 5 maggio 2026