Microfrontends con Single-SPA
Clase 1: Fundamentos y Setup
Objetivos de Hoy
- Comprender qué son los microfrontends y por qué son importantes
- Conocer Single-SPA y su arquitectura
- Aprender la estructura recomendada de proyectos
- Realizar el setup inicial de un proyecto microfrontend
Parte 1
¿Qué son los Microfrontends?
Arquitectura Monolítica Frontend
┌─────────────────────────────────┐
│ │
│ UNA GRAN APLICACIÓN │
│ │
│ ┌───────────────────────────┐ │
│ │ Navegación │ │
│ ├───────────────────────────┤ │
│ │ Productos │ │
│ ├───────────────────────────┤ │
│ │ Carrito │ │
│ ├───────────────────────────┤ │
│ │ Usuario / Autenticación │ │
│ └───────────────────────────┘ │
│ │
│ Todo en un solo repositorio │
│ Un solo build y deployment │
└─────────────────────────────────┘
Problemas de la Arquitectura Monolítica
- Escalabilidad limitada: Un cambio pequeño requiere rebuild completo
- Acoplamiento: Equipos bloqueados esperando por otros
- Tecnología rígida: Difícil migrar o probar nuevas herramientas
- Testing complejo: Hay que probar toda la aplicación
- Deployment arriesgado: Un error puede tumbar todo
Arquitectura de Microfrontends
┌──────────────────────────────────────────┐
│ ROOT CONFIG (Orquestador) │
└──────────────────────────────────────────┘
│ │ │
┌──────┘ │ └──────┐
│ │ │
┌───▼────┐ ┌────▼─────┐ ┌────▼─────┐
│ MFE 1 │ │ MFE 2 │ │ MFE 3 │
│ │ │ │ │ │
│ React │ │ Angular │ │ Vue │
└────────┘ └──────────┘ └──────────┘
Cada microfrontend es independiente, con su propio repositorio, build y deployment
Beneficios de Microfrontends
✅ Desarrollo independiente: Equipos autónomos
✅ Despliegue independiente: Deploy sin afectar otros MFEs
✅ Tecnología flexible: Usa React, Angular, Vue en la misma app
✅ Escalabilidad: Equipos y features crecen sin bloqueos
✅ Resiliencia: Un error en un MFE no tumba toda la app
🤔 Pregunta Interactiva
¿En qué escenarios usarías microfrontends?
Opciones:
- A) Startup pequeña con 2 desarrolladores
- B) Empresa grande con múltiples equipos
- C) Aplicación simple de formulario
- D) E-commerce complejo con múltiples dominios
Levanta la mano o escribe en el chat
💡 Respuesta
Correctas: B y D
Los microfrontends son ideales para:
- Equipos grandes que necesitan autonomía
- Aplicaciones complejas con dominios bien definidos
- Organizaciones que quieren experimentar con nuevas tecnologías
No son recomendables para proyectos pequeños o equipos reducidos
Parte 2
Introducción a Single-SPA
¿Qué es Single-SPA?
Single-SPA es un framework JavaScript para crear microfrontends
- Permite usar múltiples frameworks en la misma página
- Sin necesidad de recargar la página
- Cada microfrontend puede desplegarse independientemente
- Gestiona el ciclo de vida de cada aplicación
Componentes Principales de Single-SPA
1️⃣ Root Config
Archivo HTML + JS que orquesta todo
2️⃣ Applications (Microfrontends)
Cada uno es una mini-SPA con ciclo de vida propio
3️⃣ Import Maps
Mapa de dependencias y microfrontends
4️⃣ SystemJS
Cargador de módulos que permite lazy loading
Arquitectura Single-SPA
// Root Config registra las aplicaciones
registerApplication({
name: "@org/navbar",
app: () => System.import("@org/navbar"),
activeWhen: ["/"]
});
registerApplication({
name: "@org/products",
app: () => System.import("@org/products"),
activeWhen: ["/products"]
});
Cada app se monta/desmonta según la ruta activa
Ciclo de Vida de un Microfrontend
// Cada microfrontend debe exportar estas funciones
export async function bootstrap(props) {
// Inicializar la aplicación
}
export async function mount(props) {
// Montar en el DOM
}
export async function unmount(props) {
// Limpiar y desmontar
}
Import Maps
Definen dónde están los módulos:
<script type="systemjs-importmap">
{
"imports": {
"react": "https://cdn.jsdelivr.net/npm/react@18/umd/react.production.min.js",
"react-dom": "https://cdn.jsdelivr.net/npm/react-dom@18/umd/react-dom.production.min.js",
"@org/root-config": "//localhost:9000/org-root-config.js",
"@org/navbar": "//localhost:8080/org-navbar.js",
"@org/products": "//localhost:8081/org-products.js"
}
}
</script>
SystemJS
¿Por qué SystemJS?
- Los navegadores aún no soportan completamente import maps
- SystemJS es un polyfill que permite:
- Cargar módulos dinámicamente
- Usar import maps hoy
- Soporte para navegadores antiguos
🎯 Quiz Rápido
¿Cuál es la función del Root Config?
- A) Contiene la lógica de negocio
- B) Orquesta y registra los microfrontends
- C) Maneja el estado global
- D) Renderiza componentes React
✅ Respuesta Correcta: B
El Root Config es el orquestador que:
- Registra las aplicaciones (microfrontends)
- Define cuándo cada una está activa
- Gestiona las dependencias compartidas
- Sirve el HTML principal
Parte 3
Estructura del Proyecto
Organización
microfrontends-project/
├── root-config/ # Orquestador principal
│ ├── src/
│ │ ├── index.ejs # HTML template
│ │ └── root-config.js # Registro de apps
│ └── package.json
│
├── navbar/ # MFE 1: Navegación
│ ├── src/
│ └── package.json
│
├── products/ # MFE 2: Productos
│ ├── src/
│ └── package.json
│
└── shared/ # Utilidades compartidas
├── styles/
└── components/
Convenciones de Nombres
Formato: @organization/project-name
Ejemplos:
@mycompany/root-config
@mycompany/navbar
@mycompany/products
@mycompany/checkout
Esto ayuda a:
- Evitar conflictos de nombres
- Organizar mejor en import maps
- Identificar quién es el dueño
Root Config vs Microfrontends
| Aspecto | Root Config | Microfrontend |
|---|---|---|
| Propósito | Orquestar | Funcionalidad específica |
| UI | Minimal (layout básico) | Features completos |
| Dependencias | Compartidas | Propias + compartidas |
| Deployment | Menos frecuente | Independiente y frecuente |
Parte 4
Setup Inicial - Práctica
Prerrequisitos
Antes de comenzar, asegúrate de tener:
✅ Node.js (v16 o superior)
node --version
✅ npm
npm --version
✅ Editor de código (VS Code, Cursor, Windsurf, etc)
Paso 1: Instalar create-single-spa
npm install --global create-single-spa
# o con npx (sin instalación global)
npx create-single-spa
Esta herramienta nos ayuda a generar proyectos Single-SPA
Paso 2: Crear el Root Config
# Crear carpeta del proyecto
mkdir mi-proyecto-mf
cd mi-proyecto-mf
# Crear root config
npx create-single-spa
Responde las preguntas del asistente:
-
Directory:
root-config -
Type:
single-spa root config -
Package manager:
npm(oyarn) -
TypeScript:
Yes -
Layout Engine:
Yes(recomendado) -
Organization name:
@miempresa
Estructura Generada
root-config/
├── src/
│ ├── index.ejs # HTML principal
│ ├── miempresa-root-config.ts
│ └── microfrontend-layout.html
├── package.json
├── tsconfig.json
└── webpack.config.js
Análisis: index.ejs
<script type="systemjs-importmap">
{
"imports": {
"@miempresa/root-config":
"//localhost:9000/miempresa-root-config.js"
}
}
</script>
<!-- Zona donde se renderizan los MFEs -->
<div id="single-spa-application:@miempresa/navbar"></div>
<div id="single-spa-application:@miempresa/products"></div>
Análisis: root-config.ts
import { registerApplication, start } from "single-spa";
registerApplication({
name: "@miempresa/navbar",
app: () => System.import("@miempresa/navbar"),
activeWhen: ["/"],
});
// Iniciar Single-SPA
start({
urlRerouteOnly: true,
});
Paso 3: Levantar el Root Config
cd root-config
npm install
npm start
Por defecto corre en: http://localhost:9000
¡Tu orquestador está listo! 🎉
Paso 4: Crear tu Primer Microfrontend
# Desde la carpeta raíz del proyecto
npx create-single-spa
Configuración:
-
Directory:
navbar -
Type:
single-spa application / parcel -
Framework:
react -
Package manager:
npm -
TypeScript:
Yes -
Organization name:
@miempresa -
Project name:
navbar
Estructura del Microfrontend
navbar/
├── src/
│ ├── root.component.tsx # Componente principal
│ ├── miempresa-navbar.tsx # Punto de entrada
│ └── root.component.test.tsx
├── package.json
├── tsconfig.json
└── webpack.config.js
Código del Microfrontend
// miempresa-navbar.tsx
import React from "react";
import ReactDOM from "react-dom";
import singleSpaReact from "single-spa-react";
import Root from "./root.component";
const lifecycles = singleSpaReact({
React,
ReactDOM,
rootComponent: Root,
errorBoundary(err, info, props) {
return <div>Error en navbar!</div>;
},
});
export const { bootstrap, mount, unmount } = lifecycles;
Conectar el MFE al Root Config
Editar root-config/src/index.ejs:
<script type="systemjs-importmap">
{
"imports": {
"@miempresa/root-config": "//localhost:9000/...",
"@miempresa/navbar": "//localhost:8080/miempresa-navbar.js"
}
}
</script>
Editar root-config/src/microfrontend-layout.html:
<nav>
<application name="@miempresa/navbar"></application>
</nav>
Levantar el Microfrontend
cd navbar
npm install
npm start -- --port 8080
Ahora el navbar corre en: http://localhost:8080
¡Y se verá en el root config! 🚀
Parte 5
Configuración de Estilos
Tailwind CSS en Microfrontends
Existen dos estrategias principales:
1️⃣ Tailwind en cada MFE (aislado) 2️⃣ Tailwind compartido (centralizado)
Recomendación: Depende de tu caso de uso
Estrategia 1: Tailwind Aislado
Cada MFE tiene su propia configuración
cd navbar
npm install -D tailwindcss postcss autoprefixer
npx tailwindcss init
Ventajas:
- Configuración independiente
- Sin conflictos entre MFEs
Desventajas:
- Duplicación de estilos
- Bundle más grande
Estrategia 2: Tailwind Compartido
Crear un MFE de utilidades compartidas:
shared-ui/
├── src/
│ ├── tailwind.config.js
│ └── styles.css
└── package.json
Los demás MFEs lo importan:
import '@miempresa/shared-ui/styles.css';
Introducción a shadcn/ui
shadcn/ui es una colección de componentes React reutilizables
- Usa Tailwind CSS
- Componentes accesibles (basados en Radix UI)
- Altamente personalizables
- Se copian a tu proyecto (no es una dependencia)
Instalación de shadcn/ui
cd navbar
npx shadcn-ui@latest init
Responde las preguntas:
-
Style:
Default -
Base color:
Slate -
CSS variables:
Yes
Esto crea:
-
components/ui/carpeta para componentes - Configuración de Tailwind actualizada
Agregar Componentes
npx shadcn-ui@latest add button
npx shadcn-ui@latest add card
Usar en tu código:
import { Button } from "@/components/ui/button";
function Navbar() {
return (
<nav>
<Button variant="outline">Login</Button>
</nav>
);
}
Compartir shadcn/ui entre MFEs
Opción 1: Instalar en cada MFE (recomendado para empezar)
Opción 2: Crear un MFE de UI compartido
shared-ui/
├── src/
│ └── components/
│ └── ui/
│ ├── button.tsx
│ └── card.tsx
Tarea para la Próxima Clase
1️⃣ Crear un root-config completamente funcional
2️⃣ Crear al menos 2 microfrontends básicos:
- Navbar con navegación
- Página Home con contenido
3️⃣ Configurar Tailwind en ambos MFEs
4️⃣ Agregar un componente de shadcn/ui (Button o Card)
¡Gracias!
¿Preguntas?
Recursos Adicionales
📚 Documentación oficial: https://single-spa.js.org
📺 Tutoriales en YouTube: Single-SPA
💻 Repositorio de ejemplos: https://github.com/single-spa
🎨 shadcn/ui: https://ui.shadcn.com
Lesson 1: Microfrontends con Single-SPA
By anlijudavid
Lesson 1: Microfrontends con Single-SPA
- 58