main content
< Volver a blog sobre aplicaciones móviles

Microfrontends y Module Federation a medida

Microfrontends con federación de módulos: cómo escalar tus equipos sin convertir tu web en un caos

Imagina que tu aplicación web es un edificio de oficinas. Al principio cabíais todos en una sola planta diáfana: un equipo, un repositorio, un despliegue. Pero el negocio crece, contratáis gente y, de repente, cuarenta personas trabajan en la misma planta abierta. Cada vez que alguien mueve una mesa, los demás tropiezan. Cada reforma exige cerrar la oficina entera. Eso, en términos de software, es un frontend monolítico que ha dejado de escalar.

Los microfrontends son la respuesta arquitectónica a ese problema: dividir el edificio en plantas independientes, cada una con su propio equipo, su propia llave y su propio calendario de obras. Y la federación de módulos (Module Federation) es el ascensor y los pasillos comunes que permiten que todas esas plantas sigan funcionando como un mismo edificio para quien lo visita.

Vamos a ver cómo se diseña esto de verdad, sin humo, y —lo más importante— cuándo no deberías ni planteártelo.

Qué problema resuelven realmente los microfrontends

El motivo para adoptar microfrontends casi nunca es técnico. Es organizativo.

Cuando un solo equipo mantiene un frontend, todo va razonablemente bien hasta cierto tamaño. A partir de ahí empiezan los síntomas: las ramas de Git se pisan, una pull request tarda días en mezclarse, un despliegue del módulo de facturación obliga a esperar a que el equipo de catálogo termine su feature, y nadie se atreve a tocar cierto componente "porque lo usa todo el mundo".

Los microfrontends atacan ese cuello de botella aplicando a la interfaz la misma idea que los microservicios aplicaron al backend: dividir la aplicación en piezas con dueño claro, cada una desplegable de forma autónoma. El equipo de Búsqueda despliega cuando quiere, el equipo de Checkout despliega cuando quiere, y ninguno bloquea al otro.

La regla de oro la dio Conway hace décadas: la arquitectura de tu sistema acabará pareciéndose a la estructura de tu organización. Los microfrontends invierten la frase a tu favor: diseña los límites del software para que encajen con los límites de tus equipos.

Dónde encaja Module Federation

Aquí es donde entra la pieza técnica clave. Module Federation —introducida en Webpack 5 y hoy disponible también para Vite a través de plugins— permite que una aplicación cargue, en tiempo de ejecución, código que vive y se compila en otra aplicación distinta.

La analogía: en lugar de que cada planta del edificio fabrique sus propios muebles desde cero (duplicando trabajo) o de que todos compartan un único almacén central que hay que cerrar para reponer (el monolito), cada planta expone un catálogo de lo que ofrece y las demás piden lo que necesitan en el momento, sin parar la actividad.

En la práctica esto significa dos roles:

  • Host (anfitrión): la aplicación contenedora que orquesta y monta las piezas. Suele ser el "shell" que contiene la navegación, la autenticación y el layout general.
  • Remote (remoto): cada microfrontend que expone uno o varios módulos —un componente, una página entera, una función— para que el host u otros remotos los consuman.

Lo potente es que el host no necesita conocer el código del remoto en tiempo de compilación. Solo necesita saber dónde encontrarlo (una URL a un fichero manifiesto, normalmente remoteEntry.js). El equipo de Checkout puede reescribir su microfrontend entero, desplegarlo, y el host lo servirá actualizado en la siguiente carga sin que nadie recompile el contenedor.

Dependencias compartidas: el detalle que lo hace viable

Si cada remoto cargara su propia copia de React, el navegador del usuario descargaría el mismo framework cinco veces. Module Federation resuelve esto con las shared dependencies: declaras que React, el sistema de diseño o la librería de estado son compartidos, y se cargan una sola vez, negociando la versión entre todas las piezas.

Este mecanismo es, a la vez, la mayor virtud y el mayor riesgo de la arquitectura. Si dos equipos necesitan versiones incompatibles de la misma librería, la negociación falla en silencio o duplica la carga. Por eso el versionado no es un detalle administrativo: es una decisión de arquitectura.

Los contratos entre módulos: el verdadero trabajo de diseño

Montar dos remotos en un host con Module Federation se hace en una tarde. Lo difícil —y lo que separa un proyecto sano de uno que implosiona a los seis meses— son los contratos entre módulos.

Piensa en cada microfrontend como un país con embajadas. Lo que ocurre dentro de sus fronteras (qué framework usa internamente, cómo gestiona su estado, su CSS) es asunto suyo. Pero todo lo que cruza la frontera —las props que recibe un componente expuesto, los eventos que emite, los datos que comparte— debe estar explícitamente acordado y versionado.

Algunas reglas que recomiendo grabar a fuego:

  • Define interfaces tipadas y estables. Lo que un remoto expone es una API pública. Si expones un componente <CarritoResumen> con tres props, esas tres props son un contrato. Cambiarlas sin avisar rompe a quien las consume, igual que cambiar una API REST.
  • Comunica por eventos, no por estado compartido mutable. La tentación de tener un store global que todos tocan reproduce exactamente el acoplamiento del monolito que querías evitar. Prefiere que los microfrontends se comuniquen por eventos o por un contrato de datos bien definido en el host.
  • Versiona los contratos, no solo el código. Aplica versionado semántico a lo que expones. Un cambio que rompe el contrato es una major; el consumidor debe poder seguir en la versión anterior hasta que se adapte.

