#MicroFrontend
It was a GREAT work, and i mean it, on developers side back when they were building microfrontend on nextjs.
October 24, 2026 at 11:27 AM
Konsultuppdrag kräver erfarenhet av microfrontend, frontend- och backendteknik samt CI/CD, testautomation och molninfrastruktur.
Save What Matters
Curate Feeds | Make Collections | Customize Email Briefs
briefly.co
October 21, 2026 at 6:44 AM
Konsultuppdrag kräver erfarenhet av microfrontend, frontend- och backendteknik samt CI/CD, testautomation och molninfrastruktur.
Save What Matters
Curate Feeds | Make Collections | Customize Email Briefs
briefly.co
October 21, 2026 at 6:44 AM
Microfrontends con Angular y Native Federation: lo que aprendí llevando más de 15 módulos a producción
Hace unos meses me tocó llevar una plataforma corporativa a una arquitectura de microfrontends: un portal que carga más de 15 módulos, cada uno con su propio repositorio, su propio equipo y su propio despliegue. Hoy esos módulos salen a producción por separado, sin coordinar ventanas de despliegue entre equipos. No voy a explicar qué es un microfrontend, de eso ya hay bastante escrito. Quiero contar lo que no sale en los tutoriales, lo que solo aparece cuando el segundo, el quinto y el décimo módulo ya están en producción. ## Primero: cuándo NO usar microfrontends Empiezo por aquí porque es la pregunta que más me hacen y la respuesta honesta es "casi nunca al inicio". Te conviene | No te conviene ---|--- Varios equipos que necesitan desplegar sin esperarse | Un solo equipo trabajando en un solo producto Dominios de negocio claramente separados (ventas, calidad, RRHH) | Pantallas que comparten casi todo el estado Módulos que crecen a ritmos distintos | Un producto que todavía está buscando su forma Una plataforma que va a vivir años | Un MVP que tiene que salir en semanas Si estás en la columna de la derecha, un monolito bien modularizado te da el 80 % del beneficio con el 20 % del costo. Los microfrontends son, sobre todo, una decisión de organización. Pagan cuando el cuello de botella es la coordinación entre equipos, no la calidad del código. ## La arquitectura, en una imagen ┌──────────────────────────────┐ usuario ───────▶│ HOST (portal) │ │ · login único (OIDC) │ │ · menú según permisos │ │ · lee el manifiesto │ └──────────────┬───────────────┘ │ carga en tiempo de ejecución ┌──────────────────────┼──────────────────────┐ ▼ ▼ ▼ remoteEntry.json remoteEntry.json remoteEntry.json ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ Ventas │ │ Calidad │ │ RRHH │ │ repo propio │ │ repo propio │ │ repo propio │ │ deploy │ │ deploy │ │ deploy │ │ propio │ │ propio │ │ propio │ └──────────────┘ └──────────────┘ └──────────────┘ El stack es Angular con **Native Federation** (`@angular-architects/native-federation`). Es el sucesor de Module Federation para el builder moderno de Angular basado en esbuild: en lugar de depender de webpack, usa los estándares del navegador (módulos ES e import maps). El host no conoce a los módulos en tiempo de compilación. Los descubre al arrancar, desde un manifiesto: // federation.manifest.json (uno por ambiente) { "ventas": "https://ventas.ejemplo.com/remoteEntry.json", "calidad": "https://calidad.ejemplo.com/remoteEntry.json" } // main.ts del host initFederation('federation.manifest.json') .then(() => import('./bootstrap')); // rutas del host { path: 'ventas', loadChildren: () => loadRemoteModule({ remoteName: 'ventas', exposedModule: './Routes' }) .then(m => m.routes) } Hasta aquí es lo que trae cualquier tutorial. Lo que sigue lo aprendí en producción. ## Lo que rompe en producción (y cómo lo resolví) ### 1. Las rutas absolutas dentro de un módulo Un módulo se desarrolla solo, en su propio puerto, donde `/detalle/42` funciona perfecto. Embebido en el portal, ese módulo vive bajo `/ventas`, y `/detalle/42` manda al usuario a una ruta que no existe. **La regla:** dentro de un módulo, toda navegación es relativa. `routerLink="detalle/42"` y `router.navigate(['detalle', id], { relativeTo: route })`. Es una línea en la guía del equipo y una revisión en cada pull request, pero ahorra el bug más repetido de toda la plataforma. ### 2. El CORS de `remoteEntry.json` El host pide el `remoteEntry.json` y los chunks de cada módulo desde otro dominio. Si el servidor del módulo no responde con `Access-Control-Allow-Origin`, el navegador bloquea la carga y el usuario ve una pantalla en blanco sin ningún error útil en la interfaz. **La regla:** el CORS de los archivos estáticos del módulo es parte de la plantilla del proyecto, no algo que cada equipo descubre por su cuenta. Todo módulo nuevo nace con la configuración de su servidor web ya resuelta. ### 3. La caché que esconde la versión nueva Despliegas, todo sale en verde, y el usuario sigue viendo la versión anterior. El culpable casi siempre es `remoteEntry.json`: es el único archivo cuyo nombre no cambia entre versiones, así que si el navegador o un CDN lo guarda, apunta a chunks viejos. **La regla:** `remoteEntry.json` se sirve sin caché; los chunks, que llevan un hash en el nombre, se pueden cachear para siempre. Así cada despliegue llega al usuario en la siguiente carga, sin pedirle a nadie que borre su caché. ### 4. Un manifiesto por ambiente… y la vez que se mezclaron Cada ambiente (pruebas y producción) tiene su propio manifiesto con las URLs de sus módulos. Una vez, una construcción manual horneó los valores por defecto y el portal de producción terminó cargando módulos de pruebas. El síntoma fue un error de CORS; la causa, un ambiente mezclado. **La regla:** el pipeline valida, antes de construir, que todas las URLs correspondan al ambiente destino, y aborta si no. Desde entonces ese error ya no puede repetirse, porque el pipeline no lo deja pasar. ### 5. Una sola versión del Design System en todos los módulos Los módulos comparten librerías: Angular, el router y el Design System propio que usan 17 aplicaciones. Native Federation las comparte como _singleton_ , pero si un módulo trae otra versión del Design System, el portal muestra dos estilos distintos en la misma pantalla o, peor, componentes que se rompen al navegar entre módulos. **La regla:** cada cambio en el Design System se publica como paquete versionado y se actualiza en _todos_ los módulos a la vez, no solo en el que lo necesitaba. Y no basta con subir el rango en el `package.json`: si la imagen se construye con `npm ci`, manda el _lockfile_ , así que hay que reinstalar y versionar el lock también. ### 6. Un módulo en el menú que todavía no existe El portal arma su menú desde un catálogo de módulos. Registrar un módulo antes de que esté desplegado en todos los ambientes hace que el portal intente cargar un `remoteEntry.json` que no existe, y esa ruta queda rota. **La regla:** cada entrada del catálogo tiene un indicador de disponibilidad. El módulo aparece en el menú con una página de "próximamente" hasta que su servicio existe donde corre el portal. ## El login: uno solo, en el host La decisión que más simplificó todo: **solo el host autentica**. El portal maneja el inicio de sesión con OIDC (Keycloak) y los módulos reciben el token ya resuelto. Ningún módulo define su propia autorización ni su propio login. Eso tiene dos efectos. Para el usuario, un solo inicio de sesión para toda la plataforma. Para los equipos, un módulo nuevo no empieza escribiendo pantallas de login, sino pantallas de negocio. Los permisos viajan en el token y el menú se arma según ellos. > Si cada módulo resuelve la seguridad a su manera, tienes tantos modelos de seguridad como módulos. Centralizarla es la única forma de poder auditarla. ## Qué haría distinto si empezara hoy * **El Design System antes que el segundo módulo.** Cada componente que un equipo construye "mientras tanto" es un componente que después hay que migrar. * **Las barreras del pipeline desde el día uno.** La validación de ambientes la agregué después de un incidente. Pudo estar desde el inicio. * **Automatizar la actualización del Design System.** Actualizar una librería en más de 15 repositorios a mano no escala: es exactamente el tipo de tarea que debe hacer un script, no una persona. * **Una plantilla de módulo.** CORS, rutas relativas, configuración de federación y pipeline listos al crear el repositorio. Cada regla de este artículo debería ser un archivo de la plantilla, no un párrafo de la guía. ## Para cerrar Los microfrontends funcionan cuando resuelven un problema de organización: equipos que necesitan avanzar sin esperarse. La parte técnica —federación, manifiestos, rutas— se resuelve en una semana. Lo difícil es todo lo demás: que cada regla quede escrita, que las que importan se conviertan en barreras automáticas y que cualquier persona del equipo pueda sostener la plataforma con lo que está documentado. Si estás evaluando microfrontends para tu equipo o ya estás peleando con alguno de estos problemas, escríbeme por LinkedIn. Me interesa saber cómo lo están resolviendo otros. _Publicado originalmente en mi blog._
dev.to
October 16, 2026 at 8:15 PM
My first dev.to article! Sharing my experiences trying to proactively solve for architectural blindspots in CI.

