En esta charla, crearemos un pequeño tiempo de ejecución de JavaScript desde cero en Rust. Aprovecharemos el mismo ecosistema de componentes que utiliza Deno para mostrar que crear un tiempo de ejecución personalizado que se ajuste a tus necesidades es simple y divertido en 2023
Crea tu propio tiempo de ejecución de JavaScript
Video Summary and Transcription
Esta charla presenta Deno, un tiempo de ejecución personalizado de JavaScript similar a Node.js, y analiza los beneficios de utilizar un tiempo de ejecución personalizado. Explora el proceso de construcción de un tiempo de ejecución personalizado con Deno en Rust, incluida la integración con Cargo y la capacidad de combinar y combinar cajas y APIs. La charla también cubre la implementación de la función setTimeout en Run.js y Runtime.js, y proporciona ejemplos de cómo solucionar errores e implementar funciones adicionales. En general, la charla destaca la flexibilidad y las posibilidades de crear tiempos de ejecución personalizados con Deno.
1. Introducción a Deno y Custom JavaScript Runtime
Hola, gente. Soy Bartek del equipo de Deno. Hablaremos sobre la creación de un Custom JavaScript Runtime, basado en nuestra experiencia con Run.js. Deno es un tiempo de ejecución de JavaScript y TypeScript, similar a Node.js. Admite la importación de códigos fuente, la transpilación de TypeScript y tiene muchas herramientas. Deno también proporciona soporte para muchas API web.
Hola, gente. Mi nombre es Bartek, y soy del equipo de Deno, y bienvenidos a su propio tiempo de ejecución de JavaScript. Un poco sobre mí. Comencé a contribuir a Deno en 2018, y luego me convertí en empleado de la compañía a fines de 2019, y he estado con la compañía desde entonces. Actualmente lidero el equipo de CLI de Deno, y si tienen alguna pregunta o seguimiento, no duden en comunicarse a través de uno de los enlaces proporcionados aquí. Entonces, en esta charla, vamos a hablar un poco sobre cómo crear o desarrollar su propio tiempo de ejecución personalizado de JavaScript. No vamos a hacer esto desde cero. Esta charla se basa en un par de publicaciones de blog que hicimos en el pasado. Creamos un pequeño tiempo de ejecución de JavaScript llamado Run.js, y pueden seguir los enlaces y la grabación aquí si desean aprender un poco más sobre la historia del proyecto. Bueno, en nuestra opinión, es bastante fácil comenzar si desean crear su propio tiempo de ejecución de JavaScript. Gracias a las tecnologías que podemos usar ahora, que son el motor para ejecutar JavaScript, pero también parte de la infraestructura que el equipo de Deno proporciona. Entonces, sin más preámbulos, vamos a meternos de lleno en esto. Pero antes de hacerlo, necesitamos aprender un poco más sobre Deno en sí mismo. Deno es un tiempo de ejecución de JavaScript y TypeScript. Su objetivo es ser divertido y productivo de usar. Deno admite la importación de códigos fuente desde un sistema de archivos, desde servidores remotos utilizando los protocolos HTTP o HTTPS, y también admitimos importaciones de NPM utilizando estos especificadores de columna de NPM. Deno es un tiempo de ejecución de TypeScript en el sentido de que no es necesario compilar explícitamente sus fuentes de TypeScript a JavaScript antes de ejecutarlas. Deno puede encargarse de eso por ustedes. Puede transpilar las fuentes, pero también puede verificar los tipos. Deno está construido utilizando Rust y el motor de JavaScript, por lo que en cierto sentido es muy similar a Node.js porque ambos utilizamos el mismo motor de JavaScript. Sin embargo, Deno utiliza Rust para su código nativo, mientras que Node.js utiliza C++. Deno viene con todo incluido. Tenemos muchas herramientas que les permiten comenzar en segundos. Tenemos Formatter, TestRunner, Linter. Incluso pueden crear un binario autocontenido, es decir, empaquetarán todo el código fuente que proporcionen y luego les dará un solo archivo ejecutable. Es algo similar al paquete PKG MPM que pueden usar. Deno también está muy involucrado en las API web. Tenemos muchas de ellas, especialmente Fetch, TextEncoder, TextDecoder, Blob. También tenemos soporte para la API de WebStreams y la API de WebWorker. Hay muchas, muchas más de estas API y les sugiero que visiten el MDM
2. Deano in Rust: Construyendo Runtimes Personalizados
Deano en Rust fue una decisión importante para el proyecto, ya que permitió un desarrollo rápido y aprovechó un vasto ecosistema de crates de alta calidad. Construir Deano es fácil con la integración de Cargo, y los archivos binarios precompilados ahorran tiempo. El sistema de crates de Rust permite la organización modular del código, y Deano ofrece dos runtimes: CLI para desarrollo local y Deano deploy para implementación en la nube. Los usuarios pueden combinar crates y APIs para crear runtimes personalizados. El runtime de ejemplo run.js ya admite módulos ES, transpilación, E/S de archivos, APIs de consola y una API básica de fetch.
3. Implementando una API setTimeout en runJS
Y luego hacemos await run.js.fetches. También estamos usando await de nivel superior aquí. ¿Por qué querrías usar tu propio tiempo de ejecución de JavaScript? Hay algunos casos de uso. Primero, ejecutar código no confiable. Es posible que desees un conjunto limitado de APIs. Por otro lado, utilizarás muchos menos recursos. Segundo, tener limitaciones de recursos. Dno se envía con todo incluido, pero es posible que no necesites todas las APIs. Por último, tu proyecto podría beneficiarse de enviar un único binario autocontenido. Hagamos algo de programación. Implementando una API setTimeout en runJS.
4. Implementando setTimeout en Runtime.js
Pero omitiremos la validación y pasaremos directamente al código. Necesitamos implementar la función setTimeout nosotros mismos ya que no está integrada en el motor de JavaScript. En el archivo Runtime.js, asignamos el objeto console y la API run.js. Ahora, agreguemos la API globaldisk.settimeout, que acepta un callback y un retraso en milisegundos. Llamaremos a una función asíncrona en Rust para esperar el retraso dado y luego activar el callback.
Entonces, comencemos eliminando este ejemplo e intentemos hacer setTimeout, y voy a hacer Esto lo haré más grande para ti. Haré hola mundo desde timeout. Y quiero que esto se active después de un segundo. Entonces, el retraso que pasamos es un milisegundo. Entonces, mil milisegundos es un segundo, y ahora, si intentamos ejecutar este código nuevamente, y déjame hacer esto más grande para ti nuevamente. Entonces, ejecutamos nuestro ejemplo.ts y obtuvimos un error de referencia. SetTimeout no está definido. Bueno, esto es esperado. SetTimeout no está integrado en el motor de JavaScript. En cambio, es una API web o una API integrada en Node.js. Pero no lo tenemos aquí. Necesitamos implementarlo nosotros mismos. Así que hagamos eso. Voy a entrar en el archivo Runtime.js, que es un archivo en el que implementamos todas las API disponibles en nuestro ejemplo Run.js. Entonces, como puedes ver aquí, estamos asignando a globaldisk.console un objeto console, que ups, no quiero ver la escritura, quiero ver el objeto real. Nuestro objeto console tiene las funciones log y error, y luego asignamos globaldisk.runjs con run.js, que contiene las cuatro API de las que ya hemos hablado. Así que agreguemos otra. Esta vez será globaldisk.settimeout. Y nuestro settimeout necesita aceptar dos parámetros. El primero es el callback y el segundo es el retraso en milisegundos. Entonces, ¿cómo lo vamos a hacer? Bueno, copilot se adelanta aquí, pero eso no es exactamente lo que haremos. Necesitamos llamar a Rust para hacer algo que espere el retraso dado, y solo cuando hayamos terminado de esperar, activaremos el callback. Entonces, comencemos agregando, llamando a car de async, y lo llamaremos offsetTimeout. Luego haremos delay como un
5. Corrigiendo el Error de Función Indefinida
Entonces, si simplemente intentamos ejecutarlo ahora, obtenemos un error que dice que el nombre de ops no es una función. Arreglémoslo definiendo la función en el archivo main.rs, que implementa nuestro tiempo de ejecución.
6. Implementando la Función de Tiempo de Espera Opuesta
Definimos el atributo op e implementamos la función de tiempo de espera opuesta utilizando fast grades y Tokyo. Creamos una duración a partir del retraso dado en milisegundos y esperamos de forma asíncrona. Después de registrar la función con nuestra extensión, esperamos con éxito un segundo y lo imprimimos en la consola.
7. Creando una Implementación Básica de SET TIMEOUT
Aquí tenemos una implementación básica de SET TIMEOUT utilizando código RAST y JavaScript. Este conocimiento puede ayudarte a agregar más APIs, como crear un sistema de complementos para tu servidor de juegos. Deno proporciona infraestructura para implementar APIs web, sistemas de archivos y redes, lo que te permite adaptarlo a tus necesidades. Las posibilidades de lo que puedes crear son infinitas. Mantente atento a futuras publicaciones de blogs y grabaciones sobre cómo crear tu propio tiempo de ejecución con más características. Todo el código fuente estará disponible en el repositorio. No dudes en contactarnos si tienes alguna pregunta. ¡Gracias por unirte!
Y para ser honesto, las posibilidades de lo que puedes crear con esta infraestructura y escribir más por tu cuenta son simplemente infinitas. Aquí estás limitado por tu propia imaginación. Seguiremos haciendo estas publicaciones de blogs y grabaciones sobre cómo puedes crear tu propio runtime con más y más características en el futuro, así que mantente atento a la próxima parte. Y eso es todo de mi parte. Lamento que haya sido tan corto y que haya tenido que hacerlo rápido, pero espero que te haya parecido interesante. Todo el código fuente, las nueve líneas que hicimos aquí, estará disponible en este repositorio, así que por favor visítalo. Y nuevamente, si tienes alguna pregunta, estaré encantado de responder. Envíame un correo electrónico o envíame un mensaje directo en Twitter, y asegúrate de visitar nuestro sitio web. Gracias por tenerme aquí, y espero que hayas disfrutado esta charla. ¡Hasta la próxima vez!