Skip to main content
Micro frontends are one of the most oversold patterns in frontend engineering. Every conference talk makes them sound inevitable — the natural evolution of any serious web application. But after working on products where micro frontends were a genuine survival strategy and products where they were a premature optimization that created years of pain, I can tell you: most teams shouldn’t do micro frontends. And the ones that should need to go in with eyes wide open about the real costs. This page is an honest accounting of both sides. No vendor pitches. No “we adopted micro frontends and everything was amazing.” Just the trade-offs. Architecture and building structure
“A service is something that is independently deployable and organized around a business capability.” — Sam Newman
That definition matters. If your “micro frontends” can’t deploy independently without breaking each other, you don’t have micro frontends — you have a distributed monolith with extra steps.

What Micro Frontends Actually Solve

Micro frontends solve organizational problems, not technical ones:
ProblemHow Micro Frontends Help
Deployment bottlenecksTeam A ships without waiting for Team B’s release train
Team autonomyEach team owns their slice end-to-end — dependencies, testing, release cadence
Isolated failuresIf the notifications module crashes, the main app still works
Incremental migrationRewrite one section in a new framework while the rest stays put
Notice what’s not on this list: performance, code quality, developer experience. Micro frontends don’t improve any of those. In most cases, they make them worse.

The Real Costs Nobody Talks About

Here’s the bill that conference talks skip over:
CostWhat It Means in Practice
Shared state complexityUser updates their profile in settings — how does the header find out? You need cross-module communication: custom events, a shared bus, or broadcast channels.
UX driftButton styles diverge. Loading states differ. Spacing is 4px here, 8px there. Users notice. You need a shared design system with strict governance.
Bundle bloatThree micro frontends each bundling React = users download React three times. Externalizing it creates a version compatibility matrix.
Performance overheadMultiple JS bundles, multiple framework instances, coordination overhead. A well-optimized monolith always outperforms a well-optimized micro frontend setup.
Tooling investmentLocal dev, testing, CI/CD, preview environments — all get harder. “How do I run the whole app locally?” becomes a non-trivial question.
Platform team requiredSomeone has to build and maintain the shell, shared infrastructure, and developer tooling. Budget 2-3 dedicated engineers.
The biggest mistake I’ve seen: teams adopt micro frontends to solve problems that are actually just poor code organization. If your monolith is painful because of bad architecture, micro frontends give you multiple poorly-architected applications instead of one.

The Decision Matrix

Use this when someone proposes micro frontends. It’s not a formula — it’s a structured way to have an honest conversation.
FactorStay MonolithConsider Micro Frontends
Team size< 20 frontend engineers> 30 engineers, 5+ teams
Deploy frequencyWeekly or lessMultiple times daily per team
Feature couplingFeatures share lots of state and UIFeatures are naturally isolated (admin vs user-facing)
Tech stackSingle framework, stableMultiple frameworks or active migration
UX consistencyCritical and tightly controlledVaries by section
Time to marketNeed to ship fast NOWWilling to invest in platform for speed LATER
Team distributionCo-located, easy to coordinateDistributed across timezones
Codebase age< 3 years, well-maintained5+ years, legacy sections need replacement
If you’re in the “Stay Monolith” column for most factors, stay with a monolith. Seriously. Micro frontends for a team of 8 is like buying a semi-truck to commute to work.

Integration Approaches Compared

If you do proceed, you need an integration strategy. Each comes with meaningful trade-offs:
ApproachShared DependenciesFramework Lock-inIsolationSetup ComplexityBest For
Module Federation (Webpack/Rspack)Shared singletons (one React)Webpack/Rspack requiredPartialHighReact-based, same-framework teams
Import Maps (Native Browser)Manual via CDNNonePartialMediumFramework-agnostic, progressive teams
IframesNone (full duplication)NoneCompleteLowLegacy integration, third-party embeds
Web ComponentsManualNoneGood (Shadow DOM)MediumCross-framework, design systems
Module Federation is the most common choice for React teams, but it comes with a version compatibility matrix between host and remotes that you’ll be managing forever. Import Maps are simpler conceptually but have less tooling support. Iframes give you complete isolation at the cost of terrible cross-module communication.

The Monolith-First Approach

My default recommendation: start with a monolith and extract micro frontends only when organizational pain demands it. A well-structured monolith with feature-based folders, lazy-loaded routes, and a shared component library will carry you further than you think. Probably to 20-30 engineers, sometimes further if the team is disciplined. The key is structuring your monolith with clean feature boundaries from day one:
src/
  features/
    billing/       ← could become a micro frontend later
      components/
      hooks/
      api/
    settings/      ← could become a micro frontend later
      components/
      hooks/
      api/
  shared/
    components/    ← shared design system
    hooks/
    utils/
If you structure it this way, extracting a feature into a micro frontend later is straightforward. The reverse — merging micro frontends back into a monolith because the overhead wasn’t worth it — is much harder.
The best micro frontend architecture is the one you don’t build until you need it. Structure your monolith as if each feature folder could become independent. When the organizational pain arrives, you’ll have clean seams to cut along.

Questions to Ask Before Saying Yes

When someone proposes micro frontends, run through this checklist:
  1. What specific problem are you solving? “Modernization” isn’t specific. “Team A can’t deploy without coordinating with Team B, costing us 2 days per release” is.
  2. Have you tried solving it within the monolith? Code ownership rules, per-directory deploy pipelines, feature flags — these solve many of the same problems without the architecture change.
  3. Who will maintain the platform? If you can’t dedicate 2-3 engineers to the shell, shared infrastructure, and tooling, the micro frontends will rot.
  4. What’s your performance budget? If you can’t tolerate a 20-30% increase in JavaScript payload, this might not be right for your product.
  5. What’s the migration plan? Nobody goes monolith to micro frontends in one sprint. Plan 6-12 months with clear milestones and the ability to stop if it’s not working.
Micro frontends are a powerful pattern — at the right scale, for the right problems. The sin isn’t adopting them. The sin is adopting them because they sounded good in a conference talk without honestly assessing whether your team is the audience that talk was written for.