Cómo funcionan los Módulos JS: una Perspectiva del Navegador

This ad is not shown to multipass and full ticket holders
JSNation US
JSNation US 2025
November 17 - 20, 2025
New York, US & Online
See JS stars in the US biggest planetarium
Learn More
In partnership with Focus Reactive
Upcoming event
JSNation US 2025
JSNation US 2025
November 17 - 20, 2025. New York, US & Online
Learn more
Bookmark
Rate this content

Los módulos son una herramienta popular para los Desarrolladores de JavaScript. Recientemente, ha habido una serie de propuestas que abordan cómo funcionan los Módulos, incluyendo Import Maps, Top level await, JSON modules, Module asserts, y muchos otros. Pero, ¿cómo funciona el sistema de carga de módulos y cómo estas propuestas lo mejoran? ¿Cómo se ve desde la perspectiva de los navegadores cargar un árbol de módulos con un import map? Exploraremos estas preguntas y más, dándote una mirada detrás de escena a la carga de módulos en JS.

This talk has been presented at JSNation 2022, check out the latest edition of this JavaScript Conference.

FAQ

Yulia Starzev es una ingeniera de software de Mozilla que trabaja en SpiderMonkey, el compilador de JavaScript para Firefox.

SpiderMonkey es el compilador de JavaScript utilizado por el navegador Firefox. No solo compila JavaScript, sino también WebAssembly.

Los módulos de JavaScript, particularmente los módulos ES6, fueron introducidos en la especificación en 2015 y empezaron a ser implementados por los navegadores en 2018.

Un registro de módulo es una estructura de datos en la especificación de JavaScript que actúa como un nodo en el gráfico de dependencias de módulos, conteniendo información sobre las importaciones y exportaciones del módulo.

En JavaScript, la carga de módulos involucra la construcción de un gráfico que permite ciclos, donde cada módulo se analiza y se registra antes de resolver importaciones y continuar con la carga de otros scripts necesarios.

El nombre SpiderMonkey fue dado por Brendan Eich, el autor original de JavaScript, inspirado en un mono araña que le pareció especialmente feo durante una visita al zoológico.

WebAssembly es un formato de código binario que permite la ejecución de código a cerca del rendimiento nativo, que es compatible y se puede cargar a través de JavaScript en los navegadores modernos.

No hay diferencias significativas en la implementación de módulos ES6 entre Mozilla y otros navegadores como Chromium o WebKit.

Yulia Startsev
Yulia Startsev
26 min
16 Jun, 2022

Comments

Sign in or register to post your comment.
Video Summary and Transcription
Esta Charla discute los módulos de JavaScript desde la perspectiva de un navegador, explorando cómo funcionan y sus diferencias con el JS común. Cubre temas como la carga de módulos, los registros de módulos y el mapa de módulos. Se explica el proceso de carga y evaluación de módulos, junto con los desafíos de adopción y rendimiento de los módulos. La Charla también toca temas como la carga diferida, la importación dinámica y la reflexión de importación. El orador comparte una anécdota humorística durante la sesión de preguntas y respuestas sobre robar una camiseta del equipo de DOM.

1. Introducción a los Módulos de JavaScript

Short description:

Vamos a hablar sobre los módulos de JavaScript, específicamente desde la perspectiva de un navegador. Soy Yulia Starzev, ingeniera de software en Mozilla, trabajando en SpiderMonkey. Me encontré con un tweet interesante de mi excolega, Jason Orndorff, sobre un invariante de los lenguajes de programación. Usemos el pez como nuestro tema y compartamos un chiste de David Foster Wallace sobre dos peces en el océano.

Esa es una introducción muy genial. Por cierto, si alguien está pensando, oh, ¿qué pregunta debería hacer en el Q&A? , pregúntame sobre cómo obtuvimos el nombre SpiderMonkey.

Es una historia divertida. Así que hola a todos. Vamos a hablar sobre los módulos de JavaScript. En particular, vamos a tomar una perspectiva un poco inusual, que es la de un navegador. Así que mi nombre es, eso fue rápido. Mi nombre es Yulia Starzev. Soy ingeniera de software en Mozilla. En particular, trabajo en SpiderMonkey, que es el compilador de JavaScript para Firefox. De hecho, no es solo JavaScript, también hacemos WebAssembly. La parte en la que trabajo es el lado de JavaScript. También hago un poco de trabajo en el DOM.

Y mi enfoque es el diseño e implementación de características de JavaScript. Para comenzar esta charla, cuando la estaba escribiendo, estaba un poco atascada y estaba como, no sé cómo voy a unir todo esto y hacerlo entretenido. Esto es un poco seco. Y me encontré con este gran tweet de mi excolega, Jason Orndorff. Solía trabajar en SpiderMonkey conmigo y aprendí mucho de él. Especialmente sobre diseño de lenguajes y lenguajes. Escribió este gran... Llamémoslo un invariante de todos los lenguajes de programación que implementan un método de reversa de cadena. Incidentalmente, JavaScript no implementa el método de reversa de cadena. Pero efectivamente, string.