dev.to/jordonkloibe...
The Playwright Pie in the Sky: Solving for CI Blindspots in Microfrontend Architecture in a Crunch
At a previous job my product team introduced a business-critical microfrontend with module federation...
dev.to
September 25, 2026 at 6:29 PM
Why Module Federation — Building an Enterprise MFE Platform (Part 1)
This series walks through an actual enterprise microfrontend platform, end to end: one Host shell, three shared platform microfrontends, a manifest-driven mechanism for mounting any number of independently-owned domain microfrontends, a full OIDC auth flow, and a CI/CD pipeline. Every code snippet in this series is real and traceable to the actual boilerplate it's built from, on GitHub. Part 1 is the decision everything else in this series depends on: **why Module Federation** , and not one of the two other credible options. ## The one requirement that rules everything else out Strip away the buzzwords, and an "enterprise microfrontend platform" only has to guarantee one thing: **a team ships a change to their part of the app without anyone else redeploying anything.** Not "in theory, with enough coordination" — actually, mechanically, true. If shipping one team's bug fix requires a platform team to cut a release, this isn't microfrontends — it's a monolith with extra steps. That single requirement rules out more than it looks like it should. It rules out compiling every team's code into one shared build (that's just a single-page app with more steps). And it rules out anything where the Host app needs to know, at its own build time, which teams' pages exist and which version of each — because "known when the Host was built" and "deployed independently of the Host" are opposites. ## The decision Use **Webpack 5 Module Federation** , in runtime-composition mode, as the platform's way of putting every team's page together into one app: * The Host ships with an empty list of remote apps built in. Instead, it looks up every team's page from a small list — a manifest — that it fetches fresh every time the app loads. * React, the shared state layer, and the shared design system are all declared as **singletons** : every team's page gets the exact same running instance of each, not its own separate copy. * "Deploying" a team's page means adding or updating one entry in that manifest. The Host itself is never rebuilt. Here's that decision as it actually exists in the repo, not as illustrative pseudocode: // apps/host/webpack.common.js module.exports = createModuleFederationConfig({ federation: { name: 'host', // remotes stay empty at build time — resolved at runtime from the // manifest. This is what makes a domain MFE's deploy a manifest // update instead of a Host rebuild. remotes: {}, shared: { react: { singleton: true, requiredVersion: '^18.2.0 || ^19.0.0' }, 'react-dom': { singleton: true, requiredVersion: '^18.2.0 || ^19.0.0' }, '@org/store': { singleton: true, requiredVersion: `^${storePkg.version}` }, '@org/components': { singleton: true, requiredVersion: `^${componentsPkg.version}` }, }, }, ... }); The Host doesn't import a single line of any team's code. At runtime, it fetches a small JSON file — `platform.manifest.json` — that maps each page's route to the URL its bundle lives at, and mounts whatever's listed there: // packages/runtime-module-federation/src/manifest-loader.ts export async function loadDomainManifest(config: PlatformConfig): Promise<ManifestEntry[]> { if (cached) return cached; const res = await fetch(config.manifestUrl); if (!res.ok) throw new Error(`Failed to load manifest from ${config.manifestUrl}: ${res.status}`); cached = (await res.json()) as ManifestEntry[]; return cached; } This is the single most important decision in the whole platform: **deploying a team's page means updating one entry in this manifest** , not rebuilding the Host. Part 5 covers the script that does that update safely. ## The other options on the table Two other approaches genuinely fit this same problem, and it's worth being clear about why each lost out here rather than just naming Module Federation as a given: Approach | How it works | Why it's not the default here ---|---|--- **Build-time composition** | The Host imports every team's code directly and bundles it all into one build, like a normal app with more folders. | A team's deploy would require rebuilding and redeploying the Host — exactly the coupling this platform exists to avoid. Ruled out outright, not just deprioritized. **Next.js Multi-Zones** | Each team ships an independently deployable Next.js app; a router at the edge stitches them together by URL prefix. | The right call if real SSR/SEO is a hard requirement. But each zone is its own separate page, not a widget sharing one React tree with the others — so login state, shared components, and shared data don't automatically carry across zones the way they do here. **single-spa** | A framework-agnostic runtime composition tool — any framework's app can mount alongside any other. | Makes real sense if an org runs Vue, Angular, and React side by side. This platform assumes every team is on React, so that extra flexibility is a cost being paid for a problem the platform doesn't have. **Module Federation** _(chosen)_ | Webpack loads each team's bundle at runtime and shares one running copy of React, the shared state layer, and the design system across all of them. | Meets the independent-deploy requirement with the least new infrastructure, and keeps every team's page working inside one shared, logged-in app. If real SSR/SEO ever becomes a hard requirement later, switching to Multi-Zones or single-spa is a contained swap — it changes how the Host and the deploy pipeline work, not the rest of the platform. ## What this buys, and what it costs **What it buys:** * A team ships by adding one entry to the manifest — no pull request against the Host, no waiting on a platform team's release train. * Every team's page uses the _same_ running copy of React, the same design system, and the same logged-in session — not a slightly different copy per team. * Nothing about this approach locks the platform into one cloud provider, CI tool, or hosting vendor. **What it costs — two real trade-offs, both handled later in this series:** 1. **The manifest becomes critical.** Every team's page is found the same way: by looking it up in that one shared list. If wherever that list lives goes down, _no_ page loads — even pages that changed nothing today. 2. **A version mismatch can slip through unnoticed.** Each team declares which version of React (and the shared libraries) their page was built against. Nothing stops that declaration from quietly drifting out of sync with what's actually running — the mismatch only shows up once a real user hits it in a real browser, not when the code is built. Both of those get a concrete, working mitigation later in this series — not just a warning label. Running several teams' pages together locally is also a bit more involved than running one single app — this platform uses a monorepo tool (Turborepo) to keep that workable, though it isn't strictly required for Module Federation to work. That's the shape of this series: the decision in this part, and then each following part is the architecture that decision leads to — the topology it produces, how login is unified across every team's page, the rules that keep it reliable, and how the whole thing actually ships. Next up: the platform's layout, the Host shell, and the three shared microfrontends every team builds against. **Next:Part 2 — Inside the Platform: Topology, Host Shell & Platform MFEs**
dev.to
August 30, 2026 at 7:12 PM
Qué coño es un microfrontend
August 23, 2026 at 3:54 PM
Microfrontend bueno pues a mi me parece bastante competente en la media sin más
August 23, 2026 at 5:27 PM
Microfrontend composition matured past the iframe workaround phase. Module federation stabilizes cross team builds, shared dependency governance got enforced, and client composition respects server boundaries now. The federation tax finally became manageable. #MicroFrontends #WebDev #Architecture
August 20, 2026 at 4:43 AM
This idea (something in the middle that can change what it returns) can also be used with Microfrontend (MFE) apps that use Webpack's Module Federation system.
November 1, 2024 at 1:06 PM
The first new project I can share is for my new studio named Level 0x40 Labs: a micro-frontend projection for the web. It supports all major frameworks and major fullstack solutions including server-side rendering. More info at virtual-frame.level0x40.com and level0x40.com.
Virtual Frame
Microfrontend projection library — compose independently deployed applications with full interactivity
virtual-frame.level0x40.com
April 26, 2026 at 9:02 PM
Also using my own Tailwind-base custom theme system which I already used on other web apps in the past

