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.
Comments