reverse en cualquier lenguaje en el que lo pruebes no revertirá una imagen de un pez. Aquí tenemos un ejemplo de tal programa en Ruby en el que tenemos dos versiones de una imagen de pez, una hecha con corchetes angulares y la otra hecha como un emoji. Y notarás que cuando ejecutamos este código, de hecho, el pez sigue mirando en la misma dirección. Podríamos decir que este pez es invariante, una palabra importante que usaremos. Así que el pez es nuestro tema, y dado que tengo al pez como tema, puedo usar uno de mis chistes de apertura favoritos de una conferencia magistral que proviene de David Foster Wallace en su conferencia magistral de 2005 a una universidad, que va algo así. Dos peces están nadando en el océano y simplemente ocupándose de sus propios asuntos. Son jóvenes. Son nuevos en este hermoso mundo azul, y un pez más viejo pasa nadando y dice, ¿cómo está el agua, chicos?

2. Introduction to JavaScript Modules (continued)

Short description:

El sistema de módulos es similar a algo que damos por sentado. Los módulos ES6 se introdujeron en 2015. Vamos a explorar cómo funcionan los módulos, sus diferencias con common JS y cómo el sistema de módulos construye un gráfico. El registro del módulo actúa como un plano para nuestro módulo.

Un poco más tarde, los dos peces siguen nadando en silencio cuando uno de los peces se gira hacia el otro y dice, ¿qué demonios es el agua? Este es un gran chiste para preparar el escenario para algo que podríamos dar por sentado, para algo que existe en el éter y parece que simplemente está ahí, algo que no necesitas cuestionar.

Eso es un poco como lo que es el sistema de módulos. Imagino que en los últimos siete años de existencia de los módulos ES6, muchos de ustedes lo han adoptado y lo usan como su forma principal de escribir módulos de JavaScript, especialmente la sintaxis de importación-exportación. ¡Oh, sí, olvidé arreglar eso! ¡Por alguna razón tengo eso dos veces! ¿Cómo llegamos aquí?

Una pregunta que podrías hacer es, bueno, los módulos, ¿cuándo comenzaron? ¿Cuántos años tiene este problema? Tengo parte de una respuesta aquí para ti. No puedo darte una respuesta definitiva, pero aquí hay una base de código que es un fragmento de código en la base de código de Mozilla. Se llama el cargador de componentes MOZ.js. Quiero destacar la fecha aquí, que es 1999. Esta base de código tiene un lugar especial en mi corazón porque resulta que estoy trabajando en ella hoy. No todos los días puedes decir que el código que estás escribiendo está listo para obtener su título de máster.

Para muchos de ustedes en la audiencia, es probable que los módulos realmente llegaron a la vanguardia con la introducción de Node. En particular, esta publicación de blog de 2009 por Kevin Dengar es un punto de referencia importante, porque aquí está preguntando, él también es un ex empleado de Mozilla, está preguntando, ¿qué necesita JavaScript del lado del servidor? En esta publicación de blog, introduce la necesidad de un sistema de módulos, e introduce un nuevo grupo comunitario llamado el grupo comunitario de server JS. Este grupo fue renombrado más tarde a common JS, lo cual imagino que suena bastante familiar. Como se mencionó, seis años después, en 2015, los módulos ES6 finalmente se introdujeron en la especificación. Los navegadores tardaron un poco más en implementarlo. Llegaron en 2018. Introdujo una serie de características al navegador, incluida la sintaxis de importación-exportación con la que muchos de ustedes están familiarizados.

Vamos a entrar en el meollo de esta charla. ¿Cómo funcionan los módulos? ¿Qué es este sistema de módulos? ¿Qué hace? ¿En qué se diferencia de common JS? ¿Por qué no especificamos common JS? Eventualmente, llegaremos a cómo se ve la característica para el sistema de módulos en los navegadores. Una cosa para comenzar es que el sistema de módulos construye un gráfico. Este gráfico permite ciclos. Si tienes un módulo importando algún vecino, y ese vecino importa un ancestro de tu módulo inicial, esto funcionará. Es una característica importante para la ergonomía del desarrollador. No quieres estar rompiendo ciclos manualmente todo el tiempo. El navegador hace esto por ti. Entonces, ¿cómo construimos realmente este gráfico? ¿Cómo funciona? ¿Cómo aseguramos que realmente puedas escribir tus módulos de esta manera cíclica? Voy a comenzar tomando la perspectiva de un nodo. El nodo, en este caso, en este gráfico, va a ser un único script de módulo. En la especificación, tenemos una estructura de datos llamada el registro del módulo, y el registro del módulo es este nodo. Es un poco como un plano para nuestro pez, para nuestro módulo que estamos escribiendo. Y viene en algún lugar en el medio del proceso que estamos a punto de describir. Si quieres echar un vistazo a la base de código, tengo el texto fuente para la implementación de Mozilla de esto enlazado allí.

3. Loading ES6 Modules and Module Records

Short description:

Un registro de módulo es una tabla con campos de imports y exports. Define claves para imports y exports, usando especificadores de URL para imports y apuntando a código en vivo para exports. En common JS, cargar un módulo es sincrónico y bloquea el hilo principal, causando problemas de rendimiento. Los módulos ES6 se cargan de manera diferente, analizando todo el archivo y construyendo un registro de módulo. Este registro proporciona una vista localizada del gráfico del módulo, incluyendo imports y bordes salientes.

Puedes echar un vistazo a las diapositivas más tarde. Efectivamente, ¿qué es un registro de módulo? Básicamente es una tabla con un par de campos. Tienes un campo de imports y exports, y el campo de imports define una serie de claves que son, por ejemplo, lo que podrías llamar un nombre de variable, al igual que los exports, definen una serie de claves, la diferencia es que los imports usan el especificador de URL para el hijo dado que queremos importar, y los exports apuntan a una pieza específica de código que va a estar en vivo.

Ahora, hablemos un poco sobre cómo podríamos cargar este módulo. ¿Cómo empezamos a construir esta estructura de datos? Antes de decirte cómo funciona esto en ES6, te voy a contar cómo funciona en common JS, porque el contraste es importante, especialmente para discusiones posteriores. Digamos, esto es, vamos a pretender que este es el caso típico para common JS. Escribes un fragmento de código y tienes un bloque de JavaScript que está haciendo algún tipo de trabajo, luego llegas a una declaración require. En este caso, el trabajo que estamos haciendo es crear una ruta dinámica, y luego estamos requiriendo esa ruta y cargándola. El navegador ya ha hecho el paso de cargar este script, lo ha analizado, y ahora lo está ejecutando, por lo que pausa la ejecución y procede a hacer otra carga, otro análisis, otra ejecución. En nuestro otro módulo, comenzamos a ejecutar, y luego encontramos otra declaración require, así que nos vamos al éter de internet para cargar ese nuevo módulo, luego continuamos nuestra ejecución, y finalmente, regresamos a nuestro módulo anterior y continuamos ejecutando.

Entonces, ¿cuál es el problema con este diseño? ¿Por qué no implementamos esto? El problema es que notarás que no hay sintaxis de promesa aquí en ninguna parte, y por supuesto common.js fue antes de await a nivel superior. Un problema aquí es que esto es completamente sincrónico, y un problema con esto es que en la plataforma web no podemos bloquear el hilo principal para una solicitud de red. Para system.js y common.js, esto estaba bien. Voy a darte una estimación aproximada en términos de tiempo aquí. Digamos que tienes un procesador, tienes el registro en el procesador para acceder a ese registro, es como un segundo para acceder a la memoria principal, estás viendo alrededor de seis segundos o así. Si quieres obtener la memoria principal siendo RAM, si quieres obtener algo de la red en esta escala de tiempo, estás viendo alrededor de cuatro años. Este es un trozo de tiempo realmente significativo que vas a pasar en la red. Además, hay un invariante importante de la plataforma web, se llama ejecución hasta completar. ¿Qué significa ejecución hasta completar? Si has estudiado sistemas operativos, puede que estés familiarizado. Pero si no lo has hecho, ejecución hasta completar significa que una tarea dada continuará ejecutándose hasta que voluntariamente ceda su control del procesador, o termine su tarea. Eso significa que no podemos interrumpir una tarea que, por ejemplo, está bloqueando el hilo principal, por lo que continuará bloqueando. Eso no es una gran experiencia para los usuarios de la web, y eso hace que sea una API muy propensa a errores para que los desarrolladores la usen. Así que no pudimos introducir la carga sincrónica.

Entonces, ¿cómo resolvemos este problema? Bueno, esto nos lleva a la pregunta de cómo cargamos un módulo ES6. Se ve un poco así. Recuerda que dije que common JS está cargando, analizando y evaluando el módulo todo en un paso. En ES6, hacemos eso de manera diferente. Primero analizamos todo el archivo, y luego construimos este registro de módulo que mencioné antes. El registro de módulo nos da esta imagen de una vista localizada del gráfico, así que, yo soy mis vecinos, estos son mis bordes entrantes, estos son mis bordes salientes. Una vez que tenemos esto, también tenemos los imports, las otras URLs que necesitamos cargar, así que podemos proceder a cargar otro script. A medida que cargamos ese otro script, podemos ir y hacer el mismo proceso aquí, que es primero analizar, y luego construir ese registro de módulo.

4. Loading Modules and the Module Map

Short description:

El bucle de análisis y obtención es una parte importante de cómo el sistema de módulos difiere de common.js. El mapa de módulos, una estructura de datos global, nos ayuda a romper ciclos al cargar módulos. Se utilizan URLs para determinar la ubicación de los módulos y obtener los archivos necesarios.

Notarás que no hacemos ninguna evaluación en esta fase. Esto se llama el bucle de análisis y obtención. Es una pieza importante de cómo el sistema de módulos difiere de common.js.

