Cada abril llega una versión major de Node.js. En 2026 le tocó el turno al 26, publicado el 22 de abril y disponible como Current hasta octubre, cuando pasará a LTS. Si ahora mismo tienes Node 24 en producción, vas bien: es el LTS activo y seguirá con soporte largo. Si usas Node 22, también tienes soporte, aunque ya va siendo hora de planificar el salto.
La regla de oro en proyectos de producción es sencilla: espera a que un major alcance LTS antes de desplegarlo. Con Node 26 eso ocurrirá en octubre de 2026. Para desarrollo y experimentación, en cambio, puedes usarlo ya sin problemas.
En este artículo repasamos las novedades que realmente importan, sin entrar en cada commit del changelog.
Motor V8 13.x: lo que llega de ES2025
Node.js 26 incluye V8 13.x, la versión más reciente del motor de JavaScript de Google. Esto trae de serie varias propuestas de ES2025 que antes requerían polyfill o flags experimentales.
Iterator helpers
Los iterator helpers permiten encadenar operaciones sobre iteradores sin convertirlos en arrays. El resultado es código más limpio y, sobre todo, con menor consumo de memoria cuando el conjunto de datos es grande.
const resultado = [1, 2, 3, 4, 5]
.values()
.filter(n => n % 2 === 0)
.map(n => n * 10)
.toArray();
// resultado: [20, 40]
Antes de Node 26 necesitabas una librería externa o convertir el iterador en array en cada paso. Ahora es nativo.
Promise.try()
Promise.try() resuelve un problema concreto: ejecutar código que puede ser síncrono o asíncrono y capturar los errores de ambos tipos en un único .catch(). Sin este método, si la función lanzaba un error síncrono antes del primer await, ese error escapaba del flujo de promesas.
Promise.try(() => {
// puede lanzar un error síncrono o devolver una promesa
return operacionQuePuedeFallar();
})
.then(resultado => console.log(resultado))
.catch(err => console.error('Error capturado:', err));
Útil para wrappers de librerías donde no controlas si la función es síncrona o asíncrona.
RegExp.escape()
RegExp.escape() escapa automáticamente los caracteres especiales de una cadena para usarla dentro de una expresión regular. Adiós a las funciones de escape caseras que todos hemos copiado de Stack Overflow alguna vez.
const userInput = 'precio: 10.99 (oferta)';
const regex = new RegExp(RegExp.escape(userInput));
permission.drop(): bajar privilegios en tiempo de ejecución
El Permission Model llegó en Node.js 22 con la flag --allow-fs-read, --allow-fs-write y similares. En Node 26 se añade permission.drop(), que permite retirar permisos mientras el proceso está corriendo.
El caso de uso típico es un servidor que al arrancar necesita leer su configuración y abrir sus ficheros de log, pero que después no debería tocar el sistema de ficheros. Con permission.drop() puedes hacer exactamente eso:
import { permission } from 'node:process';
// Al arrancar, leemos configuración y abrimos recursos necesarios
await inicializarApp();
// A partir de aquí, el proceso no puede escribir en el sistema de ficheros
permission.drop('fs.write');
// Cualquier intento posterior de escribir lanzará ERR_ACCESS_DENIED
Tiene mucho sentido en servidores que solo sirven respuestas y no necesitan modificar nada en disco. Si alguien logra inyectar código malicioso después de la inicialización, el daño que puede hacer queda acotado.
node:sqlite: SQLite sin dependencias externas
Uno de los añadidos más comentados de los últimos ciclos: Node.js 26 incluye SQLite de forma nativa a través del módulo node:sqlite. Sin instalar better-sqlite3, sin bindings nativos que recompilar al cambiar de versión de Node.
import { DatabaseSync } from 'node:sqlite';
const db = new DatabaseSync(':memory:');
db.exec(`
CREATE TABLE usuarios (
id INTEGER PRIMARY KEY,
nombre TEXT
)
`);
const insertar = db.prepare('INSERT INTO usuarios (nombre) VALUES (?)');
insertar.run('Ana');
const consultar = db.prepare('SELECT * FROM usuarios');
console.log(consultar.all());
La API es síncrona, lo que simplifica mucho los scripts de utilidad y herramientas CLI. Para aplicaciones web con muchas escrituras concurrentes sigue siendo mejor PostgreSQL o una librería más completa, pero para casos de uso moderados o herramientas internas viene de perlas.
Lo que más se agradece en la práctica: el módulo forma parte de Node.js, así que no hay que añadir dependencias al package.json ni preocuparse por versiones incompatibles.
HTTP/3 y validación de headers
El soporte de HTTP/3 en Node.js lleva varios ciclos en desarrollo. En Node 26 sigue avanzando, aunque los módulos node:http y node:https no cambian visiblemente en su API. El trabajo ocurre en la capa de red interna.
Lo que sí es visible es httpValidation: Node 26 aplica una validación más estricta de los headers HTTP. Algunos headers que antes pasaban silenciosamente ahora lanzan errores. Si tienes tests que generan headers poco ortodoxos, es posible que necesites revisarlos al migrar.
Test runner: más opciones en node:test
El test runner nativo lleva mejorando desde Node 18 y en Node 26 da otro paso adelante.
Timeout global para tests lentos
Puedes definir un timeout máximo para todos los tests con --test-timeout:
node --test --test-timeout=5000 tests/**/*.test.js
Antes había que configurar el timeout en cada test individualmente. Con esta opción global, si un test tarda más de los milisegundos indicados, falla automáticamente.
Modo watch más estable
--watch ya existía, pero tenía comportamientos erráticos al recargar. En Node 26 está bastante más asentado para flujos de trabajo en los que quieres que los tests corran cada vez que guardas un fichero.
Reporters mejorados
Los reporters TAP y JSON reciben mejoras de formato. Si integras los resultados de tests en CI o en dashboards externos, la salida es ahora más consistente y fácil de parsear.
Para proyectos nuevos, node:test ya es una alternativa seria a Jest. No tiene toda la API de Jest, pero cubre la mayoría de casos sin añadir dependencias.
Migrar de Node.js 22 o 24 a Node 26
Si estás pensando en el salto, hay un par de cosas que revisar antes de tocar producción.
Deprecaciones convertidas en errores
En cada major, algunas APIs que llevaban versiones en estado deprecated pasan a lanzar errores directamente. Revisa el CHANGELOG de Node.js 26 y busca las entradas marcadas como runtime deprecation removed o breaking change.
Engines en package.json
Si tu proyecto define la versión mínima de Node en el campo engines, actualízalo:
{
"engines": {
"node": ">=26.0.0"
}
}
Comportamiento de fs en Windows
Hay cambios en cómo Node 26 maneja ciertas flags de fs en Windows. Si tu código corre en Windows o en CI con runners Windows, pruébalo específicamente.
Detectar incompatibilidades
Para hacer una comprobación rápida sin tener que revisar el changelog línea a línea:
npx node-version-checker
Analiza tu proyecto y señala los usos de APIs que han cambiado o desaparecido entre versiones.
También puedes ver las novedades más recientes de la rama en nuestro artículo sobre Node.js 26.3.0: las últimas mejoras en detalle.
¿Paso a Node 26 ahora o espero?
Depende de para qué.
Para desarrollo local y proyectos personales: Node 26 es perfectamente estable. Puedes usarlo ya.
Para producción: espera a octubre de 2026, cuando Node 26 pase a LTS. Hasta entonces, Node 24 es la opción recomendada para despliegues serios. Tiene soporte garantizado y es la versión que la mayoría de librerías del registro prueban activamente.
El ciclo de Node.js es predecible: major en abril, LTS en octubre, soporte activo durante un año, mantenimiento durante otro. Conocer ese calendario te ahorra muchas decisiones de última hora.
Si quieres profundizar en cómo Node.js evolucionó hasta llegar aquí, puedes leer más sobre JavaScript en el servidor: la evolución de Node.js.
Imagen: Pexels / Markus Spiske
