┌─────────────────────────────────┐
│ │
│ UNA GRAN APLICACIÓN │
│ │
│ ┌───────────────────────────┐ │
│ │ Navegación │ │
│ ├───────────────────────────┤ │
│ │ Productos │ │
│ ├───────────────────────────┤ │
│ │ Carrito │ │
│ ├───────────────────────────┤ │
│ │ Usuario / Autenticación │ │
│ └───────────────────────────┘ │
│ │
│ Todo en un solo repositorio │
│ Un solo build y deployment │
└─────────────────────────────────┘
┌──────────────────────────────────────────┐
│ ROOT CONFIG (Orquestador) │
└──────────────────────────────────────────┘
│ │ │
┌──────┘ │ └──────┐
│ │ │
┌───▼────┐ ┌────▼─────┐ ┌────▼─────┐
│ MFE 1 │ │ MFE 2 │ │ MFE 3 │
│ │ │ │ │ │
│ React │ │ Angular │ │ Vue │
└────────┘ └──────────┘ └──────────┘
Cada microfrontend es independiente, con su propio repositorio, build y deployment
✅ 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
Opciones:
Levanta la mano o escribe en el chat
Correctas: B y D
Los microfrontends son ideales para:
No son recomendables para proyectos pequeños o equipos reducidos
Single-SPA es un framework JavaScript para crear microfrontends
Archivo HTML + JS que orquesta todo
Cada uno es una mini-SPA con ciclo de vida propio
Mapa de dependencias y microfrontends
Cargador de módulos que permite lazy loading
// 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
// 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
}
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>
¿Por qué SystemJS?
El Root Config es el orquestador que:
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/
@organization/project-name
Ejemplos:
@mycompany/root-config
@mycompany/navbar
@mycompany/products
@mycompany/checkout
Esto ayuda a:
| 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 |
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)
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
# Crear carpeta del proyecto
mkdir mi-proyecto-mf
cd mi-proyecto-mf
# Crear root config
npx create-single-spa
Responde las preguntas del asistente:
root-config
single-spa root config
npm (o yarn)Yes
Yes (recomendado)@miempresa
root-config/
├── src/
│ ├── index.ejs # HTML principal
│ ├── miempresa-root-config.ts
│ └── microfrontend-layout.html
├── package.json
├── tsconfig.json
└── webpack.config.js
<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>
import { registerApplication, start } from "single-spa";
registerApplication({
name: "@miempresa/navbar",
app: () => System.import("@miempresa/navbar"),
activeWhen: ["/"],
});
// Iniciar Single-SPA
start({
urlRerouteOnly: true,
});
cd root-config
npm install
npm start
Por defecto corre en: http://localhost:9000
¡Tu orquestador está listo! 🎉
# Desde la carpeta raíz del proyecto
npx create-single-spa
Configuración:
navbar
single-spa application / parcel
react
npm
Yes
@miempresa
navbar
navbar/
├── src/
│ ├── root.component.tsx # Componente principal
│ ├── miempresa-navbar.tsx # Punto de entrada
│ └── root.component.test.tsx
├── package.json
├── tsconfig.json
└── webpack.config.js
// 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;
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>
cd navbar
npm install
npm start -- --port 8080
Ahora el navbar corre en: http://localhost:8080
¡Y se verá en el root config! 🚀
Existen dos estrategias principales:
1️⃣ Tailwind en cada MFE (aislado) 2️⃣ Tailwind compartido (centralizado)
Recomendación: Depende de tu caso de uso
Cada MFE tiene su propia configuración
cd navbar
npm install -D tailwindcss postcss autoprefixer
npx tailwindcss init
Ventajas:
Desventajas:
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';
shadcn/ui es una colección de componentes React reutilizables
cd navbar
npx shadcn-ui@latest init
Responde las preguntas:
Default
Slate
Yes
Esto crea:
components/ui/ carpeta para componentesnpx 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>
);
}
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
1️⃣ Crear un root-config completamente funcional
2️⃣ Crear al menos 2 microfrontends básicos:
3️⃣ Configurar Tailwind en ambos MFEs
4️⃣ Agregar un componente de shadcn/ui (Button o Card)
📚 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