Una pregunta importante que podrías estar preguntándote es cómo implementas ese comportamiento de bucle de módulos? ¿Cómo rompes bucles y aseguras que no entres en un bucle infinito de módulos importándose continuamente entre sí? La respuesta a eso se encuentra en una estructura de datos global que representa nuestro gráfico. Ahora eso se llama el mapa de módulos. Puedes encontrarlo en la especificación si lo deseas, y rápidamente repasaré cómo el mapa de módulos nos ayuda a romper ciclos cuando estamos cargando módulos.

Una nota importante que voy a hacer aquí, verás que el origen de estas URLs está en rojo. Es importante notar que tenemos que trabajar con URLs y son URLs completamente resueltas que podrías realmente escribir en tu navegador y resolverlo a una página web real. Pero debido al espacio en las diapositivas, esto va a desaparecer, así que en tu mente si ves una URL relativa, siempre reemplaza esa URL relativa con una URL completamente resuelta. Pero comencemos con cómo el mapa de módulos resuelve ciclos en el gráfico. Comenzamos en un estado llamado no enlazado. No hemos establecido relaciones entre vecinos en el gráfico, y main.js es nuestra raíz, path.js es el hijo inmediato, y otro módulo que es el hijo inmediato de path.js.

Main.js comienza su proceso de enlace, voy a ir y mirar a mis hijos. Ve que tiene un hijo y comienza a hacer lo mismo. Path dice tengo hijos, voy a comenzar a enlazar. Otro módulo es el siguiente en el algoritmo y dice es mi turno de comenzar a enlazar. Pero no tengo hijos, así que ahora estoy automáticamente enlazado. Ese es mi estado por defecto. Porque otro módulo se ha enlazado, path.js dice todos mis hijos ahora están enlazados, eso significa que yo también estoy enlazado. Main.js dice todos mis hijos están enlazados, por lo tanto yo también estoy enlazado. Luego introducimos el ciclo, que es importar path.js. Va a ir y mirar a path.js. Aquí es donde ocurre la ruptura del ciclo. Porque path.js ya está enlazado, terminamos el algoritmo allí, e importar path.js puede decir que también está enlazado. En la base de código de Firefox, la forma en que representamos nuestro mapa de módulos es con dos tablas hash. Una de ellas es la tabla hash de obtención, y la otra es la tabla hash obtenida. Lo que nos dice qué estamos cargando actualmente y qué ya hemos cargado. Nos previene de recargar cosas de la red. Los enlaces están todos allí. La siguiente pregunta es por qué estamos usando URLs? La razón por la que estamos usando URLs es que tenemos que saber dónde buscar, y antes de una cierta propuesta de la que vamos a hablar en un segundo, no había forma de determinar cuál era la ubicación y sin la ubicación no podemos obtener el archivo y no tenemos la información que necesitamos para aplicar CSP, que es la política de seguridad de contenido.

5. Module Loading and Evaluation Process

Short description:

Gekko obtiene un script transformando bytes en un modelo de objeto de documento. SpiderMonkey analiza y construye el registro del módulo. La instanciación crea una instancia de módulo con código y estado. ES6 utiliza enlaces en vivo, a diferencia de common JS que hace copias del código. Gekko ejecuta el gráfico del módulo, comenzando desde el último hijo y luego la raíz.

Ambos muy importantes. Muy rápidamente, de principio a fin, todo el proceso de carga de módulos seguido por el proceso de evaluación. Gekko obtiene un flujo de bytes de Internet que transforma en un modelo de objeto de documento, y luego dice, oh, tengo un script, necesito obtener eso. La obtención pasa por otro componente llamado Neko. Se encarga de descargar cosas de Internet, y una vez que Neko regresa a Gekko, la obtención pasa los bytes compilados y convertidos en bytes UTF-8 a SpiderMonkey. SpiderMonkey sabe cómo analizar, sabe cómo instanciar, sabe cómo evaluar. Gekko sabe con quién hablar. Esas son las relaciones entre esos dos componentes. SpiderMonkey recibe este archivo, ve, oh, sí, genial, puedo analizar esto, lo analiza, construye el registro del módulo, dice, hey, en realidad, necesito path.js, hey, obtención, ¿puedes conseguir eso para mí?, Gekko dice, claro, puedo conseguir eso para ti. Aquí están los contenidos de ese archivo. SpiderMonkey procede y lo analiza. Genial, acabamos de terminar el bucle que discutimos hasta este punto. Ahora, el siguiente paso aquí es cómo instanciamos este módulo? La instanciación significa tomar este registro de módulo y convertirlo en un pedazo de código vivo y en funcionamiento. Ahora, ¿qué significa eso? Significa que una instancia de módulo es algo que tiene tanto código como estado en un solo lugar. Esto también difiere de common JS. Common JS haría copias de un determinado pedazo de código. Así que tendrías múltiples de ese estado y múltiples del código ejecutándose. En ES6, es todo un singleton. Tenemos algo llamado enlaces en vivo. Si este pez muere, será visible a través de todo el gráfico. Así que hemos pasado por todo el proceso de obtención. El proceso de ejecución se ve similar. Gekko informa a SpiderMonkey, hey, ¿puedes ejecutar ese gráfico de módulos que tienes? Gekko tiene acceso al módulo raíz de un gráfico dado. Eso viene de una etiqueta de script o una importación dinámica. Él dice, claro. Pero este módulo raíz tiene varios hijos. Voy a ir y recorrer los hijos hasta el final y comenzar desde la ejecución del último hijo que tenga sentido, incluso si está en un ciclo. Tenemos una forma de determinar eso. Así que comenzaremos ejecutando ese hijo, y luego ejecutaremos la raíz.

