Micro Frontends: Complete Beginner to Architect Guide
Learn micro frontends from fundamentals to architect-level system design, including shell apps, remotes, Module Federation, routing, auth, deployment, testing, and interview preparation.
Micro frontends are one of the most important architecture patterns for senior frontend engineers and frontend architects.
But they are also one of the most misunderstood.
Many developers think micro frontends simply mean:
“Split one React app into many React apps.”
That is not the full picture.
Micro frontends are not just about splitting code. They are about splitting ownership, releases, deployment pipelines, and business domains across multiple frontend teams.
A good micro frontend architecture helps large teams move independently.
A bad micro frontend architecture creates runtime failures, duplicated dependencies, inconsistent UI, shared state chaos, and a distributed frontend monolith.
This guide explains micro frontends from beginner level to architect level. By the end, you should be able to explain micro frontends clearly in interviews and design a production-grade micro frontend system.
1. What Are Micro Frontends?
A micro frontend is an architectural pattern where a large frontend application is divided into smaller, independently owned and independently deployable frontend applications.
Each micro frontend usually maps to a business domain or product area.
For example, an e-commerce platform can be split like this:
E-commerce Platform ├── Shell App ├── Catalog Micro App ├── Search Micro App ├── Product Details Micro App ├── Cart Micro App ├── Checkout Micro App ├── Orders Micro App └── Profile Micro App
Each micro app can have its own:
- Team
- Repository
- Build pipeline
- Deployment lifecycle
- Testing strategy
- Runtime ownership
- Monitoring dashboard
The user still sees one product, but internally the frontend is composed from multiple independently owned pieces.
2. Why Do Micro Frontends Exist?
Micro frontends exist because large frontend monoliths become difficult to scale across teams.
In the early stage of a product, one frontend application is usually fine.
Single Frontend App ├── Home ├── Products ├── Cart ├── Checkout ├── Profile └── Orders
This works well when:
- The team is small
- The product is simple
- The release cycle is shared
- The build time is acceptable
- The ownership model is clear
But as the product grows, problems start appearing.
3. Problems in a Large Frontend Monolith
A large frontend monolith often suffers from these issues:
| Problem | What Happens |
|---|---|
| Too many teams in one codebase | Teams block each other |
| Slow builds | Every change takes longer to validate |
| Risky deployments | A small change can affect unrelated areas |
| Shared release cycle | One team’s delay can block everyone |
| Tight coupling | Domains become dependent on each other |
| Difficult migration | Moving to a new framework becomes risky |
| Unclear ownership | Nobody knows who owns which part |
Example:
Catalog team changes product filters
Cart team changes cart drawer
Checkout team changes payment page
Profile team changes address book
All changes go through the same app, same build, same release, and same risk surface.This is where micro frontends can help.
4. What Problem Do Micro Frontends Solve?
Micro frontends solve the problem of frontend organizational scaling.
They help when multiple frontend teams need to work independently on one product.
| Monolithic Frontend Problem | Micro Frontend Benefit |
|---|---|
| One large codebase | Domain-specific codebases |
| One release pipeline | Independent deployments |
| Team coordination overhead | Team autonomy |
| High release risk | Smaller release surface |
| Hard migration | Incremental migration |
| Shared ownership confusion | Clear domain ownership |
Micro frontends are an organizational scaling pattern first and a technical pattern second.
They should not be introduced only because they sound modern.
They should be introduced when team structure, domain ownership, and release independence justify the complexity.
5. Micro Frontends vs Component Libraries
This is a common interview question.
A component library and a micro frontend are not the same thing.
| Component Library | Micro Frontend |
|---|---|
| Provides reusable UI components | Provides independently deployable frontend apps |
| Shared across teams | Owned by separate teams |
| Imported at build time | Often loaded at runtime |
| Helps UI consistency | Helps team autonomy and release independence |
| Example: Button, Modal, Card | Example: Cart App, Checkout App, Profile App |
A component library gives you reusable building blocks.
A micro frontend gives you independently owned product areas.
You often need both.
Example:
Design System
├── Button
├── Modal
├── Input
├── Card
└── Theme Tokens
Micro Frontends
├── Catalog App uses Design System
├── Cart App uses Design System
└── Checkout App uses Design SystemThe design system keeps the product visually consistent.
The micro frontend architecture keeps teams independently productive.
6. High-Level Micro Frontend Architecture
A common architecture uses a shell app and multiple remote apps.
┌──────────────────────┐
│ Browser │
└──────────┬───────────┘
│
▼
┌──────────────────────┐
│ Shell App │
│ Layout / Auth / Nav │
└───────┬───────┬──────┘
│ │
┌──────────────────┘ └──────────────────┐
▼ ▼
┌─────────────────────────┐ ┌─────────────────────────┐
│ Catalog Remote │ │ Cart Remote │
│ Team: Catalog │ │ Team: Checkout │
└─────────────────────────┘ └─────────────────────────┘
│ │
▼ ▼
┌─────────────────────────┐ ┌─────────────────────────┐
│ Catalog API │ │ Cart API │
└─────────────────────────┘ └─────────────────────────┘The shell app gives the user one unified experience.
The remote apps provide domain-specific functionality.
7. What Is the Shell App?
The shell app, also called the host app, is the container application.
It usually owns:
- Global layout
- Top-level navigation
- Authentication bootstrap
- Top-level routing
- Remote loading
- Feature flag initialization
- Global error boundaries
- Shared page frame
Example:
Shell App
├── Header
├── Sidebar
├── Footer
├── Auth Guard
├── Route Config
└── Remote LoaderThe shell should coordinate the experience, but it should not become a dumping ground for all business logic.
The shell should own composition concerns, not domain business logic.
8. What Is a Remote App?
A remote app is a separately built frontend application that exposes one or more modules to the shell.
Example:
Catalog Remote
├── ProductListPage
├── ProductFilterPanel
├── ProductCard
└── Catalog API Client
Cart Remote
├── CartPage
├── CartDrawer
├── CartSummary
└── Cart API ClientEach remote should own its own domain logic.
For example:
Catalog Remote owns:
- Product listing
- Filters
- Sorting
- Product cards
- Catalog API calls
Cart Remote owns:
- Cart items
- Quantity changes
- Cart summary
- Cart API callsThis keeps ownership clear.
9. Common Micro Frontend Composition Approaches
There are multiple ways to compose micro frontends.
| Approach | How It Works | Best For | Main Risk |
|---|---|---|---|
| Build-time composition | Micro apps are bundled together during build | Simpler setups | Less deployment independence |
| Runtime composition | Shell loads micro apps at runtime | Independent deployment | Runtime loading failures |
| Server-side composition | Server assembles page fragments | SEO/performance control | Server complexity |
| Edge-side composition | CDN/edge composes fragments | Global scale | Operational complexity |
| iframe composition | Apps are isolated inside iframes | Strong isolation | Poor UX and communication |
| Web Components | Apps expose custom elements | Framework flexibility | Tooling and integration complexity |
| Module Federation | Runtime loading of exposed modules | Modern JS apps | Dependency/version complexity |
The most common modern approach in React/webpack ecosystems is runtime composition using Module Federation.
10. What Is Module Federation?
Module Federation is a webpack 5 feature that allows one application to load code exposed by another application at runtime.
In simple terms:
Shell App loads code from Remote App when needed.
Example:
Shell App
└── loads productApp/ProductList from Product RemoteThe remote exposes a module.
The shell consumes it.
Product Remote exposes:
productApp/ProductList
Shell consumes:
productApp/ProductListThis allows teams to deploy remotes independently without rebuilding the shell every time.
11. Host, Remote, and remoteEntry.js
Module Federation has a few important terms.
| Term | Meaning |
|---|---|
| Host | The app that consumes remote modules |
| Remote | The app that exposes modules |
| remoteEntry.js | Runtime manifest used to load remote modules |
| Exposes | Modules made available by the remote |
| Shared | Dependencies shared between host and remote |
| Singleton | A shared dependency loaded only once |
Example:
Shell App
├── loads remoteEntry.js
├── resolves exposed module
├── loads remote bundle
└── renders remote componentRuntime flow:
User opens /products
│
▼
Shell app loads
│
▼
Shell checks route config
│
▼
Shell fetches product remoteEntry.js
│
▼
Product remote bundle loads
│
▼
Product app mounts inside shell
│
▼
Product UI rendersThis is powerful, but it also introduces runtime risk.
If remoteEntry.js fails to load, the shell must handle it gracefully.
12. Runtime Loading Sequence
A typical runtime loading sequence looks like this:
User │ │ opens /products ▼ Browser │ │ loads Shell App ▼ Shell App │ │ checks route config │ identifies Product Listing remote ▼ Remote Manifest / remoteEntry.js │ │ fetch remote bundle ▼ Product Listing Micro App │ │ mounts inside shell container ▼ Product API │ │ fetch product data ▼ Product Listing UI rendered
The key point:
The shell does not need to bundle every micro app at build time. It can load the required remote when the user visits a route or feature.
This improves independent deployment, but it requires strong reliability design.
13. Shared Dependencies
Shared dependencies are libraries used by both the shell and remotes.
Examples:
- React
- React DOM
- Design system
- Utility libraries
- Analytics SDK
- Auth SDK
If shared dependencies are not managed carefully, you can get:
- Duplicate bundles
- Version conflicts
- Runtime crashes
- Inconsistent UI behavior
- Large JavaScript payloads
React and React DOM are often configured as singleton dependencies.
That means the shell and remotes reuse one instance instead of loading multiple copies.
14. Dependency Sharing Best Practices
Use these rules:
- Share only what must be shared.
- Keep versions aligned.
- Use singleton for React and React DOM.
- Avoid sharing unstable business logic.
- Avoid making the shell dependent on remote internals.
- Prefer explicit contracts over hidden imports.
A good dependency policy:
| Dependency Type | Recommendation |
|---|---|
| React / React DOM | Share as singleton |
| Design system | Share with strict versioning |
| Utility helpers | Share carefully |
| Business logic | Keep inside domain remotes |
| API clients | Usually domain-owned |
| Global store | Avoid unless strongly justified |
Over-sharing dependencies can turn independent micro frontends into a tightly coupled distributed monolith.
15. Communication Between Micro Frontends
Micro frontends often need to communicate.
Example:
Cart Remote updates cart count
Shell Header displays cart count
Checkout Remote needs latest cart stateCommon communication patterns:
| Pattern | Use Case | Risk |
|---|---|---|
| URL state | Route-level filters, search params | Limited for complex state |
| Custom events | Loose communication | Hard to debug at scale |
| Event bus | Pub-sub communication | Hidden coupling |
| Backend as source of truth | Business-critical state | More API dependency |
| Browser storage | Simple persistence | Security and sync issues |
| Shared store | Global app state | Tight coupling |
The safest rule:
- Prefer: URL state, Backend state, Explicit event contracts, Small event payloads.
- Avoid: Large shared global stores, Direct imports between remotes, Hidden coupling through browser storage.
If two micro frontends need constant communication, the boundary is probably wrong.
16. Routing in Micro Frontends
Routing must be designed carefully.
A good model is:
Shell owns top-level routes. Remote apps own internal routes.
Example:
Shell owns:
/
/products
/cart
/checkout
/profile
Catalog Remote owns:
/products/list
/products/category/:id
/products/search
Profile Remote owns:
/profile/details
/profile/address
/profile/ordersRouting Models Summary:
| Routing Model | Explanation |
|---|---|
| Shell-owned routing | Shell controls all top-level routes |
| Remote-owned routing | Micro app manages nested routes |
| Hybrid routing | Shell owns top-level, remotes own internal navigation |
Recommended model layout:
Shell owns:
- Global navigation
- Auth guard
- Layout
- Top-level routes
Remote owns:
- Domain screens
- Internal tabs
- Feature-level navigationThis avoids route conflicts and keeps ownership clear.
17. Deep Linking and Refresh
Deep links must work.
If a user opens /products/category/shoes, the system should load:
Shell App
└── Catalog Remote
└── Category PageIf the user refreshes the page, it should still work.
To support this:
- Define route ownership clearly.
- Make remotes aware of their base path.
- Configure server fallback correctly.
- Avoid relying only on in-memory navigation state.
- Use URL state for shareable page state.
Bad architecture:
The page works only when navigated from the home page.
Good architecture:
The page works from direct URL, refresh, bookmark, and shared link.
18. Authentication and Authorization
Authentication should usually be handled by the shell.
The shell can own:
- Login bootstrap
- Token refresh
- Session state
- Global route protection
- Identity context
Remote apps can own:
- Feature-level authorization
- Role-based UI behavior
- Domain API calls
- Permission-aware rendering
Example:
Shell authenticates the user.
Catalog Remote checks whether the user can see restricted products.
Checkout Remote checks whether the user can place orders.
Profile Remote checks whether the user can edit address details.Important point to remember:
The shell may provide identity context, but backend APIs must still enforce authorization. Never trust only frontend checks.
19. Design System and UI Consistency
Micro frontends can easily start looking like different products if there is no design governance.
To avoid this, teams should use:
- Shared design system
- Design tokens
- Common typography scale
- Shared spacing rules
- Common accessibility standards
- Reusable components
- UX review process
Example:
Catalog team should not invent its own button style.
Cart team should not invent its own modal behavior.
Checkout team should not ignore accessibility guidelines.A shared design system helps maintain one user experience across many independently owned apps. But the design system must be stable and versioned carefully. If the design system breaks, many remotes can break.
20. Performance Risks
Micro frontends can hurt performance if designed badly.
| Risk | Cause | Solution |
|---|---|---|
| Duplicate React bundles | Bad shared dependency config | Use singleton shared dependencies |
| Slow initial load | Loading all remotes upfront | Lazy load per route |
| Runtime failure | Remote unavailable | Add fallback UI |
| Layout shift | Remote loads late | Reserve layout space |
| Cache issue | Old remoteEntry.js | Versioned manifest strategy |
| Network waterfall | Too many chunks | Preload critical remotes |
| Large shared libraries | Over-sharing dependencies | Audit bundle size |
Performance strategy rules:
- Lazy load non-critical remotes.
- Preload critical routes.
- Avoid loading every remote upfront.
- Track route-level Web Vitals.
- Monitor remote load time.
- Prevent duplicate dependency bundles.
Micro frontends do not automatically improve performance. They improve ownership. Performance depends on loading strategy, dependency governance, and runtime composition design.
21. Failure Isolation
One micro frontend should not crash the full product.
Example structure:
Shell App
├── Header
├── Navigation
├── Catalog Remote
│ └── Error Boundary
├── Cart Remote
│ └── Error Boundary
└── Checkout Remote
└── Error BoundaryIf the cart remote fails, show fallback UI:
“Cart is temporarily unavailable. Please refresh or try again later.”
The shell should remain functional.
Failure isolation requires:
- Error boundaries
- Fallback UI
- Remote loading timeout
- Retry strategy
- Monitoring
- Graceful degradation
Contrast designs:
| Bad Architecture Design | Good Architecture Design |
|---|---|
| Cart remote fails → entire page crashes. | Cart remote fails → shell stays alive and shows local fallback. |
22. Testing Strategy
Micro frontends need testing at multiple levels.
| Test Type | What It Tests |
|---|---|
| Unit tests | Components and logic inside each remote |
| Contract tests | Shell and remote interface agreement |
| Integration tests | Shell loading remotes correctly |
| E2E tests | Full user journeys across apps |
| Visual regression tests | UI consistency across teams |
| Performance tests | Bundle size, remote loading, Web Vitals |
Contract testing is especially important. It verifies things like:
- Does the remote expose the expected module?
- Does the shell pass the expected props?
- Are event payloads still compatible?
- Did a route contract change?
- Did a shared dependency version break compatibility?
Without contract tests, independent deployment becomes risky.
23. Deployment Strategy
Each micro frontend should ideally have its own deployment pipeline.
Catalog Team Repo ──► CI/CD ──► CDN ──► remoteEntry.js
Cart Team Repo ─────► CI/CD ──► CDN ──► remoteEntry.js
Checkout Team Repo ─► CI/CD ──► CDN ──► remoteEntry.js
Shell App ──────────► Loads remotes at runtimeEach remote should have:
- Independent build
- Independent test suite
- Independent deployment
- Versioned artifact
- Rollback strategy
- Monitoring dashboard
But independent deployment does not mean uncontrolled deployment. You still need:
- Contract validation
- Environment promotion
- Feature flags
- Release health checks
- Version compatibility
- Rollback plan
Independent deployment is only safe when contracts, monitoring, and rollback are designed properly.
24. Rollback Strategy
Rollback is critical in production micro frontend systems.
If the checkout remote breaks, you should not need to redeploy the entire frontend.
Possible rollback strategies:
- Keep previous remote versions available.
- Use versioned remote manifests.
- Pin shell to a known stable remote.
- Use feature flags to disable broken flows.
- Maintain CDN cache strategy carefully.
Example rollback execution flow:
checkout@1.2.0 → broken
rollback to checkout@1.1.9
shell continues loading stable checkout remoteThe rollback process should be tested before production incidents happen.
25. Observability
Micro frontend observability should answer:
- Which remote failed?
- Which version failed?
- Which route failed?
- Which user journey was affected?
- Was it a loading error, runtime error, or API error?
- Did Web Vitals degrade after deployment?
Telemetry metrics to track:
- Remote load failures
- JavaScript errors per remote
- Route-level Web Vitals
- Version health
- Deployment success/failure
- User journey failures
- API failures by domain
Good observability makes debugging possible in a distributed frontend architecture. Without it, teams blame each other during incidents.
26. Migration from Monolith to Micro Frontends
Do not rewrite the full frontend at once.
Use an incremental migration strategy. This is often called the strangler approach.
Migration steps:
- Step 1: Identify domain boundaries.
- Step 2: Choose one low-risk, high-value area.
- Step 3: Extract it as a remote.
- Step 4: Compose it inside the existing app.
- Step 5: Add independent build and deployment.
- Step 6: Add monitoring and fallback.
- Step 7: Repeat with the next domain.
Example Extraction Route Queue:
Start with Product Listing.
Then extract Cart.
Then extract Profile.
Then extract Checkout.Avoid starting with checkout if it is too risky.
A good first candidate is usually:
- Important enough to prove value
- Small enough to extract safely
- Clear domain ownership
- Limited communication with other areas
27. When Not to Use Micro Frontends
Micro frontends are not always the right choice.
Avoid them when:
- The team is small.
- The app is simple.
- The product is early-stage.
- Independent deployment is not needed.
- There are no clear domain boundaries.
- The organization lacks CI/CD maturity.
- The design system is weak.
- The team cannot manage runtime complexity.
In these cases, use a modular monolith. A modular monolith can still be clean:
src/
├── features/
│ ├── catalog/
│ ├── cart/
│ ├── checkout/
│ └── profile/
├── shared/
└── app/This gives structure without distributed runtime complexity.
I would choose a modular monolith until team scale, domain ownership, and release independence justify micro frontends.
28. Common Anti-Patterns
Avoid these mistakes:
| Anti-Pattern | Why It Is Bad |
|---|---|
| Every page is a micro frontend | Overengineering |
| One global Redux store for all remotes | Tight coupling |
| Shell owns all business logic | Shell becomes a new monolith |
| No design system | UI becomes inconsistent |
| No contract testing | Independent releases become unsafe |
| No fallback UI | One remote can break the product |
| No version strategy | Rollback becomes difficult |
| Too much shared dependency logic | Hidden coupling |
| Different teams use random UI frameworks | UX and maintenance pain |
| No observability | Production debugging becomes chaotic |
A simple rule:
If a micro frontend cannot be owned, deployed, monitored, and rolled back independently, the architecture is incomplete.
29. Architect Decision Table
Use this table when designing micro frontends.
| Decision | Recommended Choice | Why |
|---|---|---|
| Composition | Runtime composition | Enables independent deployment |
| Routing | Shell owns top-level routes | Prevents route conflicts |
| Auth | Shell owns login/session bootstrap | Centralized user context |
| State | Local or backend-first | Avoids tight coupling |
| UI consistency | Shared design system | Keeps one product experience |
| Dependency sharing | Minimal + singleton React | Avoids duplication |
| Testing | Contract + E2E | Catches integration failures |
| Deployment | Independent CI/CD | Enables team autonomy |
| Rollback | Versioned remote manifest | Safer recovery |
| Monitoring | Per-remote tracking | Faster debugging |
30. Example: E-commerce Micro Frontend Design
Problem Context:
A large retail company has multiple teams: Catalog Team, Search Team, Cart Team, Checkout Team, Orders Team, Profile Team, and Marketing Team. They all work in one frontend monolith.
Problems include: builds are slow, teams block each other, releases are risky, ownership is unclear, and one bug can delay the full release.
Proposed architecture layout:
┌────────────────────────┐
│ Shell App │
│ Layout | Auth | Nav │
└───────────┬────────────┘
│
┌───────────────────────┼───────────────────────┐
│ │ │
▼ ▼ ▼
┌───────────────┐ ┌───────────────┐ ┌───────────────┐
│ Catalog Remote│ │ Cart Remote │ │ Checkout Remote│
│ Catalog Team │ │ Cart Team │ │ Checkout Team │
└───────┬───────┘ └───────┬───────┘ └───────┬───────┘
│ │ │
▼ ▼ ▼
┌───────────────┐ ┌───────────────┐ ┌───────────────┐
│ Catalog API │ │ Cart API │ │ Payment API │
└───────────────┘ └───────────────┘ └───────────────┘Architecture decisions summary:
| Decision | Choice |
|---|---|
| Composition | Runtime composition |
| Technology | React + Module Federation |
| Routing | Shell-owned top-level routing |
| Shared UI | Design system package |
| Auth | Shell-owned authentication |
| State | Backend-first cart state |
| Communication | URL + explicit events |
| Deployment | Independent remote deployments |
| Reliability | Error boundaries + fallback UI |
| Observability | Per-remote logging and metrics |
This is a strong interview design because it covers ownership, runtime loading, routing, auth, state, deployment, and reliability.
31. Strong Interview Answers
Question: What problem do micro frontends solve?
Micro frontends solve the problem of scaling frontend development across multiple teams.
In a large frontend monolith, all teams work in the same codebase, share the same build pipeline, and depend on the same release cycle. This creates coordination overhead and increases release risk.
With micro frontends, the application is split by business domain. For example, catalog, cart, checkout, orders, and profile can be separate micro apps. Each team can build, test, and deploy independently.
However, micro frontends add complexity in routing, dependency sharing, testing, observability, and deployment. I would only choose them when team autonomy and independent release cycles justify that complexity.
Question: How would you design communication between micro frontends?
I would keep communication minimal and contract-driven.
For route-level state, I would prefer URL parameters. For business-critical state like cart or checkout, I would prefer backend APIs as the source of truth. For simple cross-app notifications, I might use custom events or a small event bus with documented event names and payload shapes.
I would avoid a large shared global store because it tightly couples independently deployed apps.
If two micro frontends need constant communication, I would revisit the domain boundary because they may belong together.
Question: How would you handle failure in a remote app?
I would wrap each remote in an error boundary and provide fallback UI. The shell should not crash just because one remote failed to load.
I would also track remote load errors, runtime errors, and version information in monitoring. For critical flows, I would use feature flags, retry logic, and rollback support.
The goal is graceful degradation. A cart remote failure should affect the cart experience, not the entire product shell.
32. Strong Candidate Phrases
Use these in interviews:
- "Micro frontends are an organizational scaling pattern first and a technical pattern second."
- "I would not choose micro frontends unless team ownership and release independence justify the complexity."
- "The shell should coordinate composition, not become a business-logic dumping ground."
- "If two micro frontends need constant communication, the boundary is probably wrong."
- "Independent deployment requires contract testing, versioning, rollback, and observability."
- "A modular monolith is often better than micro frontends for small teams."
33. Final Revision Checklist
Before choosing micro frontends, ask:
- Do we have multiple frontend teams?
- Are domains clearly separated?
- Do teams need independent deployment?
- Do we have CI/CD maturity?
- Do we have a shared design system?
- Do we have ownership boundaries?
- Can we monitor remote failures?
- Do we have rollback support?
- Can we manage dependency versions?
- Is the added complexity justified?
If most answers are no, choose a modular monolith. If most answers are yes, micro frontends may be a good fit.
34. Summary
Micro frontends are powerful, but they are not free.
They help large organizations split frontend ownership across teams and deploy product areas independently.
A good micro frontend architecture includes:
- Clear domain boundaries
- Shell and remote architecture
- Runtime composition strategy
- Routing ownership
- Authentication design
- Minimal communication
- Shared design system
- Dependency governance
- Contract testing
- Independent deployment
- Rollback strategy
- Observability
- Failure isolation
The best senior engineers do not blindly recommend micro frontends. They explain the tradeoff. They know when to use them. They know when to reject them.
Micro frontends are worth it when frontend team scale and release independence matter more than architectural simplicity.
References
- Micro Frontends — Martin Fowler (https://martinfowler.com/articles/micro-frontends.html)
- Micro Frontends (https://micro-frontends.org)
- webpack Module Federation Documentation (https://webpack.js.org/concepts/module-federation/)
- AWS Prescriptive Guidance: Micro-frontends (https://docs.aws.amazon.com/prescriptive-guidance/latest/micro-frontends-aws/introduction.html)
- Module Federation Official Site (https://module-federation.io)
- Mastering Micro Frontends: 9 Patterns Every Developer Should Know (https://blog.bitsrc.io/mastering-microfrontends-9-patterns-every-developer-should-know-397081673770)