Skip to main content

Node.js vs. Deno vs. Bun: comparación de rendimiento y runtimes de JavaScript

Escrito por
feature node deno bun

5 de septiembre de 2023

0 minutos de lectura

Por qué es importante elegir el runtime de JavaScript adecuado

Los runtimes de JavaScript permiten ejecutar código de aplicaciones fuera del navegador. Esto significa que puedes ofrecer sitios como aplicaciones alojadas. También puedes usar runtimes de JavaScript para scripts de propósito general.

El runtime que elijas tendrá un impacto considerable en el rendimiento de tus aplicaciones, ya que la velocidad del manejo de solicitudes y del acceso a bases de datos puede variar bastante. También influye en la facilidad de desarrollo y la escalabilidad.

Node.js vs. Deno vs. Bun

Node.js

Node.js es el campeón indiscutible de los runtimes de JavaScript y los desarrolladores de Stack Overflow lo clasificaron como la tecnología web más popular en 2023. Ryan Dahl lo creó y lanzó en 2009. No cabe duda de que revolucionó lo que se podía hacer con JavaScript cuando llegó al mercado. Con él, los desarrolladores pueden crear aplicaciones avanzadas de backend con JavaScript.

Hoy existe un enorme ecosistema en torno a Node.js, con una gran cantidad de recursos y bibliotecas. 

Deno

Deno es un runtime de JavaScript basado en Rust. Al igual que Node.js, fue creado y lanzado por Ryan Dahl 

Uno de sus principales objetivos es mejorar la seguridad de Node.js. En Deno, el acceso a archivos, redes y variables de entorno debe habilitarse de forma explícita, lo que reduce la probabilidad de que surjan problemas de seguridad relacionados con estas áreas. También está diseñado para ofrecer mejor compatibilidad con JSX y TypeScript, y para orientarse más a los estándares web. Para facilitar la implementación, empaqueta las aplicaciones en un único ejecutable independiente.

Deno también cuenta con un ecosistema de herramientas que ayuda a los desarrolladores a iniciar sus proyectos. Fresh es un framework web creado para Deno, y Lume es su generador de sitios estáticos.

Bun

Bun es el runtime más reciente que busca captar tu atención. Desarrollado con Zig, aspira a ser un runtime y conjunto de herramientas todo en uno, centrado en la velocidad, el empaquetado, las pruebas y la compatibilidad con paquetes de Node.js. Uno de sus mayores atractivos es su rendimiento, que supera claramente al de Node.js y Deno. Si cumple con todo lo que promete, será una opción muy atractiva.

Para mostrar su rendimiento, los encargados de Bun ofrecen un benchmark de ejemplo que ejecuta un controlador HTTP para renderizar una página del lado del servidor con React. Bun procesó alrededor de 68,000 solicitudes por segundo, frente a unas 29,000 de Deno y 14,000 de Node.js. La diferencia es considerable. Jarred Sumner publica regularmente novedades sobre el desarrollo de Bun y benchmarks recientes en Twitter, así que síguelo para mantenerte al día.

Bun también incluye funciones de empaquetado y ejecución de tareas para proyectos basados en JavaScript y TypeScript. Al igual que Deno, genera binarios únicos y es compatible con las API web. También admite algunas bibliotecas de Node.js mediante la compatibilidad con npm.

Comparación de runtimes de JavaScript

Veamos las diferencias más de cerca, centrándonos en el rendimiento, el soporte y la comunidad, la estabilidad, la seguridad y las funciones adicionales.

Rendimiento y velocidad

Vayamos directo al grano: Bun gana. Ya vimos su rendimiento y cuántas solicitudes por segundo puede manejar, lo cual es bastante impresionante. Lo mismo ocurre con las operaciones de bases de datos. El promedio de consultas por segundo al cargar la base de datos Northwind para SQLite con el ejemplo de benchmark de Bun es el siguiente:

Runtime

Promedio de consultas por segundo

Node.js

21.29

Deno

43.50

Bun

81.37

En otra comparación entre Node.js, Deno y Bun, Bun es el más rápido para manejar conexiones simultáneas. También procesa muchas más solicitudes por segundo. Por ejemplo, con 10 conexiones simultáneas, Bun alcanza las 110,000 solicitudes por segundo, mientras que Node.js llega a 60,000 y Deno a 67,000. Esta tendencia se mantiene al aumentar las conexiones simultáneas y comparar el rendimiento de cada runtime.

¿Por qué Bun es mucho más rápido que Node?

Aunque hay cierto debate sobre la validez de los escenarios usados en las pruebas de rendimiento, Bun sigue siendo el ganador. Node.js queda en último lugar en todas las comparaciones y tiene un rendimiento especialmente bajo en velocidad de bases de datos. Deno y Node.js suelen tener resultados bastante similares, y Bun los supera ampliamente. Aunque Node.js va a la zaga en este aspecto, Yagiz Nizipli lidera los esfuerzos para mejorar el rendimiento de varios aspectos de Node.js, como acelerar el análisis de URL en aproximadamente un 80-90%.

