Saltar al contenido

Lección 10 de 16 · Lectura y práctica

Optimizar Carga y Rendimiento con Lazy Loading

Concepto claveEl Lazy Loading en micro-frontends con Module Federation es una estrategia de optimizacion que carga componentes o modulos solo cuando son necesarios, en lugar de cargar todo al inicio. Imagina una biblioteca.

Del concepto a la práctica

Taller de esta lección

Lazy loading debe relacionarse con una decisión de navegación: un módulo que aparece solo al abrir Reportes no necesita formar parte de la carga inicial. El beneficio se pierde si el host importa el remoto de manera estática o precarga todas las rutas.

Ejemplo resuelto

El dashboard muestra Inicio y deja Reportes detrás de un botón. La importación de reports/ReportPage ocurre al activar el botón. Mientras llega, aparece Cargando reportes; si falla, aparece un aviso con reintento. Inicio no solicita ese recurso.

Pruébalo

  1. Mide las solicitudes con la ruta Reportes sin visitar.

  2. Activa la ruta y registra cuándo comienza la solicitud.

  3. Simula una respuesta lenta y observa el fallback.

  4. Simula un fallo y verifica que el shell siga utilizable. Error frecuente: añadir un lazy loading visual mientras el módulo ya fue importado al inicio. Corrección: revisa el grafo de imports y conserva la importación dinámica en el punto de navegación.

Comprueba tu resultado

Con Inicio visitado y Reportes cerrado, el resultado esperado es cero solicitudes de reports en la lista de recursos. Al abrirlo debe aparecer exactamente una solicitud inicial, un estado de carga y finalmente el contenido; ante fallo, el botón de reintento debe permanecer disponible.

Navegador, API y base de datos conectados por solicitudes, consultas y respuestas en sentidos opuestos.
CursaloMapa de práctica
Del navegador a los datos

El navegador envía una solicitud a la API. El servidor valida la operación y consulta los datos; después devuelve una respuesta que el navegador puede mostrar. La base de datos se comunica con el servidor y no directamente con el navegador.

Ver la infografía en tamaño completo ↗

Concepto clave

El Lazy Loading en micro-frontends con Module Federation es una estrategia de optimizacion que carga componentes o modulos solo cuando son necesarios, en lugar de cargar todo al inicio. Imagina una biblioteca gigante donde, en lugar de llevar todos los libros a tu mesa de una vez, un bibliotecario te trae solo el libro que necesitas en ese momento, reduciendo el esfuerzo inicial y mejorando la velocidad de acceso. En arquitecturas distribuidas, esto es crucial porque cada micro-frontend puede ser desarrollado y desplegado independientemente, y el lazy loading permite que la aplicacion principal cargue solo los fragmentos requeridos por el usuario, minimizando el tiempo de carga inicial y el uso de recursos.

En el contexto de Module Federation de Webpack, el lazy loading se implementa mediante importaciones dinamicas que cargan remotes (micro-frontends remotos) bajo demanda. Esto no solo optimiza el rendimiento al reducir el bundle inicial, sino que tambien facilita la escalabilidad, ya que nuevos equipos pueden agregar sus micro-frontends sin afectar el core de la aplicacion. Para un Frontend Architect, dominar esta tecnica es esencial para disenar sistemas que sean rapidos, mantenibles y capaces de crecer con multiples equipos.

Como funciona en la practica

En la practica, el lazy loading con Module Federation implica configurar Webpack para cargar remotes de forma diferida. Primero, defines los remotes en tu configuracion de Webpack, especificando la URL del módulo remoto. Luego, en tu codigo de aplicacion, usas importaciones dinamicas (como import()) para cargar estos remotes solo cuando se necesitan, por ejemplo, al navegar a una ruta especifica o al interactuar con un componente. Webpack maneja la carga asincrona, descargando el modulo desde el servidor remoto y cacheandolo para futuras solicitudes.

Paso a paso: 1) Configura el plugin Module Federation en Webpack para exponer y consumir remotes. 2) En tu aplicacion host, define rutas o condiciones que activan la carga de un remote. 3) Usa funciones como React.lazy() (si usas React) combinadas con importaciones dinamicas para envolver el modulo remoto. 4) Maneja estados de carga y errores para mejorar la experiencia del usuario. Esto permite que, por ejemplo, un dashboard financiero cargue el modulo de graficos solo cuando el usuario hace clic en la seccion correspondiente, evitando cargar codigo innecesario al inicio.

Codigo en accion

Aqui hay un ejemplo funcional que muestra como implementar lazy loading con Module Federation en una aplicacion React. Primero, la configuracion de Webpack para el host (aplicacion principal):

// webpack.config.js del host
const ModuleFederationPlugin = require("webpack/lib/container/ModuleFederationPlugin");

module.exports = {
  // otras configuraciones...
  plugins: [
    new ModuleFederationPlugin({
      name: "host",
      remotes: {
        mfDashboard: "mfDashboard@http://localhost:3001/remoteEntry.js",
        mfAnalytics: "mfAnalytics@http://localhost:3002/remoteEntry.js"
      },
      shared: ["react", "react-dom"]
    })
  ]
};