6. Module Adoption and Performance

Short description:

Cuando hablamos de ciclos, recorremos todo el árbol hacia abajo y establecemos el estado del último hijo posible. La adopción de módulos en la web es relativamente baja, con solo alrededor del 5-8% de la web en vivo utilizando módulos. La razón principal de esto es la velocidad de la red y las múltiples solicitudes de red requeridas por el sistema de módulos. Para abordar este problema, se ha escrito una propuesta llamada evaluación diferida de módulos, que tiene como objetivo mejorar el rendimiento y la adopción de módulos.

Cuando hablamos de ciclos, si tenemos este tipo de situación, no voy a mostrar las diapositivas porque es exactamente lo mismo que enlazar, solo reemplaza no enlazado con enlazado, y la transición que estás haciendo es de evaluar a evaluado. Nuevamente estamos recorriendo todo el árbol hacia abajo y luego estableciendo el estado del último hijo posible y luego invertimos nuestra dirección. Muy bien.

Tenemos tres minutos. Veamos si puedo pasar por el futuro. Así que aquí está el gráfico de cómo se ve la adopción de módulos en la web salvaje y esto viene de la telemetría de Google. Esto es exactamente como quieres que se vea un gráfico. Está subiendo y hacia la derecha. Esto es perfecto. Sin embargo, todos deberíamos ser críticos con los datos y siempre verificar el eje y notarás que hay un buen 8% a la antigua, así que el 8% de la web en vivo está realmente usando módulos. De hecho, esto es tal vez un poco más bajo, tal vez como el 5%, depende de qué parte de los datos estés mirando. Así que eso es un poco bajo para algo que ha estado en producción durante los últimos ocho años o así, siete años. Es un poco bajo. Así que la pregunta es por qué la gente no está adoptando la sintaxis de módulos. Tengo la sensación de que todos lo están usando como una herramienta de autor en esta sala. Sin embargo, pocas personas lo están enviando a los navegadores.

Así que tuvimos esta pregunta, ¿qué demonios es el agua? De qué he estado hablando. Acabo de decirte cómo funciona el sistema de módulos en los navegadores, pero en realidad no se está usando tanto, el sistema de módulos no está siendo golpeado por el código. Un problema es la velocidad de la red. Este es el problema que mencionamos antes cuando discutí la ejecución hasta la finalización. Ahora Tobias hizo un gran trabajo hablando de Webpack y Webpack ha sido una solución porque puedes empaquetar todos esos archivos que necesitas usar y enviarlos directamente a los usuarios en lugar de hacer múltiples solicitudes de red, que es lo que requiere el sistema de módulos. Estamos haciendo múltiples golpes a la red y eso puede ser muy costoso. Además, hay una propuesta de herramientas llamada propuesta de paquetes web, no voy a entrar en detalles porque eso es realmente para herramientas, y si estamos mirando desde una perspectiva de desarrollador, hay otras propuestas más interesantes potencialmente, espero, que pueda mostrarte. Podemos seguir hablando de este problema más amplio de rendimiento que es algo que detiene la adopción de módulos.

Recuerda que tenemos un invariante de ejecución hasta la finalización, lo que significa que no podemos detener el hilo principal y bloquearlo con una solicitud de red porque no tenemos forma de preempción, no tenemos forma de reordenar tareas, tienen que ejecutarse hasta la finalización. El otro invariante que no he mencionado aún es el orden de ejecución. Lo que hace la sintaxis de módulos, si te has dado cuenta, porque vamos al último hijo y ejecutamos eso primero, significa que si has concatenado eso en un solo archivo grande, el comportamiento de un archivo concatenado es el mismo que el módulo cargado. Así que, esta es una propuesta que he escrito que actualmente está en la etapa uno, se llama evaluación diferida de módulos que está tratando de abordar este problema. Tenemos, digamos, un archivo JavaScript con una importación que ha sido este archivo JavaScript ha sido escrito para la mejor legibilidad posible desde la perspectiva de un programador. Así que tenemos una importación estática y luego tenemos varias funciones raramente usadas que eventualmente usarán este código.

7. Lazy Loading and Dynamic Import

Short description:

Para abordar el problema de la carga inmediata, se puede implementar un método perezoso utilizando importación dinámica. Sin embargo, este enfoque tiene un impacto significativo en la base de código, ya que convierte todo en async y await, alterando potencialmente la intención original del código.