También puedes ejecutar las pruebas de rendimiento de Bun en tu propio entorno para ver cómo se desempeña en estos escenarios:

La velocidad de Bun ha sido una prioridad para sus desarrolladores. Usa JavaScriptCore, el motor que también utiliza Safari. En cambio, Deno y Node.js usan el mismo motor de JavaScript V8 que Chrome.

Además de ser rápido, Bun está diseñado para iniciarse rápidamente y mantener un buen rendimiento cuando ejecutas varias instancias. Esto lo convierte en una buena opción para aplicaciones con escalado dinámico. Si recibes un aumento repentino del tráfico y necesitas crear instancias rápidamente, Bun está pensado para que tus servicios estén disponibles cuanto antes.

Soporte y comunidad

Los tres proyectos son de código abierto, pero no todos reciben apoyo exclusivo de la comunidad. La OpenJS Foundation respalda Node.js, que depende exclusivamente de la comunidad y de voluntarios. Organizaciones con fines de lucro y proyectos respaldados por capital de riesgo apoyan a Deno y Bun.

Node.js tiene un ecosistema consolidado y una comunidad enorme, con guías en línea para todos los casos de uso. En cambio, Deno y Bun son mucho más recientes, así que hay menos material de soporte. Aun así, no faltan desarrolladores entusiastas dispuestos a compartir sus conocimientos. Además, Deno 1.28 mejoró la compatibilidad con los paquetes de npm para facilitar la adopción entre los desarrolladores que migran desde Node.js.

Esta tabla muestra cuántas preguntas de Stack Overflow tienen etiquetas para cada runtime (a diciembre de 2024):

Runtime

Preguntas con etiqueta

Node.js

475028

Deno

1105

Bun

264

Gráfico de barras del uso de entornos de ejecución de JavaScript: Node.js 27,976; navegador 24,369; service workers 5,316; Deno 3,344; Bun 1,263; Hermes 884; ChakraCore 113.

Cada año se realiza una encuesta para desarrolladores llamada State of JavaScript. Una de sus preguntas es qué runtimes usan habitualmente los participantes, y casi 30,000 personas respondieron. Los resultados de la encuesta de 2022 también muestran a Node.js como líder indiscutible, con Deno detrás, con unos 5,300 votos, y Bun con alrededor de 1,200. 

Los resultados de la encuesta State of JavaScript 2024 muestran que Bun avanzó rápidamente, superó a Deno y ahora es claramente la segunda opción después de Node.js:

La documentación oficial de Node.js incluye varias guías, una amplia referencia de API e información para comenzar. También brinda información sobre sus dependencias.

El sitio de Deno incluye un manual detallado para ayudarte a familiarizarte con el runtime y usarlo en tus proyectos. También ofrece información sobre la biblioteca estándar, que los desarrolladores pueden usar desde el primer momento. 

Estabilidad

Como opción consolidada, Node.js ofrece un rendimiento probado y impulsa el 2.1 por ciento de los sitios web del mundo. Desde su lanzamiento de la versión 1.0 en mayo de 2020, Node.js ha avanzado en la mejora de la experiencia de desarrollo y ha mantenido la estabilidad en cada lanzamiento, para que los desarrolladores puedan actualizar con poco o ningún impacto. 

 Bun está actualmente en la versión 1.1.42 y lanza nuevas versiones con una frecuencia de apenas unas semanas, incorporando más funciones, correcciones y compatibilidad con el runtime principal de Node.js.

Seguridad

La administración de dependencias con npm puede ser un punto débil de seguridad, y al desarrollar sobre Node.js también pueden surgir problemas generales de seguridad de las aplicaciones. La creación de un runtime más seguro fue uno de los principales motivos para desarrollar Deno, cuyo diseño gira en torno a controles de acceso detallados para API sensibles, como las solicitudes de red, las operaciones del sistema de archivos y otras funciones esenciales. Node.js no se queda muy atrás en este aspecto. Node.js 20 incorporó un modelo de permisos que permite aplicar medidas de seguridad similares a las de Deno.

Conocer los errores comunes y las prácticas recomendadas de Node.js puede ayudarte a crear una aplicación de Node.js segura.

Deno aborda algunos de los problemas de seguridad inherentes a Node.js al exigir permisos explícitos para ciertas acciones de la aplicación en ejecución. Por ejemplo, para que tu aplicación pueda leer el sistema de archivos, debes iniciarla con la marca --allow-read. En su documentación de permisos encontrarás la lista completa. También puedes interactuar con este sistema de permisos durante la ejecución para solicitar y revocar permisos mediante programación. Ten cuidado con los subprocesos al usar la marca --allow-, ya que los subprocesos que se inician no tienen las mismas restricciones de seguridad que el proceso de Deno y pueden invalidar el sandbox de seguridad de Deno, lo que podría provocar una escalada de privilegios.

