Node.js 26 pasa a LTS activa el 28 de octubre de 2026, y ese mismo mes Node 24 entra en mantenimiento, así que es el momento de mover tus imágenes Docker de node:24-slim a node:26-slim. He ejecutado el mismo script de comprobación en las dos imágenes oficiales el 7 de octubre de 2026 (Node 24.21.0 y Node 26.10.0) e instalado tres módulos nativos habituales. Aquí tienes las fechas, lo que cambia, lo que se rompe y los pasos para migrar. También hay una versión en inglés.

Puntos clave

  • Node 26 se publicó el 5 de mayo de 2026, pasa a LTS activa el 28 de octubre de 2026, a mantenimiento el 20 de octubre de 2027 y llega a fin de vida el 30 de abril de 2029.
  • Node 24 entra en mantenimiento el 20 de octubre de 2026, y Node 22 llega a fin de vida el 30 de abril de 2027.
  • En node:26-slim, Temporal, Map.prototype.getOrInsert() e Iterator.concat() funcionan sin flags; en node:24-slim no existen.
  • Se rompen dos cosas que en Node 24 solo avisaban: require('_stream_readable') y sus hermanos dan MODULE_NOT_FOUND, y response.writeHeader() ya no existe.
  • La imagen node:26-slim ocupa 85,9 MB frente a 80,7 MB de node:24-slim; better-sqlite3, bcrypt y sharp se instalaron sin compilar en las dos.

Cuándo pasa Node.js 26 a LTS y qué pasa con Node 24

El calendario oficial del grupo de publicación de Node.js[1] fija las fechas de las tres versiones con soporte. Esta es la foto a 7 de octubre de 2026:

Versión Estado LTS activa Mantenimiento Fin de vida
Node 22 Mantenimiento 29-10-2024 21-10-2025 30-04-2027
Node 24 LTS activa 28-10-2025 20-10-2026 30-04-2028
Node 26 Current 28-10-2026 20-10-2027 30-04-2029

En mantenimiento, una versión recibe solo correcciones críticas y de seguridad. Node 24 sigue siendo una base válida hasta 2028, pero las mejoras nuevas solo llegan a Node 26.

Node 26 es además la última versión par del esquema antiguo. A partir de Node 27, según el anuncio del nuevo calendario[2] de marzo de 2026, habrá una versión mayor al año y todas pasarán a LTS. El grupo lo justificó así: "Odd-numbered releases see minimal adoption. Most users wait for Long-Term Support."

Qué cambia en Node.js 26 frente a Node 24

Las notas de Node.js 26.0.0[3] destacan tres novedades: Temporal activado por defecto, V8 14.6 y Undici 8. Para comprobarlo ejecuté este script en las dos imágenes con docker run --rm -v $PWD:/w -w /w node:26-slim node t.mjs:

const d = Temporal.PlainDate.from('2026-10-28');
console.log(d.add({ months: 6 }).toString());

const z = Temporal.ZonedDateTime.from(
  '2026-10-25T01:30[Europe/Madrid]');
console.log(z.add({ hours: 2 }).toString());

const m = new Map();
console.log(m.getOrInsert('a', 1));
console.log([...Iterator.concat([1, 2], [3])]);

En Node 26.10.0 el script imprimió 2027-04-28, 2026-10-25T02:30:00+01:00[Europe/Madrid], 1 y [ 1, 2, 3 ]. La segunda línea es la que justifica Temporal. Sumar dos horas a la 01:30 del día del cambio de hora da las 02:30 en horario de invierno, sin que calcules el desfase. En Node 24.21.0 la primera línea ya falla con Temporal is not defined.

Las versiones que reportó cada imagen fueron estas:

node:24-slim node:26-slim
Node.js 24.21.0 26.10.0
V8 13.6 14.6
Undici 7.29.1 8.10.2
npm 11.19.0 11.19.1
ABI de módulos nativos 137 147
Tamaño de la imagen 80,7 MB 85,9 MB

Qué se rompe al pasar de Node 24 a Node 26

Las notas de la versión listan cuatro eliminaciones o avisos nuevos; dos de ellos fallaron en mi prueba con código que en Node 24 solo daba un aviso:

  • *Módulos `stream**:require(‘_stream_readable’)yrequire(‘_stream_wrap’)funcionaban en Node 24 (el segundo con el avisoDEP0125) y en Node 26 lanzanMODULE_NOT_FOUND. Sustitúyelos porrequire(‘node:stream’)`.
  • writeHeader(): en Node 24, http.ServerResponse.prototype.writeHeader era una función; en Node 26 es undefined. Usa writeHead().
  • module.register(): sigue existiendo, pero ahora avisa en tiempo de ejecución; si cargas hooks de módulos, prueba module.registerHooks().
  • --experimental-transform-types: el flag ha desaparecido, así que un CMD que lo use no arrancará.