Ahora, el codigo en el host que usa lazy loading para cargar un micro-frontend remoto bajo demanda:

// App.js en el host
import React, { Suspense, lazy } from 'react';

// Carga perezosa del módulo remoto mfDashboard
const DashboardMF = lazy(() => import("mfDashboard/Dashboard"));

function App() {
  const [showDashboard, setShowDashboard] = React.useState(false);

  return (
    

Aplicacion Principal

{showDashboard && ( Cargando dashboard...
}> )} ); } export default App;

Este ejemplo muestra como el modulo mfDashboard se carga solo cuando el usuario hace clic en el boton, mejorando el rendimiento inicial.

Errores comunes

  • No manejar estados de carga o error: Olvidar usar Suspense o componentes de error puede llevar a una mala experiencia de usuario. Siempre incluye fallbacks y manejo de errores en importaciones dinamicas.
  • Configuracion incorrecta de remotes: Especificar URLs erroneas o versiones incompatibles en la configuracion de Module Federation puede causar fallos en la carga. Verifica las URLs y asegura que los remotes esten accesibles.
  • Carga excesiva de modulos: Implementar lazy loading en componentes muy pequenos o frecuentemente usados puede agregar overhead innecesario. Evalua que modulos justifican la carga diferida basandose en su tamano y frecuencia de uso.
  • Ignorar la cache del navegador: No configurar estrategias de cache para modulos cargados perezosamente puede resultar en cargas repetidas. Usa Service Workers o configuraciones de Webpack para optimizar el caching.
  • Falta de monitoreo de rendimiento: No medir el impacto del lazy loading en metricas como LCP o FID puede llevar a optimizaciones inefectivas. Utiliza herramientas como Lighthouse o Web Vitals para evaluar mejoras.

Checklist de dominio

  1. Configurar Module Federation en Webpack para definir remotes y shared dependencies correctamente.
  2. Implementar importaciones dinamicas con import() para cargar remotes bajo demanda en el codigo de aplicacion.
  3. Usar Suspense y manejo de errores para mejorar la experiencia de usuario durante la carga perezosa.
  4. Optimizar la estrategia de caching para modulos cargados perezosamente, reduciendo solicitudes repetidas.
  5. Medir el rendimiento antes y despues de aplicar lazy loading usando herramientas como Webpack Bundle Analyzer o Lighthouse.
  6. Diseñar la arquitectura para que nuevos micro-frontends puedan agregarse sin modificar el core, facilitando la escalabilidad.
  7. Documentar las decisiones de lazy loading y compartir mejores practicas con el equipo para mantener consistencia.

Implementar Lazy Loading en un Micro-frontend Existente

En este ejercicio, refactorizaras una aplicacion que carga todos sus micro-frontends al inicio para usar lazy loading con Module Federation. Sigue estos pasos:

  1. Clona el repositorio de ejemplo (proporciona un enlace simulado: https://github.com/ejemplo/mf-lazy-demo) que contiene una aplicacion host y dos micro-frontends remotos (dashboard y analytics).
  2. Revisa la configuracion actual de Webpack en el host: todos los remotes se cargan estaticamente. Modifica el archivo webpack.config.js para definir los remotes, pero no cargarlos inmediatamente.
  3. En el archivo principal de la aplicacion (e.g., App.js), identifica los imports estaticos de los micro-frontends. Reemplazalos con importaciones dinamicas usando React.lazy() y import().
  4. Agrega un componente Suspense con un fallback (e.g., un spinner) para manejar la carga perezosa, y un manejo de errores con un componente de error boundary.
  5. Configura rutas en tu aplicacion (usando React Router si esta disponible) para que cada micro-frontend se cargue solo cuando se navegue a su ruta correspondiente (e.g., /dashboard carga el modulo dashboard).
  6. Ejecuta la aplicacion y verifica en las herramientas de desarrollo del navegador que los modulos se cargan bajo demanda, no al inicio. Usa la pestaña Network para observar las solicitudes.
  7. Mide el rendimiento: ejecuta Lighthouse antes y despues de la refactorizacion, comparando metricas como First Contentful Paint y Bundle Size.
Pistas
  • Asegurate de que los remotes esten correctamente expuestos en sus propios proyectos con Module Federation.
  • Usa la funcion lazy() de React combinada con una funcion que retorne import('remote/component').
  • Prueba la carga perezosa desactivando la cache del navegador para ver las solicitudes en tiempo real.

Evalua tu comprension

Completa el quiz interactivo de arriba para ganar XP.

Sigue con Arquitectura de Micro-frontends con Module Federation de Webpack

Esta lección forma parte de un curso de Cursalo. Revisa su programa y elige entre la compra individual o el acceso a toda la escuela.

Si ya tenías acceso a este curso, entra con tu cuenta: tus derechos y tu progreso se conservan. No necesitas comprarlo de nuevo.

01 / ELEGIR UNA RUTA

El próximo paso

Aprende IA mientras construyes algo que sí necesitas.

Empieza por el curso inicial o explora el catálogo para encontrar una práctica alineada con tu trabajo.