Pero eso significa que no necesitamos cargar esta información inmediatamente al frente. Todo esto sucede, tal vez, un minuto después de la ejecución de la aplicación, lo cual podríamos hacer una carga entre medio. Entonces, ¿cómo solucionamos esto? Podrías escribir un método perezoso que haga una importación dinámica del archivo que originalmente te interesaba, pero esto tiene un impacto significativo en tu base de código. En particular, convierte todo en async y await, pero este async await es solo una capa de rendimiento en tu código, pero está cambiando semánticamente cómo funciona ese código. Lo cual potencialmente confunde la intención original de lo que ese código estaba haciendo.

8. Module Evaluation and Import Reflection

Short description:

La tercera evaluación de módulos introduce una nueva pieza en la declaración de import, que es con lazy init. No es exactamente lo mismo que hacer una importación dinámica, pero te permitirá posponer parte de ese trabajo, para que puedas tener una aplicación más eficiente con un par de advertencias. He estado pensando en una sintaxis alternativa aquí, que es para afirmar la pureza de un módulo. Hay una contrapropuesta llamada import reflection. Divide el cargador de módulos en piezas que tú, como desarrollador, puedes programar tú mismo. Finalmente, un problema interesante son los especificadores. Ahora hay una propuesta llamada import maps que te permitirá hacer eso. Un extra, import assertions y JSON modules.

La tercera evaluación de módulos introduce una nueva pieza en la declaración de import, que es con lazy init. Esto te permite posponer la evaluación de ese módulo. No es exactamente lo mismo que hacer una importación dinámica, pero te permitirá posponer parte de ese trabajo, para que puedas tener una aplicación más eficiente con un par de advertencias. Ven a hablar conmigo después de la charla si quieres escuchar más detalles.

Dejaré solo un dato interesante más para que lo pienses. He estado pensando en una sintaxis alternativa aquí, que es para afirmar la pureza de un módulo, ¿qué significa puro en JavaScript? Excelente pregunta. Ven a hablar conmigo sobre eso después. Pero esta puede ser una forma más interesante de insinuar al navegador que esto puede cargarse de manera perezosa. Así que, puedes encontrar esto en la URL que encuentras en la diapositiva. Actualmente está en la etapa uno, y estoy solicitando comentarios. Por eso estoy aquí, después de todo. Sobre esta propuesta.

Hay una contrapropuesta que no intenta resolver el mismo problema, pero nos da las herramientas para resolver el mismo problema en el que también estoy pensando, se llama import reflection. Divide el cargador de módulos en piezas que tú, como desarrollador, puedes programar tú mismo. En particular, el caso de uso es para WebAssembly. WebAssembly no siempre quiere instanciar un módulo como parte del grafo de módulos. Esto te permite dividirlo y hacerlo en tu propio tiempo.

Finalmente, un problema interesante son los especificadores. Estoy seguro de que este es uno que está cerca del corazón de todos. ¿Por qué escribir esto cuando puedes escribir esto? Ahora hay una propuesta que te permitirá hacer eso. Se llama import maps. Está en el WICG, el grupo comunitario de incubadoras web. Está implementado tanto en Chrome como en Firefox, pero no es una especificación web. Estamos esperando eso. Así que puedes molestar a esas personas para que lo lleven al W3C.

Un extra, import assertions y JSON modules. Estoy mencionando esto aquí porque esto te permite importar un módulo JSON. En la otra sala, hace unos cinco minutos comenzó, hay una excelente charla de Rick Hart hablando sobre records y tuples, y aquí hay un pensamiento interesante, para import assertions, en lugar de afirmar que tienes un archivo JSON, tal vez tengas un archivo de solo lectura y es un dato puro que no se puede modificar. Eso es todo. Gracias.

9. Q&A: Origin of the Awesome DOM Shirt

Short description:

Durante la sesión de preguntas y respuestas, el orador revela humorísticamente que robó la increíble camiseta de DOM que lleva puesta de alguien del equipo de DOM. Sin embargo, aclara que le dieron la camiseta un miembro del equipo. Mencionan que ahora también trabajan en los DOMs.

Genial, muchas gracias por tu charla. Pasaremos a la pequeña sesión de preguntas y respuestas. Y comenzaremos con algunas de las preguntas más importantes. Las sacaremos del camino primero. Entonces, ¿de dónde sacaste esta increíble camiseta de DOM? La robé de alguien. ¿La robaste de alguien? Sí. Esto está en... No hagas esto. Está grabando ahora. No, me la dieron. La obtuve de alguien que trabaja en el equipo de DOM, aunque estoy consiguiendo mi propia versión de esta camiseta porque ahora también trabajo en los DOMs, así que... Sí, es... Genial. Bueno, quien haya hecho esa pregunta, aquí está tu respuesta.

Check out more articles and videos

We constantly think of articles and videos that might spark Git people interest / skill us up or help building a stellar career

