Concepto clave
En arquitecturas de micro-frontends con Module Federation, el dashboard completo representa el punto de integración donde múltiples equipos independientes despliegan sus módulos. Piensa en esto como un centro comercial donde cada tienda (micro-frontend) opera de forma autónoma, pero comparte espacios comunes como el estacionamiento (host) y cumple con reglas de seguridad (contractos). La clave está en definir contratos claros entre el host y los remotos, asegurando que la integración sea escalable y no genere acoplamiento entre equipos.
La escalabilidad aquí no solo se refiere a manejar más tráfico, sino a permitir que nuevos equipos se unan al proyecto sin modificar el core. Imagina agregar una nueva sección al dashboard: si la arquitectura está bien diseñada, solo necesitas configurar el remoto y actualizar el routing, sin tocar el código de otros equipos. Esto reduce los cuellos de botella en integración y acelera el time-to-market.
Cómo funciona en la práctica
Vamos a construir un dashboard que integra tres micro-frontends: Analytics (equipo A), UserManagement (equipo B) y Reporting (equipo C). Cada uno vive en su propio repositorio y se despliega independientemente. El host (dashboard) usa Module Federation para cargarlos dinámicamente.
- Configura el host en webpack.config.js: define los remotos y expone componentes compartidos como React y ReactDOM.
- Cada remoto configura su webpack para exponer sus módulos (ej: AnalyticsChart).
- En el host, usa React.lazy y Suspense para cargar los módulos remotos solo cuando se necesiten.
- Implementa un sistema de routing basado en rutas que mapea a cada micro-frontend.
Antes: un monolitico donde todos los equipos commiteaban al mismo repo, causando conflictos frecuentes. Despues: cada equipo tiene autonomia, y el host orquesta la carga bajo demanda.
Codigo en accion
Configuración del host (dashboard) en webpack.config.js:
// webpack.config.js del host
const ModuleFederationPlugin = require("webpack/lib/container/ModuleFederationPlugin");
module.exports = {
plugins: [
new ModuleFederationPlugin({
name: "dashboard",
remotes: {
analytics: "analytics@http://localhost:3001/remoteEntry.js",
userManagement: "userManagement@http://localhost:3002/remoteEntry.js",
reporting: "reporting@http://localhost:3003/remoteEntry.js"
},
shared: {
react: { singleton: true, eager: true },
"react-dom": { singleton: true, eager: true }
}
})
]
};Carga dinámica de un micro-frontend en el host:
// DashboardApp.jsx
import React, { Suspense } from 'react';
const AnalyticsChart = React.lazy(() => import("analytics/Chart"));
function Dashboard() {
return (
Dashboard Principal
Cargando Analytics... }>