0Pricing
React Academy · Lección

Estado compartido y routing entre MFEs

Comparta un event bus global o un contexto entre micro-frontends y coordine el routing del lado del cliente.

Estado compartido y routing entre MFEs es una lección gratuita de React Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de React Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de React Academy incluye 4 lecciones en total.

El desafío de compartir el estado

Los micro-frontends de distintos bundles no pueden compartir directamente el estado ni el contexto de React. Necesitan estrategias alternativas: eventos personalizados, stores compartidos, la URL o un bus de eventos pub/sub.

Eventos personalizados del navegador

Utilice la API CustomEvent del navegador como un bus de eventos sencillo entre micro-frontends, sin acoplarlos entre sí.

// Remote emits:
window.dispatchEvent(new CustomEvent('cart:add', { detail: { productId: '123' } }));

// Host listens:
useEffect(() => {
  const handler = (e: CustomEvent) => addToCart(e.detail.productId);
  window.addEventListener('cart:add', handler);
  return () => window.removeEventListener('cart:add', handler);
}, []);

Biblioteca de bus de eventos compartido

Una pequeña biblioteca pub/sub compartida (mediante Module Federation o un singleton cargado desde una URL) proporciona un bus de eventos con tipos accesible para todos los MFE.

// Singleton event bus
const bus = {
  listeners: new Map<string, Function[]>(),
  emit(event: string, data: unknown) {
    this.listeners.get(event)?.forEach(fn => fn(data));
  },
  on(event: string, fn: Function) {
    if (!this.listeners.has(event)) this.listeners.set(event, []);
    this.listeners.get(event)!.push(fn);
    return () => this.off(event, fn);
  },
  off(event: string, fn: Function) {
    const list = this.listeners.get(event) || [];
    this.listeners.set(event, list.filter(f => f !== fn));
  },
};
export default bus;

La URL como estado compartido

La URL (ruta y parámetros de consulta) se comparte de forma natural entre todos los MFE. Utilícela para estados de navegación como el elemento seleccionado, la pestaña activa o los valores de los filtros.

// Remote reads from URL:
const params = new URLSearchParams(window.location.search);
const productId = params.get('product');

// Remote navigates via history API (or exposes a navigate callback from host):
window.history.pushState({}, '', '/products?product=456');

Arquitectura de enrutamiento

Normalmente, la aplicación shell/host es propietaria del enrutador de nivel superior. Los micro-frontends remotos reciben la ruta actual y un callback navigate como props.

// Host passes routing control to remote:
<RemoteProductsApp
  basepath="/products"
  navigate={(path) => router.push(path)}
/>

// Remote uses basepath for its internal router:
<BrowserRouter basename={basepath}>
  <Routes>...</Routes>
</BrowserRouter>

React Router con Module Federation

Cada MFE puede ejecutar su propio React Router, limitado a su basepath. El enrutador del host gestiona la navegación de nivel superior y cada remote gestiona de forma independiente la subnavegación.

// Remote App component:
export function ProductsApp({ basepath = '/products' }) {
  return (
    <BrowserRouter basename={basepath}>
      <Routes>
        <Route path="/" element={<ProductList />} />
        <Route path="/:id" element={<ProductDetail />} />
      </Routes>
    </BrowserRouter>
  );
}

Estado de autenticación compartido

El estado de autenticación (usuario y token) suele pertenecer a la shell, que lo transmite a los remotes mediante props o lo expone a través de un store singleton compartido.

// Host provides auth via props:
<RemoteCheckout
  userId={currentUser.id}
  token={accessToken}
  onLogout={handleLogout}
/>

Zustand como store compartido

Al compartir un store de Zustand mediante Module Federation (como singleton), todos los MFE leen de la misma instancia del store en memoria.

// shared/store.ts (exposed as singleton)
import { create } from 'zustand';
export const useCartStore = create(set => ({
  items: [],
  addItem: (item) => set(state => ({ items: [...state.items, item] })),
}));

// Configured as singleton in MF shared config

Antipatrones de comunicación entre MFE

Evite las cadenas de callbacks profundamente anidadas, compartir el estado interno de los componentes o acoplarse estrechamente a las API internas de otro MFE. Limite la comunicación a eventos de alto nivel y contratos públicos.

Pruebas de interacciones entre MFE

Pruebe los contratos de eventos (nombres de eventos y estructuras de datos) por separado de la interfaz de usuario. Utilice pruebas de contrato para verificar que el productor y el consumidor coinciden en el esquema del evento.

Comprobación rápida

¿Cuál es la forma más sencilla de compartir el estado de navegación o de los filtros entre varios micro-frontends sin acoplarlos?

Resumen

Comparta el estado entre los MFE mediante eventos personalizados, un bus de eventos singleton, la URL o stores compartidos (Zustand/singleton). La shell es propietaria del enrutador de nivel superior y transmite basepath y navigate a los remotes. Mantenga los contratos entre MFE generales y con tipos bien definidos.

Preguntas frecuentes

¿La lección «Estado compartido y routing entre MFEs» es gratis?

Sí — el texto completo de «Estado compartido y routing entre MFEs» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de React Academy, actualiza a CoddyKit PRO. El curso de React Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Estado compartido y routing entre MFEs»?

Comparta un event bus global o un contexto entre micro-frontends y coordine el routing del lado del cliente. Practicas React Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar React Academy?

No se requiere experiencia previa. React Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.

¿Cuánto tiempo toma la lección «Estado compartido y routing entre MFEs»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de React Academy?

Sí. Cada lección de React Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Conceptos y compromisos de los micro-frontends
  2. Module Federation con Webpack 5
  3. Estado compartido y routing entre MFEs
  4. Despliegue independiente y pipelines de CI para MFEs
← Volver a React Academy