Escalando con Remix y Micro Frontends
Remix Conf Europe 2022Remix Conf Europe 2022
23 min
Escalando con Remix y Micro Frontends
Top Content
This talk discusses the usage of Microfrontends in Remix and introduces the Tiny Frontend library. Kazoo, a used car buying platform, follows a domain-driven design approach and encountered issues with granular slicing. Tiny Frontend aims to solve the slicing problem and promotes type safety and compatibility of shared dependencies. The speaker demonstrates how Tiny Frontend works with server-side rendering and how Remix can consume and update components without redeploying the app. The talk also explores the usage of micro frontends and the future support for Webpack Module Federation in Remix.
Componentes de Full Stack
Remix Conf Europe 2022Remix Conf Europe 2022
37 min
Componentes de Full Stack
Top Content
RemixConf EU discussed full stack components and their benefits, such as marrying the backend and UI in the same file. The talk demonstrated the implementation of a combo box with search functionality using Remix and the Downshift library. It also highlighted the ease of creating resource routes in Remix and the importance of code organization and maintainability in full stack components. The speaker expressed gratitude towards the audience and discussed the future of Remix, including its acquisition by Shopify and the potential for collaboration with Hydrogen.
Depuración de JS
React Summit 2023React Summit 2023
24 min
Depuración de JS
Top Content
Debugging JavaScript is a crucial skill that is often overlooked in the industry. It is important to understand the problem, reproduce the issue, and identify the root cause. Having a variety of debugging tools and techniques, such as console methods and graphical debuggers, is beneficial. Replay is a time-traveling debugger for JavaScript that allows users to record and inspect bugs. It works with Redux, plain React, and even minified code with the help of source maps.
Haciendo JavaScript en WebAssembly Rápido
JSNation Live 2021JSNation Live 2021
29 min
Haciendo JavaScript en WebAssembly Rápido
Top Content
WebAssembly enables optimizing JavaScript performance for different environments by deploying the JavaScript engine as a portable WebAssembly module. By making JavaScript on WebAssembly fast, instances can be created for each request, reducing latency and security risks. Initialization and runtime phases can be improved with tools like Wiser and snapshotting, resulting in faster startup times. Optimizing JavaScript performance in WebAssembly can be achieved through techniques like ahead-of-time compilation and inline caching. WebAssembly usage is growing outside the web, offering benefits like isolation and portability. Build sizes and snapshotting in WebAssembly depend on the application, and more information can be found on the Mozilla Hacks website and Bike Reliance site.
¿Webpack en 5 años?
JSNation 2022JSNation 2022
26 min
¿Webpack en 5 años?
Top Content
In the last 10 years, Webpack has shaped the way we develop web applications by introducing code splitting, co-locating style sheets and assets with JavaScript modules, and enabling bundling for server-side processing. Webpack's flexibility and large plugin system have also contributed to innovation in the ecosystem. The initial configuration for Webpack can be overwhelming, but it is necessary due to the complexity of modern web applications. In larger scale applications, there are performance problems in Webpack due to issues with garbage collection, leveraging multiple CPUs, and architectural limitations. Fixing problems in Webpack has trade-offs, but a rewrite could optimize architecture and fix performance issues.
Hacia una Biblioteca Estándar para Runtimes de JavaScript
Node Congress 2022Node Congress 2022
34 min
Hacia una Biblioteca Estándar para Runtimes de JavaScript
Top Content
There is a need for a standard library of APIs for JavaScript runtimes, as there are currently multiple ways to perform fundamental tasks like base64 encoding. JavaScript runtimes have historically lacked a standard library, causing friction and difficulty for developers. The idea of a small core has both benefits and drawbacks, with some runtimes abusing it to limit innovation. There is a misalignment between Node and web browsers in terms of functionality and API standards. The proposal is to involve browser developers in conversations about API standardization and to create a common standard library for JavaScript runtimes.

Workshops on related topic