Busca estos nombres en tu código y en node_modules antes de cambiar la imagen. Un grep -rn "_stream_\|writeHeader(" src node_modules encuentra la mayoría; si el resultado está en una dependencia, actualízala antes que el runtime.

Qué pasa con los módulos nativos

Cada versión mayor de Node cambia la ABI de los módulos nativos: 137 en Node 24 y 147 en Node 26. Un node_modules copiado desde una imagen de Node 24 no sirve en Node 26, así que la instalación tiene que ocurrir dentro de la imagen nueva.

Instalé better-sqlite3 13.0.3, bcrypt 6.0.0 y sharp 0.35.5 en node:26-slim, que no trae compiladores. Los tres funcionaron sin compilar: better-sqlite3 abrió una base en memoria con SQLite 3.53.4 y sharp cargó libvips 8.18.7. En las dos imágenes, npm avisó de que bcrypt tenía scripts de instalación sin aprobar en allowScripts, algo que conviene revisar aunque no bloquee la instalación.

Cómo migrar tu Dockerfile a Node 26

El cambio en el Dockerfile es una línea, y el resto del trabajo es probar. Este Dockerfile de dos etapas instala dependencias en la imagen nueva y no copia node_modules desde fuera:

FROM node:26-slim AS deps
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci --omit=dev

FROM node:26-slim
WORKDIR /app
ENV NODE_ENV=production
COPY --from=deps /app/node_modules ./node_modules
COPY . .
USER node
CMD ["node", "server.js"]

La primera etapa ejecuta npm ci contra el lockfile y la segunda solo copia el resultado, así que los módulos nativos se instalan para la ABI 147. Añade node_modules a .dockerignore para que COPY . . no meta el de tu equipo.

Sigue estos pasos para migrar sin sorpresas:

  1. Cambia engines.node en package.json a >=26 y ejecuta tus tests con node:26-slim en el CI.
  2. Busca _stream_, writeHeader( y --experimental-transform-types en el código y en los scripts de arranque.
  3. Regenera el lockfile con Node 26 si alguna dependencia publica binarios distintos por versión.
  4. Fija la etiqueta completa (node:26.10.0-slim) en producción y deja que Renovate o Dependabot proponga las subidas.

Si te preocupa el tamaño de la imagen base, la comparación de Wolfi, Alpine y distroless mide las alternativas con la misma aplicación.

Preguntas frecuentes

¿Puedo usar Node 26 en producción antes del 28 de octubre?

Puedes, pero hasta esa fecha es una versión Current y puede recibir cambios incompatibles en versiones menores. Si tu política es usar solo LTS, prueba ya en el CI y cambia la imagen de producción a partir del 28 de octubre.

¿Tengo que migrar de Node 24 ya?

No es urgente. Node 24 recibe correcciones de seguridad hasta el 30 de abril de 2028. Migrar ahora te da Temporal y V8 14.6, y te quita una migración con prisa en 2028.

¿Hay que usar un flag para Temporal en Node 26?

No. Temporal está activado por defecto desde Node 26.0.0; en Node 24 no existe sin flags.

Conclusión

Pasar de Node 24 a Node 26 en Docker es cambiar una etiqueta y reinstalar dependencias dentro de la imagen nueva. Lo que puede fallar está acotado: los módulos internos _stream_*, writeHeader(), el flag de tipos experimental y cualquier node_modules compilado para la ABI anterior.

El siguiente paso es añadir node:26-slim a la matriz del CI hoy y cambiar la imagen de producción cuando Node 26 sea LTS el 28 de octubre.

Fuentes: [1] Node.js 26.0.0, notas de la versión[3], [2] Calendario de versiones de Node.js[1], [3] Evolving the Node.js release schedule[2], [4] Temporal en MDN[4], [5] Imágenes oficiales de Node.js en Docker Hub[5].

Fuentes

  1. grupo de publicación de Node.js
  2. anuncio del nuevo calendario
  3. notas de Node.js 26.0.0
  4. Temporal en MDN
  5. Imágenes oficiales de Node.js en Docker Hub