Let me know what you think. Here is the link:
www.damianofusco.com
Damiano Fusco: expert full stack software engineer with Vite, Vue, Svelte, React, TypeScript, JavaScript, Node.js, C#, .NET, LangChain
Expert full stack software engineer with Vite, Vue, Svelte, React, TypeScript, JavaScript, Node.js, C#, .NET, LangChain. Experienced in Single-Page Application pattern (SPA), Frontend/Microfrontend Ar...
www.damianofusco.com
June 1, 2026 at 8:08 PM
A galera tava bem louca quando começou a adotar microservices sem necessidade, mas adotar microfrontend era nível hospital psiquiátrico mesmo
April 3, 2025 at 4:06 PM
💡 Build scalable micro-frontends easily with Next.js Multi Zones - independent deployments with seamless UX! #NextJS #microfrontend techhub.iodigital.com/articles/bui...
Building Scalable Micro-Frontends with Next.js Multi Zones - iO tech_hub
Let's see how Next.js Multi Zones can make building micro frontends a breeze.
techhub.iodigital.com
December 12, 2024 at 2:34 PM
Are you seeing this mostly in microfrontend setups where teams control their own packages, or is it happening even in monorepos with centralized versioning?
June 4, 2026 at 3:10 AM
3hrs em call pra descobrir que o host do angular federation tinha uma versao da lib diferente do microfrontend e por isso minha atualização na lib nao pegava.

