Node.js 26: Temporal API por defecto y el fin de Date
Node.js 26 llega con la Temporal API activada por defecto, V8 14.6, Undici 8 y la eliminación definitiva de APIs obsoletas. Todo lo que necesitas saber antes de migrar.
El 5 de mayo de 2026, Node.js publicó su versión 26. Como cada año impar, es una major con cambios significativos que entrarán en LTS en octubre. Esta vez el titular está claro: la Temporal API ya no es experimental.
Temporal: el reemplazo definitivo de Date
Llevamos años conviviendo con Date, uno de los objetos más problemáticos del lenguaje. Zonas horarias inconsistentes, mutabilidad por defecto, aritmética de fechas que requiere librerías externas como date-fns o dayjs. Todo eso tiene solución oficial ahora.
// Antes: aritmética frágil con Date
const now = new Date();
const tomorrow = new Date(now.getTime() + 86_400_000);
// Ahora: Temporal, inmutable y explícito
const today = Temporal.Now.plainDateISO();
const tomorrow = today.add({ days: 1 });
La API es inmutable por diseño. Cada operación devuelve un nuevo objeto, lo que elimina toda una clase de bugs relacionados con mutaciones accidentales.
Los tipos clave que usarás
| Tipo | Uso |
|---|---|
Temporal.Instant | Punto exacto en el tiempo (UTC) |
Temporal.PlainDate | Fecha sin hora ni zona horaria |
Temporal.PlainDateTime | Fecha y hora sin zona |
Temporal.ZonedDateTime | Fecha, hora y zona horaria |
Temporal.Duration | Intervalos de tiempo |
La distinción entre tipos con y sin zona horaria es la clave. Antes era fácil mezclarlos sin darte cuenta.
// Comparación de fechas en zonas distintas, correctamente
const madrid = Temporal.ZonedDateTime.from('2026-05-05T10:00+02:00[Europe/Madrid]');
const nyc = Temporal.ZonedDateTime.from('2026-05-05T04:00-04:00[America/New_York]');
console.log(Temporal.ZonedDateTime.compare(madrid, nyc)); // 0 — mismo instante
V8 14.6: nuevas APIs de Map y Iterator
Node.js 26 incluye V8 14.6, la misma versión que Chromium 146. Dos adiciones que vale la pena destacar:
Map.prototype.getOrInsert()
const cache = new Map<string, number>();
// Antes
if (!cache.has('key')) cache.set('key', computeExpensiveValue());
const value = cache.get('key')!;
// Ahora con upsert
const value = cache.getOrInsert('key', computeExpensiveValue());
Y su variante getOrInsertComputed() para cuando el valor por defecto se calcula de forma lazy:
const value = cache.getOrInsertComputed('key', (k) => fetch(`/api/${k}`));
Iterator.concat()
const a = [1, 2, 3][Symbol.iterator]();
const b = [4, 5, 6][Symbol.iterator]();
for (const n of Iterator.concat(a, b)) {
console.log(n); // 1, 2, 3, 4, 5, 6
}
Encadenamiento de iteradores sin crear arrays intermedios. Especialmente útil en pipelines de datos donde el tamaño importa.
Undici 8: el cliente HTTP de Node.js, renovado
Undici es el cliente HTTP nativo que usa Node.js internamente (y que puedes usar directamente). La versión 8 trae mejoras de rendimiento y una API más limpia para fetch avanzado.
import { fetch, Agent } from 'undici';
const agent = new Agent({
connections: 10,
pipelining: 5,
});
const response = await fetch('https://api.example.com/data', {
dispatcher: agent,
});
Si en tu proyecto usas node-fetch o axios únicamente por razones históricas, este es un buen momento para evaluar si el fetch nativo de Node.js cubre ya tus necesidades.
Deprecaciones y eliminaciones que te afectan
http.Server.prototype.writeHeader() — eliminado definitivamente
// ❌ Ya no funciona en Node.js 26
res.writeHeader(200, { 'Content-Type': 'application/json' });
// ✅ Correcto
res.writeHead(200, { 'Content-Type': 'application/json' });
Llevaba deprecated desde hace varias versiones. Si tienes código legacy que lo usa, es el momento de migrar.
_stream_readable, _stream_writable y familia — eliminados
Los módulos internos _stream_* han llegado a end-of-life. Si los importabas directamente (algo que no deberías haber estado haciendo), deberás migrar a stream directamente:
// ❌
import Readable from 'node:_stream_readable';
// ✅
import { Readable } from 'node:stream';
--experimental-transform-types — eliminado
Esta flag experimental para transformar tipos TypeScript en tiempo de ejecución fue retirada. Node.js sigue apostando por el strip de tipos con --strip-types, sin transformación.
¿Debo migrar ya?
Node.js 26 está en fase Current hasta octubre, cuando pasará a LTS. Para producción, la recomendación sigue siendo Node.js 24 (LTS activo) hasta que la 26 se estabilice.
Para desarrollo y proyectos nuevos, es un momento excelente para probar Temporal y las nuevas APIs de V8. La migración desde Node.js 24 no debería ser traumática salvo por las eliminaciones de APIs obsoletas mencionadas arriba.
# Con nvm
nvm install 26
nvm use 26
# Verificar Temporal disponible
node -e "console.log(Temporal.Now.plainDateISO().toString())"
# Output: 2026-05-07
La Temporal API merece especial atención. Va a cambiar cómo escribimos código que maneja fechas, y cuanto antes lo internalices, antes dejarás de depender de librerías externas para algo tan fundamental.