Sin esta disciplina, los microfrontends no eliminan el acoplamiento: simplemente lo esconden detrás de una carga dinámica, lo que es bastante peor, porque ahora el fallo aparece en producción y no en tiempo de compilación.

Cómo trazar los límites entre equipos

La pregunta práctica es: ¿por dónde corto? El error clásico es cortar por capa técnica ("el equipo de componentes", "el equipo de la API"), lo que obliga a coordinar a cinco equipos para sacar una sola funcionalidad.

La división que funciona es por dominio de negocio vertical. Cada microfrontend cubre una capacidad completa de principio a fin: Búsqueda, Ficha de producto, Carrito, Pago, Área de cliente. Cada uno de esos equipos tiene todo lo necesario para entregar valor sin pedir permiso a nadie.

Un buen test: si para lanzar una mejora de "Pago" necesitas tocar tres microfrontends distintos, tus límites están mal trazados. Las fronteras deberían hacer que los cambios más frecuentes caigan dentro de un solo equipo.

Ventajas e inconvenientes, sin marketing

Conviene ser honesto, porque esta arquitectura tiene un coste real.

A favor:

  • Despliegues independientes: cada equipo libera a su ritmo, sin trenes de release compartidos.
  • Autonomía tecnológica acotada: un equipo puede modernizar su pieza sin reescribir toda la aplicación.
  • Escalado organizativo: puedes sumar equipos sin que el rendimiento de cada uno se degrade por la coordinación.
  • Aislamiento de fallos: un error en un remoto puede degradar una sección sin tumbar la aplicación entera, si lo diseñas con ese cuidado.

En contra:

  • Complejidad operativa: pasas de un despliegue a muchos, con su monitorización, sus versiones y sus integraciones que vigilar.
  • Riesgo de rendimiento: dependencias mal compartidas, descargas duplicadas y más peticiones de red.
  • Coherencia visual: mantener una experiencia uniforme exige un sistema de diseño compartido y gobernado con mano firme.
  • Depuración distribuida: cuando algo falla, el problema puede estar en la frontera entre dos piezas que compilan equipos distintos.

Cuándo NO usar microfrontends

Esto es lo más importante del artículo. Los microfrontends son una solución a un problema de escala de equipos, no una mejora universal.

No los uses si:

  • Tienes uno o dos equipos pequeños. Si cinco o diez personas mantienen la aplicación, el monolito modular bien organizado te dará casi todas las ventajas con una fracción de la complejidad. Estarías pagando el coste de coordinación de una arquitectura distribuida sin tener el problema que justifica ese coste.
  • Tu aplicación es pequeña o su futuro es incierto. Introducir esta arquitectura "por si acaso crecemos" es optimización prematura del peor tipo.
  • No tienes madurez de DevOps. Si todavía os cuesta tener CI/CD fiable para un solo despliegue, multiplicarlos por seis no os va a ir bien.
  • El equipo no está convencido de la disciplina de contratos. Sin esa cultura, acabarás con un monolito distribuido: toda la complejidad de lo distribuido y nada del desacoplamiento.

Una heurística sencilla: si no puedes nombrar al menos tres o cuatro equipos con dueños y responsabilidades distintas que hoy se están pisando, todavía no necesitas microfrontends.

Llevarlo a una aplicación a medida

En un proyecto a medida, la gran ventaja es que diseñas estas fronteras desde el conocimiento real de tu negocio, no forzándolas sobre un producto enlatado. La arquitectura se moldea a tus dominios y a la forma de tus equipos, presentes y futuros.

El camino sensato casi nunca es empezar con quince microfrontends. Es arrancar con un monolito modular bien estructurado, con límites internos claros, y extraer piezas a microfrontends solo cuando el dolor de coordinación lo justifique. Diseña pensando en esa evolución: si tus módulos internos ya respetan contratos limpios, el día que necesites federarlos será una migración, no una refundación.

Si estás en ese punto en el que tus equipos empiezan a tropezar entre sí y te preguntas si ha llegado el momento de dar el salto, podemos ayudarte a tomar esa decisión con cabeza y a diseñar la arquitectura que tu producto necesita, ni más ni menos compleja de lo debido.

Conclusión

Los microfrontends con federación de módulos son una herramienta excelente para un problema muy concreto: escalar el número de equipos que trabajan sobre una misma aplicación sin que se bloqueen entre sí. Module Federation aporta el mecanismo técnico —cargar código de otros en tiempo de ejecución, compartiendo dependencias—, pero el verdadero trabajo está en trazar bien los límites, definir contratos estables y versionarlos con disciplina.

Usados a tiempo, te permiten crecer sin frenarte. Usados antes de tiempo, te cargan con la complejidad de lo distribuido sin ninguna de sus ventajas. La maestría, como casi siempre en arquitectura, está en saber distinguir ambos momentos.

Contacta con nosotros
Fila 1