Después de dos años de desarrollo primer lanzamiento significativo , una plataforma para la ejecución aislada de aplicaciones en JavaScript y TypeScript, que puede ser utilizada para crear manejadores que funcionan en el servidor. La plataforma es desarrollada por Ryan Dahl (), creador de Node.js. Al igual que en Node.js, Deno utiliza el motor JavaScript , que también se aplica en navegadores basados en Chromium. Sin embargo, Deno no es una bifurcación de Node.js, sino un nuevo proyecto creado desde cero. El código del proyecto está bajo licencia MIT. Las compilaciones para Linux, Windows y macOS.
El número de versión significativa está relacionado con la estabilización de la API en el espacio de nombres Deno, que es responsable de la interacción de las aplicaciones con el sistema operativo. Las interfaces que aún , por defecto, están ocultas y solo están disponibles cuando se ejecuta en modo ‘—unstable’. A medida que se forman nuevas versiones, tales API se irán trasladando gradualmente a la categoría de estables. La API en el espacio de nombres global, que incluye funciones comunes como setTimeout() y fetch(), se acerca lo más posible a la API de los navegadores web ordinarios y se desarrolla de acuerdo con los estándares web para navegadores. Las API proporcionadas por Rust, que se aplican directamente en el código de la plataforma, así como la interfaz para el desarrollo de plugins para el entorno de ejecución de Deno, aún no están estabilizadas y continúan en desarrollo.
Los principales motivos para la creación de esta nueva plataforma de JavaScript fueron el deseo de corregir errores conceptuales, en la arquitectura de Node.js y proporcionar a los usuarios un entorno más seguro. Para mejorar la seguridad, el contenedor alrededor del motor V8 está escrito en Rust, que permite evitar muchas vulnerabilidades que surgen por el manejo de bajo nivel de la memoria, como el acceso a la memoria después de haber sido liberada, la desreferenciación de punteros nulos y el desbordamiento de búfer. Para el manejo de solicitudes en modo no bloqueante se utiliza la plataforma , también escrita en Rust. Tokio permite crear aplicaciones de alto rendimiento basadas en arquitectura orientada a eventos (Event-driven), soportando multihilo y el procesamiento asíncrono de solicitudes de red.
Principales Deno:
- Orientación hacia la seguridad en la configuración predeterminada. Los accesos a archivos, las capacidades de red y el acceso a variables de entorno están bloqueados por defecto y requieren habilitación explícita. Las aplicaciones, por defecto, se ejecutan en entornos de sandbox aislados y no pueden acceder a las capacidades del sistema sin la concesión de permisos explícitos;
- Soporte integrado para TypeScript además de JavaScript. Para la verificación de tipos y la generación de JavaScript se utiliza el compilador TypeScript, lo que provoca una disminución del rendimiento en comparación con el análisis de JavaScript en V8. En el futuro, se planea desarrollar una implementación propia del sistema de verificación de tipos TypeScript, que permitirá aumentar drásticamente el rendimiento del procesamiento de TypeScript;
- El runtime se proporciona en forma de un único archivo ejecutable autónomo («deno»). Para ejecutar aplicaciones utilizando Deno, es suficiente con para su plataforma un solo archivo ejecutable, de aproximadamente 20 MB, sin dependencias externas y que no requiere ninguna instalación especial en el sistema. A pesar de ello, Deno no es una aplicación monolítica, sino una colección de paquetes crate en Rust (, ), que pueden usarse individualmente;
- Al ejecutar el programa, así como para cargar módulos, se pueden utilizar direcciones a través de URL. Por ejemplo, para ejecutar el programa welcome.js se puede usar el comando «deno https://deno.land/std/examples/welcome.js». El código de recursos externos se descarga y se almacena en la caché del sistema local, pero nunca se actualiza automáticamente (para actualizar, se requiere iniciar explícitamente la aplicación con la bandera «--reload»);
- Procesamiento eficiente de solicitudes HTTP en aplicaciones, la plataforma está diseñada para crear aplicaciones web de alto rendimiento;
- Posibilidad de crear aplicaciones web universales que pueden ejecutarse tanto en Deno como en un navegador web convencional;
- La existencia , cuyo uso no requiere vinculación a dependencias externas. Los módulos de la colección estándar han pasado auditorías adicionales y se han verificado para garantizar su compatibilidad;
- Además del runtime, la plataforma Deno también actúa como un gestor de paquetes y permite acceder a módulos a través de URL dentro del código. Por ejemplo, para cargar un módulo, se puede especificar en el código «import * as log from «https://deno.land/std/log/mod.ts». Los archivos cargados desde servidores externos a través de URL se almacenan en caché. La vinculación de las versiones de los módulos se determina mediante la especificación de números de versión dentro de la URL, como «https://unpkg.com/liltest@0.0.5/dist/liltest.js»;
- Se ha integrado un sistema de inspección de dependencias (comando «deno info») y una herramienta para formatear el código (deno fmt);
- Todos los scripts de la aplicación pueden ser combinados en un solo archivo JavaScript.
Diferencias con Node.js:
- Deno no utiliza el gestor de paquetes npm
y no se vincula a repositorios, la dirección de los módulos se realiza a través de URL o rutas de archivos, y los módulos pueden ser hospedados en cualquier sitio; - En Deno no se utiliza «package.json» para definir módulos;
- Diferencia en API, todas las acciones asíncronas en Deno devuelven una promesa;
- Deno requiere una definición explícita de todos los permisos necesarios para archivos, redes y variables de entorno;
- Todos los errores sin controladores provocan la finalización de la aplicación;
- Deno utiliza un sistema de módulos ECMAScript y no soporta require();
- El servidor HTTP integrado de Deno está escrito en TypeScript y funciona sobre sockets TCP nativos, mientras que el servidor HTTP de Node.js está escrito en C y proporciona enlaces para JavaScript. Los desarrolladores de Deno centraron sus esfuerzos en optimizar toda la capa de sockets TCP y ofrecer una interfaz más general. El servidor HTTP de Deno ofrece una menor capacidad, pero garantiza latencias bajas y predecibles. Por ejemplo, en una prueba, una aplicación básica basada en el servidor HTTP de Deno pudo manejar 25,000 solicitudes por segundo con una latencia máxima de 1.3 milisegundos. En Node.js, una aplicación similar manejó 34,000 solicitudes por segundo, pero las latencias variaron entre 2 y 300 milisegundos.
- Deno no es compatible con paquetes para Node.js (NPM), pero se desarrolla por separado para la compatibilidad con la biblioteca estándar de Node.js, a medida que esta evoluciona, cada vez más aplicaciones escritas para Node.js podrán ejecutarse en Deno.
Fuente: opennet.ru
