Software Consulting Services

De Node 20 a Node 24 – Cambios importantes y benchmark

Tags: Tecnologías

node

 

 

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

 

node

 

Test Runner Await Implicito

 

node

 

AsyncLocalStorage  – Endpoint de Procesamiento

 

node

 

URLPattern – Endpoint de Procesamiento

 

node

 

Fetch – Endpoint de Procesamiento

 

node

 

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.