Como, por ejemplo, para el Boolean, algo que se estaba montando dentro de otro componente o comenzamos a tener ese tipo de problemas, ¿verdad? Además, algo que nos sucedió es que dado que esa aplicación tenía una configuración muy compleja para el backend y realmente, realmente complicadas necesidades para que se iniciara, no pudimos realmente usarlas ambas al mismo tiempo, ¿verdad? Así que lo que terminamos haciendo fue crear este modelo federado que se usaba como respaldo. Tenía una funcionalidad realmente básica que nos ayudaba a ver cómo funcionaría nuestra aplicación como un todo, quiero decir, completada con la información obtenida de la otra aplicación, ¿verdad? Pero de nuevo, era bastante como si realmente no supiéramos cómo funcionaría esa aplicación con la del host. Así que ahí es donde este concepto de sitios completamente federados podría haber sido útil para nosotros en ese momento, porque esto crea una especie de dependencia circular entre aplicaciones para que la del host no solo se convierta en un consumidor sino también en un productor. Así que como puedes ver aquí, por ejemplo, en la aplicación de teatro, la aplicación de inicio, se va a exponer a sí misma, ¿verdad? Y cuando vamos a la aplicación, también podemos consumir la aplicación del host y podemos crear un segundo script para poder iniciar nuestra aplicación con la del host, ¿verdad? Así que eso nos da un ciclo de desarrollo realmente rápido y será bastante fácil ver cómo interactúan ambas cuando, por ejemplo, necesitan, tienen algo acoplado o algún estado o algo que realmente necesita interactuar entre sí. Será más fácil de probar e incluso fácil de probar o usar para pruebas de extremo a extremo.
Además, quería hablar sobre algunas cosas, por ejemplo, el rendimiento. Y creo que es importante tener en cuenta varios factores que tenemos cuando importamos componentes de un modelo federado. Por ejemplo, el primero es que es realmente importante usar importaciones dinámicas para reducir el tamaño inicial del paquete y también poder importar y cargar estos modelos solo cuando se necesiten, ¿verdad? También, las aplicaciones waterstrap para darle a webpack la oportunidad de procesar el resto de las importaciones antes de ejecutar la aplicación y evitar condiciones de carrera. El más importante creo que es compartir dependencias porque no especificar paquetes compartidos puede resultar en duplicaciones y ralentizar la experiencia. Y no definir versiones entre bibliotecas compartidas también puede causar errores entre las aplicaciones. Y si hay bibliotecas con estado interno, tenemos que asegurarnos de hacerlas como singletons para asegurar que tengamos solo una instancia en ejecución, ¿verdad? Y ahí es donde también entra la depuración porque cuando comienzas a tener problemas de rendimiento debido a dependencias compartidas, podemos usar herramientas como Medusa donde podemos tener una mejor comprensión de cómo están conectados nuestros microfrontends y especialmente qué dependencias estamos usando y cuáles necesitan su atención. Por ejemplo, aquí nos está diciendo que una dependencia específica puede ser declarada como compartida. Y también algo realmente genial que se introdujo en Model Federation 2.0 es que las herramientas de Chrome ahora, para las herramientas de Chrome ahora tenemos un plugin, un plugin de Model Federation que podemos instalar y ver cómo está conectada nuestra aplicación y cómo se están consumiendo nuestros modelos. Así que eso es bastante genial para depurar porque si algo falla, también puedes ver qué otras aplicaciones pueden verse afectadas, ¿verdad?
También para el estilo, lo que hicimos para mantener nuestra aplicación coherente es usar el mismo kit de UI y eso nos permite reutilizar componentes construidos, evitando la personalización, ¿verdad? Tanto como sea posible. Así que si necesitábamos cambiar algo, lo cambiamos en la biblioteca del kit de UI. De esa manera evitamos presentar al usuario algo como Comic Sans en una página y Times New Roman en la otra. ¿Verdad? También, el enrutamiento es realmente importante tenerlo en cuenta. En nuestra aplicación, lo que hicimos fue usar el concepto de una aplicación shell. Que en realidad es prácticamente el host. Y el único propósito de ella es orquestar el microfront, ¿verdad? Así que el enrutamiento solo funciona dentro de la aplicación del host. Cuando realmente podemos importar los modelos con carga diferida, renderizarlos con lo necesario y básicamente manejar el enrutamiento como lo necesitábamos. Otras opciones que puedes usar también pueden ser como frameworks, por ejemplo, Single SPA. Single SPA te permite montar y desmontar componentes para mejorar el rendimiento y cargarlos en lugares específicos o rutas específicas, ¿verdad? ¿Verdad? Finalmente, la gestión de etapas. Tuvimos aplicaciones realmente estrechamente acopladas. Así que la gestión de etapas se usó básicamente desde la aplicación productora porque realmente necesitábamos obtener el estado de allí. Usamos hooks, lo que lo hizo un poco más fácil de hacer. Pero diría que si realmente quieres ir hasta el final, y si probablemente hubiéramos estado usando modelos, no solo por el patrón estrangulado, sino por diferentes casos de uso, también hay cosas como, por ejemplo, podríamos haber usado como probe drilling, pool solve, parámetros de consulta, almacenamiento local, cualquier cosa que pudiera haber evitado acoplar básicamente las aplicaciones.
Comments