Domina los Patrones de JavaScript
JSNation 2024JSNation 2024
145 min
Domina los Patrones de JavaScript
Top Content
Featured Workshop
Adrian Hajdin
Adrian Hajdin
Durante esta masterclass, los participantes revisarán los patrones esenciales de JavaScript que todo desarrollador debería conocer. A través de ejercicios prácticos, ejemplos del mundo real y discusiones interactivas, los asistentes profundizarán su comprensión de las mejores prácticas para organizar el código, resolver desafíos comunes y diseñar arquitecturas escalables. Al final de la masterclass, los participantes ganarán una nueva confianza en su capacidad para escribir código JavaScript de alta calidad que resista el paso del tiempo.
Puntos Cubiertos:
1. Introducción a los Patrones de JavaScript2. Patrones Fundamentales3. Patrones de Creación de Objetos4. Patrones de Comportamiento5. Patrones Arquitectónicos6. Ejercicios Prácticos y Estudios de Caso
Cómo Ayudará a los Desarrolladores:
- Obtener una comprensión profunda de los patrones de JavaScript y sus aplicaciones en escenarios del mundo real- Aprender las mejores prácticas para organizar el código, resolver desafíos comunes y diseñar arquitecturas escalables- Mejorar las habilidades de resolución de problemas y la legibilidad del código- Mejorar la colaboración y la comunicación dentro de los equipos de desarrollo- Acelerar el crecimiento de la carrera y las oportunidades de avance en la industria del software
Uso de CodeMirror para construir un editor de JavaScript con Linting y AutoCompletado
React Day Berlin 2022React Day Berlin 2022
86 min
Uso de CodeMirror para construir un editor de JavaScript con Linting y AutoCompletado
Top Content
Workshop
Hussien Khayoon
Kahvi Patel
2 authors
Usar una biblioteca puede parecer fácil a primera vista, pero ¿cómo eliges la biblioteca correcta? ¿Cómo actualizas una existente? ¿Y cómo te abres camino a través de la documentación para encontrar lo que quieres?
En esta masterclass, discutiremos todos estos puntos finos mientras pasamos por un ejemplo general de construcción de un editor de código usando CodeMirror en React. Todo mientras compartimos algunas de las sutilezas que nuestro equipo aprendió sobre el uso de esta biblioteca y algunos problemas que encontramos.
Testing Web Applications Using Cypress
TestJS Summit - January, 2021TestJS Summit - January, 2021
173 min
Testing Web Applications Using Cypress
Top Content
Workshop
Gleb Bahmutov
Gleb Bahmutov
Esta masterclass te enseñará los conceptos básicos para escribir pruebas end-to-end útiles utilizando Cypress Test Runner.
Cubriremos la escritura de pruebas, cubriendo cada característica de la aplicación, estructurando pruebas, interceptando solicitudes de red y configurando los datos del backend.
Cualquiera que conozca el lenguaje de programación JavaScript y tenga NPM instalado podrá seguir adelante.
Desatando los Componentes del Servidor React: Una Inmersión Profunda en el Desarrollo Web de la Próxima Generación
React Day Berlin 2023React Day Berlin 2023
149 min
Desatando los Componentes del Servidor React: Una Inmersión Profunda en el Desarrollo Web de la Próxima Generación
Workshop
Maurice de Beijer
Maurice de Beijer
¡Prepárate para potenciar tus habilidades de desarrollo web con los Componentes del Servidor React! En esta inmersiva masterclass de 3 horas, desbloquearemos el potencial completo de esta tecnología revolucionaria y exploraremos cómo está transformando la forma en que los desarrolladores construyen aplicaciones web rápidas y eficientes.
Únete a nosotros mientras nos adentramos en el emocionante mundo de los Componentes del Servidor React, que combinan sin problemas el renderizado del lado del servidor con la interactividad del lado del cliente para un rendimiento y una experiencia de usuario inigualables. Obtendrás experiencia práctica a través de ejercicios prácticos, ejemplos del mundo real y orientación experta sobre cómo aprovechar el poder de los Componentes del Servidor en tus propios proyectos.
A lo largo de la masterclass, cubriremos temas esenciales, incluyendo:- Entender las diferencias entre los Componentes del Servidor y del Cliente- Implementar Componentes del Servidor para optimizar la obtención de datos y reducir el tamaño del paquete JavaScript- Integrar Componentes del Servidor y del Cliente para una experiencia de usuario fluida- Estrategias para pasar datos efectivamente entre componentes y gestionar el estado- Consejos y mejores prácticas para maximizar los beneficios de rendimiento de los Componentes del Servidor React
0 a Auth en una Hora Usando NodeJS SDK
Node Congress 2023Node Congress 2023
63 min
0 a Auth en una Hora Usando NodeJS SDK
WorkshopFree
Asaf Shen
Asaf Shen
La autenticación sin contraseña puede parecer compleja, pero es fácil de agregar a cualquier aplicación utilizando la herramienta adecuada.
Mejoraremos una aplicación JS de pila completa (backend de Node.JS + frontend de React) para autenticar usuarios con OAuth (inicio de sesión social) y contraseñas de un solo uso (correo electrónico), incluyendo:- Autenticación de usuario - Administrar interacciones de usuario, devolver JWT de sesión / actualización- Gestión y validación de sesiones - Almacenar la sesión para solicitudes de cliente posteriores, validar / actualizar sesiones
Al final del masterclass, también tocaremos otro enfoque para la autenticación de código utilizando Flujos Descope en el frontend (flujos de arrastrar y soltar), manteniendo solo la validación de sesión en el backend. Con esto, también mostraremos lo fácil que es habilitar la biometría y otros métodos de autenticación sin contraseña.
Tabla de contenidos- Una breve introducción a los conceptos básicos de autenticación- Codificación- Por qué importa la autenticación sin contraseña
Requisitos previos- IDE de tu elección- Node 18 o superior
Búsqueda de texto completo basada en JavaScript con Orama en todas partes
Node Congress 2023Node Congress 2023
49 min
Búsqueda de texto completo basada en JavaScript con Orama en todas partes
Workshop
Michele Riva
Michele Riva
En este masterclass, veremos cómo adoptar Orama, un potente motor de búsqueda de texto completo escrito completamente en JavaScript, para hacer que la búsqueda esté disponible donde sea que se ejecute JavaScript. Aprenderemos cuándo, cómo y por qué sería una gran idea implementarlo en una función sin servidor, y cuándo sería mejor mantenerlo directamente en el navegador. Olvídate de las APIs, configuraciones complejas, etc.: Orama facilitará la integración de la búsqueda en proyectos de cualquier escala.