Qual o sentido de se ter dependências diferentes de um host e de um MFE no mesmo aplicativo?

Tem como configurar pra considerar apenas um?
October 15, 2024 at 9:09 PM
I’m building a Vue microfrontend system that you can insert as a script into any webpage (you own or call as console iife). Getting tailwind with shadow DOM, processing, baseline, theme variables, and dynamically loaded content as plugin modules is crazy but fun
May 10, 2025 at 9:09 AM
Struggling with NX's single-version policy in our micro frontend setup 🤔

Each team needs different dependency versions, but NX enforces everything in root package.json. Also dealing with barrel export issues affecting tree-shaking.

#NX #microfrontend #monorepo #pnpm
July 31, 2025 at 12:24 AM
Microfrontend no momento
August 31, 2024 at 11:41 AM
@sebi.io it's so slick >///< I really want to experiment with react but i have to learn the typescript way instead... sniffles.. unlesssss... there's a way to bundle the react code to a js bundle because that's what I need because we're doing microfrontend :(
November 14, 2024 at 12:30 PM
Trabalhando com microfrontend de novo TESÃO ANAL
February 12, 2026 at 6:56 PM
🗣️🕸️Selasa malam waktunya ngobrolin WEB! Malam ini kita akan diskusi seputar microfrontend. Bareng Eka dan Ivan pastinya. Tak lupa ada Mas Irfan yang bakal ikut nimbrung.

🔔 Yuk mari ramaikan! Kita jam 20:000WIB.

www.youtube.com/live/4B17oXq...
YouTube
Share your videos with friends, family, and the world
www.youtube.com
November 5, 2024 at 5:32 AM
Untuk episode #ngobrolinweb mendatang, rencananya akan membahas tentang microfrontend. Kira-kira hal apa sajakah yang perlu dibahas? Tools apa saja yang perlu diketahui?
November 2, 2024 at 11:32 AM
August 11, 2026 at 11:25 AM
I wish I could but it’s FAR from simple

It’s a 10y old one-person-drived Maven-controlled and webpack-built microfrontend-oriented codebase…

The whole thing is critical for the company and I’m not even a contributor of it, only a user

I WISH it was simple but I’m NOT touching that lol
March 23, 2026 at 7:22 PM