JavaScript ha dominado como el lenguaje de programación más utilizado desde hace años. Este lenguaje de programación se ejecuta en casi todos los navegadores modernos y es compatible con los sistemas operativos Windows, Linux y macOS.
La gran pregunta es, ¿qué ocurre detrás del capó para permitir que JavaScript se ejecute en un navegador o fuera de un entorno de navegador?
Un entorno de ejecución de JavaScript es un software/una plataforma que ofrece las herramientas/las bibliotecas/la infraestructura necesaria para ejecutar código JavaScript en un ordenador. El entorno de ejecución determina los objetos globales a los que accederá su programa JavaScript e influye en cómo se ejecutará dicho programa.
¿Cómo funciona un entorno de ejecución de JavaScript?
JavaScript se define como un lenguaje interpretado. Por lo tanto, significa que tenemos un intérprete de JavaScript que interpreta el código fuente línea por línea antes de que sea ejecutado por el motor de JavaScript. Sin embargo, el JavaScript moderno tiene características como la compilación Just-In-Time (JIT) que permite al motor JavaScript convertir el código JS en código máquina antes de su ejecución.
Los tiempos de ejecución de JavaScript pueden clasificarse en dos: el tiempo de ejecución de un navegador y un tiempo de ejecución de JavaScript del lado del servidor.
Independientemente del tipo, un tiempo de ejecución suele constar de lo siguiente;
- Un motor JavaScript que interpreta y ejecuta el código. Los distintos navegadores utilizan motores diferentes. Por ejemplo, V8 para Chrome, WebKit/JavaScriptCore para Safari y SpiderMonkey para Firefox.
- Las API web proporcionan acceso a funcionalidades como el DOM, los temporizadores y el fetch.
- La cola de retrollamadas se encarga de almacenar las retrollamadas de las API web.
- La cola de trabajos se encarga de almacenar las operaciones await y las promesas.
- Un bucle de eventos encargado de comprobar las colas de trabajos y las devoluciones de llamada y de enviarlas al motor cuando las colas están vacías.
Un entorno de ejecución JavaScript es útil en estos casos;
- Hace posible ejecutar código JavaScript fuera de un navegador: Un entorno en tiempo de ejecución proporciona acceso a los objetos incorporados y a las bibliotecas necesarias para ejecutar código JavaScript en un ordenador.
- Reduce la interacción con el servidor: Un tiempo de ejecución de JavaScript permite validar las entradas del usuario antes de enviarlas al servidor. Este enfoque reduce el tráfico en el servidor, lo que se traduce en una menor carga del mismo.
- Ahorra ancho de banda: Un tiempo de ejecución no tiene en cuenta dónde aloja su código JavaScript, lo que significa que el código siempre se ejecutará en el cliente.
Estos son los mejores entornos de tiempo de ejecución de JavaScript que puede probar hoy.
Bun
Bun es una plataforma que permite a los desarrolladores construir, probar, ejecutar y agrupar proyectos TypeScript y JavaScript. Este tiempo de ejecución y conjunto de herramientas todo en uno cuenta con un ejecutor de pruebas, un bundler y un gestor de paquetes compatible con Node.js. Bun se ejecuta en Windows, Linux y macOS.
Características principales:
- Compatibilidad Drop-in Node.js: Usando Bun, puede configurar todos sus módulos node en el package.json.
- Rápido: Bun utiliza Zig para ampliar el motor central de JavaScript.
- Compatibilidad con TypeScript: Bun le permite ejecutar todos los archivos con extensiones .tsx y .ts sin configuración extra.
- Modo vigilancia: Añada la bandera –watch a su código y Bun reiniciará automáticamente el proceso cuando cambie cualquier archivo importado.
Bun está diseñado para ejecutar la mayor parte del JavaScript del lado del servidor a la vez que multiplica la productividad de los desarrolladores, reduce la complejidad y mejora el rendimiento. Con Bun, puede utilizar todas las API estándar como WebSocket, ReadableStream, FormData, Response y Request.
Deno
Deno se presenta como un «tiempo de ejecución de JavaScript de próxima generación». Esta herramienta está construida sobre el motor JavaScript V8 y es compatible con npm y Node.js. Deno está diseñado para soportar extensiones de JavaScript como JSX y TypeScript sin configuración extra o pasos de compilación.
Este software tiene varias herramientas incorporadas como un corredor de pruebas, un linter de código para ayudarle a evitar errores, y un formateador de código para hacer su código legible y presentable. La plataforma está construida para la nube, lo que le permite desplegar su aplicación utilizando Deno Deploy o cualquier otro servicio en la nube que se adapte a sus necesidades.
Características principales:
- Seguro por defecto: Esta herramienta está diseñada para restringir el acceso a las API sensibles en tiempo de ejecución. Esta característica permite a Deno proteger su infraestructura JavaScript de código malicioso.
- Código coherente: Deno dispone de API estándar, lo que garantiza que el código que fluye entre el navegador y el backend sea coherente.
- Redes de alto rendimiento: Deno ofrece compatibilidad inmediata con HTTP2, Websockets y HTTPS.
Deno es compatible con servicios en la nube como Microsoft Azure, Cloudflare, distribución AWS Lambda, Google Cloud Run, etc.
Node.js
Node.js es un entorno de ejecución JavaScript multiplataforma y de código abierto. Esta herramienta está diseñada para ser performante ya que está construida sobre el motor JavaScript V8.
Una aplicación Node.js típica no crea un nuevo hilo para cada solicitud, ya que la herramienta está diseñada para ejecutarse en un único proceso. Su biblioteca estándar cuenta con un conjunto de primitivas de E/S asíncronas que evitan que el código JavaScript se bloquee.
Características principales:
- No bloqueante y asíncrono
- Plataforma cruzada
- Dirigido por eventos y de un solo hilo
- Viene con Node Package Manager (NPM)
Node.js está diseñado para manejar múltiples conexiones concurrentes dentro de un único servidor. Cuando la herramienta realiza una operación de E/S como acceder a la base de datos, la herramienta reanuda las operaciones cuando vuelve la respuesta en lugar de bloquear el hilo y malgastar ciclos de CPU.
Blueboat
Blueboat es un tiempo de ejecución de JavaScript sin servidor. La plataforma es compatible con las API web estándar y cuenta con funciones integradas como Request, Response, URL y fetch. Como sistema nativo distribuido, Blueboat se centra en una escalabilidad sin fricciones en la que los recursos locales se sustituyen por sus equivalentes en la nube.
Características principales:
- Rápido ya que utiliza el motor Google V8 y Rust
- Diseñado para manejar datos y API externas ya que viene con funciones de codificación, análisis sintáctico y transformación
- Arrendamiento múltiple seguro y eficiente
- Potentes primitivas de sistema distribuido
Blueboat funciona con la mayoría de los bundlers JavaScript/ TypeScript. Así, puede utilizar Webpack, Bun, o incluso esbuild cuando construya su proyecto JavaScript. Puede desplegar un proyecto Blueboat como un estado mono-tenant o multi-tenant.
Napa.js
Napa.js es un tiempo de ejecución de JavaScript multihilo. Esta plataforma está construida sobre JavaScript V8 y fue diseñada originalmente para soportar el desarrollo de servicios altamente iterativos en Bing. Sin embargo, este tiempo de ejecución ha evolucionado y ahora es un buen complemento de Node.js.
Características principales:
- Tiempo de ejecución multihilo
- Compatible con Node.js y NPM
- Empaquetado como un módulo Node.js, pero también puede incrustarlo en un sistema
Napa.js funciona perfectamente en tareas limitadas por la CPU, ya que puede ejecutar JavaScript en múltiples aislamientos V8 y comunicarse entre ellos. La herramienta se presenta como un módulo Node.js. Sin embargo, puede incrustarla en un proceso anfitrión si no desea utilizarla como dependencia de Node.js.
ChakraCore
ChakraCore es un motor JS con una API C que permite a los desarrolladores añadir JavaScript a cualquier proyecto compatible con C. Este motor funciona perfectamente en Windows, Linux y macOS. La plataforma dispone de varias API de diagnóstico basadas en JSON. Estas API son agonísticas de la plataforma y puede hacerlas interoperables entre diferentes implementaciones.
Características principales:
- Arquitectura multinivel
- Multiplataforma
- Viene con una API en C
El motor se basa en una arquitectura multinivel. Esta arquitectura cuenta con compiladores JIT paralelos que producen código altamente optimizado, un intérprete que ayuda a una rápida configuración y un GC concurrente en segundo plano que permite una gran capacidad de respuesta de la interfaz de usuario en las aplicaciones.
WasmEdge
WasmEdge es un tiempo de ejecución WebAssembly extensible y ligero para aplicaciones edge, cloud-native y descentralizadas. Este tiempo de ejecución alimenta funciones integradas, aplicaciones sin servidor, dispositivos IoT, contratos inteligentes y microservicios.
La plataforma ofrece una caja de arena de ejecución bien definida para el programa de código de bytes WebAssembly. Este software protege y aísla los recursos del sistema operativo como procesos, variables de entorno, sockets y sistemas de archivos.
Características principales:
- Soporte multiplataforma
- Funciona con JavaScript, Rust, Go y C
- Fácil de incrustar en una aplicación host
- Gestión y orquestación nativas de la nube
Puede utilizar WasmEdge con API estándar y módulos ES6. Este tiempo de ejecución también es compatible con módulos Node.js y NPM. WasmEdge también permite a los desarrolladores implementar API de JavaScript en Rust.
Ts-node
Ts-node es un REPL para Node.js y un motor de ejecución de TypeScript. Esta herramienta permite a los desarrolladores ejecutar TypeScript en Node.js sin pasar por la fase de compilación. Ts-node comprueba su versión de Node y proporciona automáticamente los valores predeterminados que coinciden con ella.
Características principales:
- Comprobación de tipos opcional
- Se integra con herramientas CLI, ejecutores de pruebas y depuradores
- Permite el uso de transpiladores de terceros
- Análisis sintáctico automático de tsconfig.json
- Bucle de lectura, evaluación e impresión (REPL) que toma una única expresión como entrada del usuario y devuelve los resultados a la consola tras la ejecución.
Ts-node está diseñado para admitir diversas opciones. Puede especificar estas opciones mediante programación, como variables de entorno, a través de tsconfig.json, o como banderas CLI. El método tsconfig.json es el más preferido.
JerryScript
JerryScript es un motor JS ligero que se ejecuta en dispositivos limitados como los microcontroladores. El motor sólo tiene 64 KB de RAM, y la ROM está restringida a 200 KB. JerryScript soporta la compilación y ejecución en el dispositivo. Este motor también proporciona acceso a los periféricos desde JavaScript.
Características principales:
- Optimizado para un bajo consumo de memoria
- Conformidad con el estándar ECMAScript 5.1
- Compila el código JavaScript a código de bytes mediante el soporte de instantáneas
- Escrito en C99 para una máxima portabilidad
Este motor ofrece varias opciones de configuración que puede utilizar para activar/desactivar características específicas. Puede cambiar el valor de configuración de la opción añadiendo definiciones CMake, utilizando argumentos en el script tools/build.py o presentando definiciones específicas del preprocesador C.
Conclusión
Ahora dispone de una variedad de entornos de ejecución JavaScript que puede utilizar en su próximo proyecto JavaScript. Aunque Node.js es el tiempo de ejecución de JavaScript más utilizado, puede utilizar el resto, dependiendo de la naturaleza del proyecto y de sus preferencias.
Consulte nuestro artículo sobre bibliotecas de validación de datos node.js.