Funciones adicionales

Node.js incorporó algunas funciones para acercarse a las capacidades de Deno y Bun. Ahora incluye un ejecutor de pruebas integrado y compatibilidad experimental integrada con TypeScript.

Deno incluye un inspector de dependencias y un formateador de código. También es una ventaja que permita implementar aplicaciones como un único ejecutable. Al configurar un servidor con Deno, el método básico descrito en su documentación consiste en obtener código de otros lugares. El código no parece mucho más complicado que en Node.js, pero puede sentirse algo diferente porque las dependencias se cargan mediante URL.

Aquí tienes una versión simplificada de el código:

import { serve } from "https://deno.land/std@0.198.0/http/server.ts";

const handler = async (_request: Request): Promise<Response> => {
  const resp = await fetch("https://api.github.com/users/denoland", {
    // The init object here has an headers object containing a
    // header that indicates what type of response we accept.
    // We're not specifying the method field since by default
    // fetch makes a GET request.
    headers: {
      accept: "application/json",
    },
  });

  return new Response(resp.body, {
    status: resp.status,
    headers: {
      "content-type": "application/json",
    },
  });
};

serve(handler);

Entre las funciones adicionales de Bun se incluyen un transpilador y un administrador de paquetes. Como su nombre sugiere, también incluye funciones de empaquetado, que ofrecen funcionalidades para las que de otro modo necesitarías otra herramienta, como Snowpack o rollup.js. También elimina código muerto mediante su minificador de JavaScript.

Si usas Bun para ejecutar tareas, su velocidad puede ser una gran ventaja. Según Bun, tarda unos 5 milisegundos en iniciarse, frente a unos 25 milisegundos de Node.js. Quizás no parezca una diferencia importante, pero al ejecutar varias tareas a lo largo del tiempo, puede acelerar considerablemente tu flujo de trabajo de desarrollo.

¿Deberías usar Bun, Deno o Node.js?

Bun es claramente el ganador en velocidad, pero todavía recibe actualizaciones para mejorar su compatibilidad con Node.js, por lo que usarlo en producción conlleva riesgos. ¿Llegará a tener la estabilidad de los otros dos? Tal vez. En cualquier caso, si quieres revolucionar el mercado y superar a la competencia en velocidad, Bun te ofrece esa oportunidad (en la mayoría de los escenarios).

La gran ventaja de Node.js es su madurez y el tamaño de su ecosistema. Encontrarás muchos desarrolladores que lo conocen bien. Sin embargo, Deno y Bun tienen el atractivo de ser más recientes, algo que siempre entusiasma a los desarrolladores.

Deno también tiene muchas ventajas frente a Node.js. Sus funciones permiten desarrollar con más fluidez y hacen que sea fácil crear proyectos complejos de alta calidad. Es seguro y más rápido que Node.js, aunque algo más lento que Bun.

En general, Node.js sigue siendo la opción más segura, con una trayectoria de éxito comprobada. Deno también tiene mucho que ofrecer: sus funciones modernas lo convierten en una buena opción para quienes buscan crear algo nuevo. Y Bun es la herramienta ideal si lo que más te importa es la velocidad o simplemente quieres estar a la vanguardia de la tecnología.

Snyk prioriza la experiencia de desarrollo

Descubre por qué la experiencia de desarrollo es tan importante y cómo Snyk la optimiza con nuestras funciones más recientes.

Publicado en:

Leer más

Blog

Verano en los estadios: la gira Snyk Connect Fan Zone

La gira Fan Zone de Snyk llevó talleres de seguridad de IA, networking y competencia amistosa a 8 ciudades y 3 sesiones virtuales. Los asistentes desarrollaron habilidades, compartieron ideas y crecieron juntos.

Blog

Snyk VulnBench JS 1.0: ¿Pueden los LLM encontrar los mismos errores dos veces?

Snyk VulnBench JS 1.0: 300 análisis repetidos muestran que los hallazgos de seguridad de los LLM varían en cada ejecución, mientras que SAST y los modelos detectan distintas vulnerabilidades.

feature insights context
Blog

Cómo construir seguridad de IA junto con nuestros clientes: 5 lecciones del programa de socios de diseño de Evo

Conoce 5 lecciones clave del programa de socios de diseño de Evo de Snyk. Descubre cómo el descubrimiento de IA, la inteligencia de riesgos y la automatización de políticas ayudan a los equipos a proteger la IA generativa y controlar la proliferación de IA a gran escala.