
De Node 20 a Node 24 – Cambios importantes y benchmark
Tabla de contenido
Acceso Rápido

Node 20 entró en su fase de mantenimiento en el último cuarto de 2024 y está agendado a terminar alrededor de Abril 2026. Node 24 entró en su estado "current" el 20 de Mayo del 2025. Estamos en un momento ideal para revisar el estado actual de nuestros proyectos y empezar un proceso de migración a Node 24 ya que estará activo por lo menos en los dos próximos años y también presenta cambios importantes a nivel funcional pero con ganancias en rendimiento sustanciales gracias a la nueva versión del motor que utiliza, V8 13.6.
Vamos a señalar 5 cambios importantes y después a hacer una pequeña comparación de rendimiento entre Node 20 y Node 24 utilizando algunas pruebas sintéticas para identificar qué tanto podríamos estar ganando al hacer una migración a la nueva versión.
Cambios destacados
Fetch
Si bien el fetch nativo en Node existe desde la versión 18 en modo experimental, en la versión 21 se mejora y en la 22 se vuelve activo por defecto. Ya no tenemos que importar clientes http por dependencia para hacer requests sin pensar en el uso de fetch como un api experimental. Cabe resaltar que el fetch nativo de Node es el de Undici, por lo tanto la migración es natural si ya hemos hecho ship de código usando esa dependencia.
V8
Desde Node 20 al 24 se ha aumentado de la versión de V8 de 11.3 a 13.6 el cual viene con mejoras al garbage collector, eficiencia en el uso de memoria y tiempo de ejecución. Uno de los cambios más importantes soportados es el manejo explícito de recursos. Un ejemplo de esto en acción es que a bajo nivel somos capaces de utilizar directamente Symbol.dispose y Symbol.asyncDispose y su uso automático por medio de los keywords using y using await.
En términos prácticos si hoy en día apps como Miro ya logran un excelente rendimiento con uso de tecnologías a la medida como Web Assembly, podemos imaginar un futuro donde apps más sofisticadas pueden operar con mejor rendimiento en el backend porque podemos manejar memoria y otros recursos a la medida gracias a estos cambios.
Native Websocket
Node 22 introduce Websocket API nativo estable por lo que ya no tenemos la necesidad de importar ws para instanciar un cliente websocket.
WebAssembly
En Node 24 se introduce el soporte nativo de WebAssembly. Aunque no necesariamente utilicemos Web Assembly en nuestros proyectos, si tenemos que pensar en todas las dependencias que usamos que se benefician de este cambio. De esta manera si hacemos una migración a Node 24 naturalmente los paquetes que ya están soportando esta tecnología nos benefician con ganancias en rendimiento.
Diagnóstico y Trace Events Mejorados
En múltiples versiones hemos visto cambios importantes a la manera en la que se reportan los errores, se hacen los diagnósticos, herramientas para hacer los diagnósticos y trace events enriquecidos que hacen nuestra vida más fácil cuando estamos debuggeando o queremos medir la salud de nuestras apps.
Para muchos usuarios de Node estos podrían ser cambios transparentes pero si por ejemplo usamos herramientas de profiling y observabilidad, estas se benefician de esas mejoras para proporcionar mejores reportes o análisis de nuestros sistemas.
Benchmark: Node 20 vs Node 24
Los siguientes son resultados de 5 pruebas hechas en ambas versiones. Estas son pruebas sintéticas por lo que deberíamos tomar estos resultados como preliminares y después hacer evaluaciones de los rendimientos reales en condiciones productivas.
Las pruebas son: 2 test runners que ponen en prueba el uso de await explícito y otra que lo ignora para validar la nueva funcionalidad en Node 24 que nos elimina la necesidad de tener que esperar la rutina usando await explícito y otras 3 que probaran un fetch, procesamiento con URLPattern y uso de asyncLocalStorage para probar caching de uso liviano en 3 endpoints.
Mediremos el rendimiento utilizando Apache Bench para los endpoints y utilizaremos performance para enriquecer el resultado de las rutinas de test.
Test Runner Await Explicito

Test Runner Await Implicito

AsyncLocalStorage – Endpoint de Procesamiento

URLPattern – Endpoint de Procesamiento

Fetch – Endpoint de Procesamiento

Conclusiones
Hicimos dos tipos de pruebas: en nuestras rutinas de test vemos una mejora más moderada mientras que nuestra pruebas procesando por medio de endpoints algunas sentencias si tienen resultados demasiado disparados.
No hay un benchmark público, riguroso y oficial publicado que conozcamos a la fecha que mida Node 20 vs Node 24 para comparar con lo que hemos probado aquí pero si tenemos que reconocer que hay 2 versiones mayores de diferencia entre las versiones de V8 que se utilizan y es natural que si podamos encontrar diferencias significativas en rendimiento.
Los resultados los podemos tomar con pinzas pero, si apuntan a una mejora significativa. Estas comparaciones se pueden hacer si utilizamos las herramientas correctas para medir en un ambiente real y nos podemos dar cuenta de la diferencia real en nuestras aplicaciones.
Por último esto es un cambio necesario que haremos eventualmente por lo tanto no hay razón para seguir empujando la migración de Node que es inminente si nos queremos mantener dentro de una versión soportada.
Blogs relacionados
Desbloqueando la concurrencia: Una guía completa de Celery en Python

Servicios de consultoría de IA generativa: ¿Cómo hace su negocio más rentable?

Casos de uso de la IA generativa: 6 industrias que se benefician

IA Generativa vs IA: Semejanzas, diferencias e implicaciones éticas

¿Qué es la IA generativa? Cómo funciona, implementación y ejemplos
