Micro frontends.
They’re the new hotness. The silver bullet. The “just split it up like microservices” of the frontend world.
The concept is hard to ignore. Multiple teams, multiple frameworks, decoupled deployments — what’s not to love?
But here’s the catch: micro frontends are powerful…
and potentially overkill.
Let’s unpack what they are, what they solve, and more importantly — when not to use them.
🧱 What Are Micro Frontends?
At a high level:
Micro frontends are an architectural pattern where a frontend is split into independent, self-contained pieces owned by different teams.
Each piece:
- Has its own codebase
- Can be built and deployed independently
- Can (in some cases) use its own framework or tech stack
Kind of like frontend microservices.
🔧 Why People Use Them
Micro frontends promise to solve big problems that arise at scale:
✅ 1. Team Autonomy
Different teams can build, test, and deploy without stepping on each other’s toes.
✅ 2. Tech Stack Flexibility
You could have a React team, a Vue team, and a vanilla JS team — all living in harmony (sort of).
✅ 3. Independent Deployments
Each frontend module can ship on its own schedule — no monolithic release trains.
✅ 4. Scalability in Large Orgs
When 5+ teams are working on one frontend, splitting it up brings sanity and structure.
🧪 How It’s Done
There are a few common patterns:
- Iframe-based embedding (rare now, but still used in low-trust situations)
- Build-time integration: teams share modules, but build into one app
- Runtime integration: via module federation (Webpack 5), single-spa, or custom loaders
You can even lazy-load separate apps into shell containers, making the user feel like it’s all one experience.
🧨 The Hidden Costs
So far, so good… but here’s what they don’t always tell you.
⚠️ 1. Increased Complexity
You now have:
- Multiple deployments to track
- Shared state problems
- Inter-app communication headaches
- CI/CD pipelines everywhere
You’ve traded monolith chaos for distributed chaos.
⚠️ 2. Performance Overheads
If not done carefully, users may:
- Download multiple versions of React
- Hit duplicated dependencies
- Experience slower startup due to fragmented loading
Without strong orchestration, UX suffers.
⚠️ 3. Shared Styling Becomes Hard
Global styles, tokens, and design systems become harder to maintain. CSS scoping and versioning become non-trivial.
⚠️ 4. Onboarding Costs
New devs now need to learn not just the app, but the system of apps — how they connect, communicate, and deploy.
🧠 So… Do You Really Need Them?
Ask yourself:
Question | If Yes… | If No… |
---|---|---|
Do you have 3+ frontend teams working on separate domains? | Micro frontends could help. | You’re likely fine with modular monoliths. |
Do your features need independent deployments? | Could justify the setup. | Stick to a single build process. |
Are teams blocked by cross-team coordination? | MFs can reduce friction. | Try better code organization first. |
Do you have existing shared state across features? | MFs will complicate that. | Avoid unless you have a solid state-sharing strategy. |
Are you operating at the scale of Amazon, Spotify, or IKEA? | Go ahead. | Seriously reconsider. |
In most cases, the real bottleneck isn't architecture — it's communication and code discipline.
🛠 What You Might Try Instead
Before reaching for micro frontends, consider:
🧩 1. Modular Monoliths
Keep a single app, but:
- Use feature-based folder structures
- Use internal npm packages or libraries
- Define clear boundaries and owners
🧱 2. Federated Modules in Moderation
Use Webpack Module Federation to split just what's needed. No need to break everything apart.
🔀 3. Route-Based Code Splitting
Tools like React.lazy, Vue async components, and dynamic imports can create boundaries without separate deployments.
✍️ Final Thought
Micro frontends are not a best practice — they’re a tradeoff.
They bring power, but also pain. And unless you're hitting the scaling wall hard, you might be engineering yourself into a corner you didn’t need to enter.
So yes — appreciate the power.
Build a proof of concept.
Play with module federation or single-spa.
But before you commit your team to a new world of containers, runtimes, and orchestration layers...
Ask the simplest question:
"Do we need this to move faster, or just to feel fancier?"
Choose wisely.
Awesome post!