Y ahora, quería concluir con las dependencias. Como prometí, quería mostrarte cómo puedes cargar las dependencias de forma dinámica. ¿Tenemos alguna pregunta hasta ahora? ¿Con lo que acabamos de cubrir? Oportunidad. Lars. Entonces dijiste que tus dependencias están en DevDependencies, pero esparces las dependencias. En realidad, esparzo estas dependencias que son dependencias de Azure. En DevDependencies, verás que las tengo a nivel de espacio de trabajo, que es un Webpack, DevServer, y así sucesivamente. No quieres compartir estas porque se ejecutan en esta computadora, en el servidor, en CI. En el paquete, esto no se está... Miras en el nivel superior de los paquetes. Eso es lo que pensé también. De acuerdo. Nuevamente, la razón por la que estoy usando Lerna es, y lamento confundirte, pero estoy usando Lerna para que sea más fácil, para que tengas todo en un solo repositorio, para que no tengas que pensar en múltiples repositorios. En la vida real, no usaría Lerna para tu proyecto. Y la razón es bastante sencilla. A medida que tu aplicación crece, tu repositorio de .git va a ser enorme, y luego vas a crear PR, y va a haber conflictos de fusión. Y luego Lerna es bueno para compartir. Como microfinanzas, sí, quieres compartir un poco, pero también quieres tener un poco de propiedad. Y si todo está en un solo repositorio, todas las posibles variantes de bibliotecas de pruebas, ejecutores, scripts de CI y todas esas cosas, se vuelve confuso, ¿verdad? Porque quieres dar esa libertad, y si la libertad se ejerce en un espacio común, es confuso. Al igual que si tuvieras a 10 personas hablando 10 idiomas diferentes tratando de comunicarse, pero no pueden, ¿verdad? No es muy útil. Pero lo bueno aquí es para las características, usaría y prefiero, siempre sugiero usar repositorios Git dedicados por característica. Código compartido. El código que realmente quieres poner a disposición de todos los demás, la parte compartida. Entonces, donde tienes una lógica especial para comunicarte entre aplicaciones, o donde tienes una lógica especial para cargar traducciones, o cosas así. En algunos casos, incluso la autenticación, aunque eso también puede ser dinámico. Así que esos son o el seguimiento y etiquetado, ¿verdad? Esas pueden ser aplicaciones de características, pero también pueden ser bibliotecas, si no son funcionales, si los usuarios realmente interactúan con ellos. Realmente depende de cómo los proyectos y los equipos usen eso. He visto, por ejemplo, que el seguimiento es una aplicación de características, eso significa que soy una aplicación de características, soy totalmente agnóstica y hago mi cosa. Puedo exponer bibliotecas, otros pueden usarlas, o puedo hacer mi propia cosa, eso es una aplicación de características. O una biblioteca es, estoy destinada a que otros me usen y no estoy haciendo nada automáticamente. Mi propósito es que otros proyectos me usen, pero no tienen que hacerlo. Esa es la diferencia, por eso dije, técnicamente esto es fácil de entender, creo, espero. Los arquitectos y los arquitectos de soluciones pueden tener un poco de dificultad para poner las cosas en orden, especialmente por primera vez a medida que se construye esa experiencia, pero la mejora y el cambio principales, y sabemos cómo puede ser difícil el cambio, pueden estar a nivel organizativo. De acuerdo, dejaré de predicar sobre eso porque siempre hay una historia sobre todo lo que predicamos, y esto puede volverse realmente complicado. De acuerdo, vimos eso, y como dije, el siguiente paso es crear un cargador dinámico. Ahora, voy a hacer eso en el núcleo, así que tenemos remotos, simplemente voy a comentar esto. Estoy haciendo esto, para que tengamos algún tipo de historial, así que lo comenté, y probablemente necesitemos reiniciar el servidor para esto. De acuerdo, y obviamente, fallaría si estás intentando, así que esto es público, privado, bueno, público. Está probablemente va a fallar. No, va a fallar, porque no sabe cómo cargar a Hero. Así que trabajemos desde aquí, arreglemos esto. Entonces, la aplicación está usando estas dos bibliotecas. Sí, ya no puedo usar este nivel de importación si uso cargadores dinámicos, así que voy a recurrir a algo más. Voy a crear un nuevo componente, lo llamaré cargador. Lo tengo listo, chicos. No voy a escribirlo. Confíen en mí cuando digo que probablemente tiene un par de cientos de líneas de código. No, casi 100, pero esta es una versión simple. Y te lo voy a explicar para que sepas qué está sucediendo. En primer lugar, vamos a omitir esto, vamos a omitir este paso. Voy a hablar de eso más tarde. Entonces, ¿qué necesitamos hacer? Necesitamos crear un script, ¿verdad? Necesitamos crear un script. Debería ser síncrono. Y adjuntamos un escucha en la carga. Entonces, cuando se carga, decimos que estamos listos. Si hay un error, decimos, oh, hubo un error. Y eventualmente, cuando desmontamos, podemos eliminar la etiqueta de script, ¿verdad? Eso es simplemente trabajar con etiquetas de script. Vamos a usar esta función de cargador. Entonces, la función del cargador hace esto, utiliza este hook para importar la fuente. Y si estamos en desarrollo, ahora en el paso de compilación, este bloque en producción, este bloque se eliminaría porque Webpack va a saber estáticamente que el entorno es producción, así que puedo eliminar este código, eliminación de árbol. Pero estamos trabajando en desarrollo y vamos a ver la carga de la característica y un fallo al cargar la característica si falla, ¿verdad? Como ayuda. Utilizamos suspense y eso significa que cuando se carga, vamos a activar esta función que se comunica con la iteración del módulo. Así que eso es lo que dije que mencionaría más tarde. Esto realmente no está. No creo que lo encuentres en la documentación, pero puedes encontrar rastros de estos, puedes encontrar rastros de estos comandos o tal vez incluso funciones muy similares en varios ejemplos en línea, ¿verdad? Incluso creo que la federación de módulos, una organización de GitHub que es propiedad de Zack Jackson, creo que puede haber creado algo así también. De todos modos, todo el asunto es que llamamos a estas funciones especiales que solo están disponibles porque Webpack registró que nuestro código las necesita. No puedes llamar a esto para console, esto no está en el ámbito global. Webpack analiza tu código y dice, oh, necesitas Webpack en su compartición, este es un método especial. Así que decimos, está bien, voy a, nuevamente, en una compartición hay algo llamado scope. Siempre usamos el scope completo, pero también puedes crear scopes adicionales. No te lo he mostrado porque siento que eso en su mayoría no es necesario. El scope completo es suficiente. Pero si necesitas cargar módulos compartidos en diferentes espacios de nombres, también puedes hacerlo. Luego los espacios de nombres predeterminados, predeterminado obvio. Así que inicializamos esa característica a través de esta línea. Y luego decimos Windows code. Si recuerdas cuando dije, vamos a un paquete, lo siento. No paquete, me refería a la configuración de Webpack. Y lo llamamos hero, ¿verdad? Eso significa que va a haber un objeto llamado window.hero. Y así es como funciona. Así es como empaquetamos los módulos de JavaScript. Y eso también es configurable, si cambiamos cómo funciona esa biblioteca a través de la configuración, hay documentación para eso. Esto está definitivamente fuera del alcance de esta introducción. Pero podrías cambiar completamente cómo se empaquetan las características. Nuevamente, no voy a tocar eso, pero hasta ahora, solo para que sepas que obtenemos ese contenedor, ahora que es el runtime. Y luego inicializamos, ¿verdad? Los ámbitos de compartición de Webpack en el ámbito de compartición predeterminado, inicializamos ese contenedor, esa etiqueta de script que recibimos, llamamos al método init de ese script y lo fusionamos con ese espacio de nombres predeterminado. Entonces, eso es cuando dije, cada característica remota que cargas va a fusionar runtimes, va a fusionar registros de dependencias, va a fusionar la información que comparten a medida que se introducen. Y esto es esa fusión, inicialización, ¿verdad? Finalmente, obtenemos el módulo y lo devolvemos, es un método de fábrica.
Comments