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 importaciones y un campo de exportaciones, y el campo de importaciones define un número de claves que podrías llamar nombres de variables, al igual que las exportaciones, definen un número de claves, la diferencia es que las importaciones utilizan el especificador de URL para el hijo dado que queremos importar, y las exportaciones apuntan a un fragmento de código específico que 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 diré cómo funciona en JS común, porque el contraste es importante, especialmente para discusiones posteriores. Digamos que este es, vamos a fingir que este es el caso típico para JS común. Escribes un fragmento de código y tienes un bloque de JavaScript que está haciendo algún tipo de trabajo, luego encuentras una declaración require. En este caso, el trabajo que estamos haciendo es crear una ruta dinámica, y luego requerimos esa ruta y la cargamos. El navegador ya ha realizado el paso de cargar este script, lo ha analizado y ahora lo está ejecutando, por lo que pausa la ejecución y continúa con 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 volvemos a nuestro módulo anterior y continuamos ejecutando.
Entonces, ¿cuál es el problema con este diseño? ¿Por qué no lo implementamos? El problema es que notarás que no hay ninguna sintaxis de promesa aquí en ninguna parte, y por supuesto, el common.js fue antes del await de 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. Te daré 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, lleva como un segundo acceder a la memoria principal, estás mirando alrededor de seis segundos o algo así. Si quieres obtener la memoria principal, que es la RAM, si quieres obtener algo de la red en esta escala de tiempo, estás mirando alrededor de cuatro años. Esto es una parte muy significativa del tiempo que pasarás en la red. Además, hay una invariante importante de la plataforma web, se llama ejecución hasta la finalización. ¿Qué significa ejecución hasta la finalización? Si has estudiado sistemas operativos, es posible que estés familiarizado. Pero si no lo has hecho, ejecución hasta la finalización significa que una tarea dada seguirá ejecutándose hasta que voluntariamente ceda el 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 seguirá bloqueado. 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. Por lo tanto, 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 en JS común se carga, analiza y evalúa el módulo todo en un solo paso. En ES6, lo hacemos 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 en el gráfico, así que soy yo, estos son mis vecinos, estas son mis conexiones entrantes, estas son mis conexiones salientes. Una vez que tenemos esto, también tenemos las importaciones, las otras URL que necesitamos cargar, así que podemos seguir adelante y cargar otro script. A medida que cargamos ese otro script, podemos hacer el mismo proceso aquí, que es primero analizar y luego construir ese registro de módulo.
Comments