<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Hemant Singh</title>
    <description>The latest articles on DEV Community by Hemant Singh (@hemant_singh_17817ad00a62).</description>
    <link>https://dev.to/hemant_singh_17817ad00a62</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1866895%2F4a43f932-a960-4685-9f79-ff789b214023.jpg</url>
      <title>DEV Community: Hemant Singh</title>
      <link>https://dev.to/hemant_singh_17817ad00a62</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hemant_singh_17817ad00a62"/>
    <language>en</language>
    <item>
      <title>From Monorepo to Polyrepo: Scaling Micro-Frontends Across Teams</title>
      <dc:creator>Hemant Singh</dc:creator>
      <pubDate>Fri, 24 Oct 2025 05:17:22 +0000</pubDate>
      <link>https://dev.to/hemant_singh_17817ad00a62/from-monorepo-to-polyrepo-scaling-micro-frontends-across-teams-5bap</link>
      <guid>https://dev.to/hemant_singh_17817ad00a62/from-monorepo-to-polyrepo-scaling-micro-frontends-across-teams-5bap</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F78q2vq7o4vooaha8hj8w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F78q2vq7o4vooaha8hj8w.png" alt="MFE" width="800" height="421"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  From Monorepo to Polyrepo: Scaling Micro-Frontends Across Teams
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;In my &lt;a href="https://dev.to/hemant_singh_17817ad00a62/building-scalable-applications-with-micro-frontends-a-practical-guide-87n"&gt;previous article&lt;/a&gt;, I explored building scalable applications with micro-frontends using a &lt;strong&gt;monorepo&lt;/strong&gt; approach powered by Nx. While that approach works incredibly well for small-to-medium teams with shared ownership, I've since explored a &lt;strong&gt;polyrepo&lt;/strong&gt; architecture that better addresses enterprise-scale challenges.&lt;/p&gt;

&lt;p&gt;In this article, I'll share why I made the switch, the trade-offs involved, and real-world implementation details from a production deployment.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎯 The Journey: From Monorepo to Polyrepo
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Previous Approach: Monorepo
&lt;/h3&gt;

&lt;p&gt;In the monorepo setup:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Everything lives in one repository&lt;/li&gt;
&lt;li&gt;✅ Nx manages dependencies and builds&lt;/li&gt;
&lt;li&gt;✅ Shared libraries are TypeScript path aliases&lt;/li&gt;
&lt;li&gt;✅ Easy local development&lt;/li&gt;
&lt;li&gt;✅ Atomic commits across multiple MFEs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example Structure:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mfeworld/                          # Single repository
├── apps/
│   ├── dashboard/                 # Host application
│   ├── products/                  # Remote MFE
│   ├── cart/                      # Remote MFE
│   ├── orders/                    # Remote MFE
│   └── profile/                   # Remote MFE
├── libs/
│   └── shared/
│       ├── layout/               # Shared components
│       ├── services/             # Shared services
│       └── utils/                # Shared utilities
└── nx.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This worked great for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Small teams (&amp;lt; 20 developers)&lt;/li&gt;
&lt;li&gt;Shared ownership model&lt;/li&gt;
&lt;li&gt;Rapid prototyping&lt;/li&gt;
&lt;li&gt;Consistent tooling and dependencies&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  New Approach: Polyrepo
&lt;/h3&gt;

&lt;p&gt;Now, each micro-frontend and the shared UI Kit live in &lt;strong&gt;separate repositories&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;📦 Host Repository
├── https://github.com/hemantajax/mfe-host

📦 Shared UI Kit Repository
├── https://github.com/hemantajax/mfe-uikit
└── Published as: @hemantajax/mfe-uikit

📦 Remote MFE Repositories (8 separate repos)
├── products/      → https://hemantajax.github.io/mfedemos/products/
├── cart/          → https://hemantajax.github.io/mfedemos/cart/
├── profile/       → https://hemantajax.github.io/mfedemos/profile/
├── orders/        → https://hemantajax.github.io/mfedemos/orders/
├── analytics/     → https://hemantajax.github.io/mfedemos/analytics/
├── notifications/ → https://hemantajax.github.io/mfedemos/notifications/
├── messages/      → https://hemantajax.github.io/mfedemos/messages/
└── admin/         → https://hemantajax.github.io/mfedemos/admin/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔗 &lt;strong&gt;&lt;a href="https://hemantajax.github.io/mfe-host/" rel="noopener noreferrer"&gt;Live Demo&lt;/a&gt;&lt;/strong&gt; - See it in action!&lt;/p&gt;




&lt;h2&gt;
  
  
  🤔 Why Polyrepo? The Business Case
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Team Autonomy &amp;amp; Ownership&lt;/strong&gt; 🎯
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem in Monorepo:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;All teams share the same repository&lt;/li&gt;
&lt;li&gt;PR bottlenecks when multiple teams work simultaneously&lt;/li&gt;
&lt;li&gt;Difficult to enforce team boundaries&lt;/li&gt;
&lt;li&gt;Shared CI/CD pipeline can block deployments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Polyrepo Solution:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Products team owns their repo completely&lt;/span&gt;
products/
  ├── .github/workflows/       &lt;span class="c"&gt;# Their own CI/CD&lt;/span&gt;
  ├── src/                     &lt;span class="c"&gt;# Their code&lt;/span&gt;
  └── package.json             &lt;span class="c"&gt;# Their dependencies&lt;/span&gt;

&lt;span class="c"&gt;# Cart team owns their repo&lt;/span&gt;
cart/
  ├── .github/workflows/       &lt;span class="c"&gt;# Independent CI/CD&lt;/span&gt;
  ├── src/                     &lt;span class="c"&gt;# Their code&lt;/span&gt;
  └── package.json             &lt;span class="c"&gt;# Their dependencies&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each team can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Set their own release schedule&lt;/li&gt;
&lt;li&gt;✅ Choose their own tooling (within agreed standards)&lt;/li&gt;
&lt;li&gt;✅ Deploy independently&lt;/li&gt;
&lt;li&gt;✅ Control their own PR process&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  2. &lt;strong&gt;Independent Deployment Pipeline&lt;/strong&gt; 🚀
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Monorepo Challenge:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Single pipeline for all apps&lt;/span&gt;
&lt;span class="na"&gt;build-all&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;Build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;dashboard, products, cart, orders... (15+ minutes)&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;Test&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;All apps&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;Deploy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;If ANY app fails, ALL deployments block&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Polyrepo Advantage:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Products team deploys independently&lt;/span&gt;
&lt;span class="na"&gt;products-pipeline&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;Build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;products only (3 minutes)&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;Test&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;products only&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;Deploy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;products to CDN&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;✅ No impact on other teams&lt;/span&gt;

&lt;span class="c1"&gt;# Cart team deploys at the same time&lt;/span&gt;
&lt;span class="na"&gt;cart-pipeline&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;Build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;cart only (2 minutes)&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;Test&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;cart only&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;Deploy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;cart to CDN&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;✅ Completely independent&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Real-world Impact:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deployment frequency increased from &lt;strong&gt;2-3 times/week&lt;/strong&gt; to &lt;strong&gt;10+ times/day&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Build time per MFE: &lt;strong&gt;2-5 minutes&lt;/strong&gt; vs. &lt;strong&gt;15-20 minutes&lt;/strong&gt; for entire monorepo&lt;/li&gt;
&lt;li&gt;Failed builds don't block other teams&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  3. &lt;strong&gt;Technology Flexibility&lt;/strong&gt; 🛠️
&lt;/h3&gt;

&lt;p&gt;While our current stack is Angular 18, polyrepo allows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Host: Angular 18&lt;/span&gt;
&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;({...})&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;HostApp&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="c1"&gt;// Products MFE: Angular 18 + Latest Features&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;computed&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@angular/core&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Cart MFE: Could use React (future flexibility)&lt;/span&gt;
&lt;span class="c1"&gt;// No impact on other MFEs as long as Module Federation contract is maintained&lt;/span&gt;

&lt;span class="c1"&gt;// Profile MFE: Could use Vue (if needed)&lt;/span&gt;
&lt;span class="c1"&gt;// Each MFE is truly independent&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Real Example:&lt;/strong&gt;&lt;br&gt;
One team wanted to experiment with Angular's latest signal-based forms (experimental), while others preferred stable APIs. In polyrepo, this is trivial—each team controls their own &lt;code&gt;package.json&lt;/code&gt;.&lt;/p&gt;


&lt;h3&gt;
  
  
  4. &lt;strong&gt;Granular Access Control&lt;/strong&gt; 🔐
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Enterprise Requirements:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Financial services company scenario&lt;/span&gt;
products/          &lt;span class="c"&gt;# Public team (20 developers)&lt;/span&gt;
cart/              &lt;span class="c"&gt;# Public team (15 developers)&lt;/span&gt;
admin/             &lt;span class="c"&gt;# Restricted (5 senior developers only)&lt;/span&gt;
analytics/         &lt;span class="c"&gt;# Data team only (GDPR/compliance)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With separate repositories:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ GitHub permissions per repo&lt;/li&gt;
&lt;li&gt;✅ Different security policies per MFE&lt;/li&gt;
&lt;li&gt;✅ Audit trail per team&lt;/li&gt;
&lt;li&gt;✅ Branch protection rules per team preference&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  5. &lt;strong&gt;Clearer Versioning &amp;amp; Dependencies&lt;/strong&gt; 📦
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Shared UI Kit Approach:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Published as npm package&lt;/span&gt;
@hemantajax/mfe-uikit@1.2.3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Products MFE (package.json)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;dependencies&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@hemantajax/mfe-uikit&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;^1.2.0&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Cart MFE (package.json) - Can use different version&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;dependencies&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@hemantajax/mfe-uikit&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;^1.1.0&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;  &lt;span class="c1"&gt;// Still on older version&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Semantic versioning for shared code&lt;/li&gt;
&lt;li&gt;✅ Teams upgrade at their own pace&lt;/li&gt;
&lt;li&gt;✅ No "big bang" upgrades across all apps&lt;/li&gt;
&lt;li&gt;✅ Backward compatibility testing becomes explicit&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ⚖️ Trade-offs: The Honest Truth
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Advantages of Polyrepo ✅
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;Monorepo&lt;/th&gt;
&lt;th&gt;Polyrepo&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Team Autonomy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Low - Shared repo&lt;/td&gt;
&lt;td&gt;High - Independent repos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Deployment Speed&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Slow - Build everything&lt;/td&gt;
&lt;td&gt;Fast - Build only what changed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Independent Deployments&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Difficult&lt;/td&gt;
&lt;td&gt;Easy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Technology Flexibility&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Constrained&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Access Control&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Repository-level only&lt;/td&gt;
&lt;td&gt;Per-MFE granular&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CI/CD Pipeline&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Single, complex&lt;/td&gt;
&lt;td&gt;Multiple, simple&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Version Management&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Implicit via monorepo&lt;/td&gt;
&lt;td&gt;Explicit via npm versions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Onboarding New Teams&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;One repo to clone&lt;/td&gt;
&lt;td&gt;Multiple repos (more setup)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Team Scaling&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Difficult beyond 20-30 devs&lt;/td&gt;
&lt;td&gt;Easy to scale to 100+ devs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  Disadvantages of Polyrepo ❌
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. &lt;strong&gt;More Complex Setup&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Monorepo:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone mfeworld
npm &lt;span class="nb"&gt;install
&lt;/span&gt;nx serve dashboard  &lt;span class="c"&gt;# Everything works&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Polyrepo:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Clone multiple repositories&lt;/span&gt;
git clone mfe-host
git clone mfe-uikit

&lt;span class="c"&gt;# Each MFE team clones their own repo&lt;/span&gt;
git clone products
git clone cart
...

&lt;span class="c"&gt;# Install dependencies in each&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;mfe-host &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm &lt;span class="nb"&gt;install
cd&lt;/span&gt; ../products &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm &lt;span class="nb"&gt;install
cd&lt;/span&gt; ../cart &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Mitigation:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use workspace management tools (meta, git submodules)&lt;/li&gt;
&lt;li&gt;Provide setup scripts&lt;/li&gt;
&lt;li&gt;Docker Compose for local development
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# docker-compose.yml&lt;/span&gt;
&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;host&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./mfe-host&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;4200:4200'&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;products&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./products&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;4201:4201'&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;cart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./cart&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;4202:4202'&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h4&gt;
  
  
  2. &lt;strong&gt;Shared Code Management&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Monorepo:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Direct imports, no publishing needed&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;HeaderComponent&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@nxmfe/shared/layout&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Polyrepo:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Must publish to npm/GitHub Packages&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;HeaderComponent&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@hemantajax/mfe-uikit&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Requires:&lt;/span&gt;
&lt;span class="c1"&gt;// 1. Build UI Kit&lt;/span&gt;
&lt;span class="c1"&gt;// 2. Publish to registry&lt;/span&gt;
&lt;span class="c1"&gt;// 3. Update version in consuming MFEs&lt;/span&gt;
&lt;span class="c1"&gt;// 4. npm install in each MFE&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Mitigation:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Automated publishing via GitHub Actions&lt;/li&gt;
&lt;li&gt;Semantic versioning&lt;/li&gt;
&lt;li&gt;Changelog automation&lt;/li&gt;
&lt;li&gt;Consider using Renovate Bot for dependency updates
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# .github/workflows/publish-uikit.yml&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Publish UI Kit&lt;/span&gt;
&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;main&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;publish&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm ci&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nx build uikit&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm publish dist/libs/uikit&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h4&gt;
  
  
  3. &lt;strong&gt;Cross-Cutting Changes&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Scenario:&lt;/strong&gt; Update authentication logic across all MFEs&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Monorepo:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Single PR affects all apps&lt;/span&gt;
nx run-many &lt;span class="nt"&gt;--target&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="nt"&gt;--all&lt;/span&gt;    &lt;span class="c"&gt;# Test everything&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"feat: update auth"&lt;/span&gt;  &lt;span class="c"&gt;# One commit&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Polyrepo:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Update UI Kit&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;mfe-uikit
&lt;span class="c"&gt;# Make changes to AuthService&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"feat: update auth"&lt;/span&gt;
npm version minor  &lt;span class="c"&gt;# 1.2.0 → 1.3.0&lt;/span&gt;
git push

&lt;span class="c"&gt;# 2. Update each MFE (8 separate PRs!)&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;products
npm update @hemantajax/mfe-uikit@latest
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"chore: update uikit"&lt;/span&gt;

&lt;span class="nb"&gt;cd &lt;/span&gt;cart
npm update @hemantajax/mfe-uikit@latest
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"chore: update uikit"&lt;/span&gt;
&lt;span class="c"&gt;# ... repeat for 6 more MFEs&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Mitigation:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Automation scripts for bulk updates&lt;/li&gt;
&lt;li&gt;Renovate Bot for automatic PR creation&lt;/li&gt;
&lt;li&gt;Feature flags for gradual rollout&lt;/li&gt;
&lt;li&gt;Backward compatible changes&lt;/li&gt;
&lt;/ul&gt;




&lt;h4&gt;
  
  
  4. &lt;strong&gt;Testing Integration&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Monorepo:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Easy to run integration tests&lt;/span&gt;
nx run-many &lt;span class="nt"&gt;--target&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;e2e &lt;span class="nt"&gt;--all&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Polyrepo:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Need separate integration test repository&lt;/li&gt;
&lt;li&gt;Must coordinate MFE versions&lt;/li&gt;
&lt;li&gt;More complex CI/CD orchestration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Separate integration-tests repository&lt;/span&gt;
integration-tests/
  ├── tests/
  │   ├── user-journey.spec.ts     &lt;span class="c"&gt;# Test across MFEs&lt;/span&gt;
  │   └── checkout-flow.spec.ts
  └── playwright.config.ts

&lt;span class="c"&gt;# Uses deployed versions&lt;/span&gt;
playwright.config.ts:
  use: &lt;span class="o"&gt;{&lt;/span&gt;
    baseURL: &lt;span class="s1"&gt;'https://hemantajax.github.io/mfe-host/'&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h4&gt;
  
  
  5. &lt;strong&gt;Debugging Across Repositories&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Monorepo:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Single IDE workspace&lt;/li&gt;
&lt;li&gt;Easy to set breakpoints across apps&lt;/li&gt;
&lt;li&gt;Cmd+Click to jump between files&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Polyrepo:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Multiple IDE windows&lt;/li&gt;
&lt;li&gt;Need to use &lt;code&gt;npm link&lt;/code&gt; for local UI Kit development&lt;/li&gt;
&lt;li&gt;Debugging shared code requires linking&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Workflow:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Develop UI Kit locally&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;mfe-uikit
npm &lt;span class="nb"&gt;link&lt;/span&gt;

&lt;span class="c"&gt;# Link in consuming MFE&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; ../products
npm &lt;span class="nb"&gt;link&lt;/span&gt; @hemantajax/mfe-uikit

&lt;span class="c"&gt;# Make changes, see updates in real-time&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; ../mfe-uikit
&lt;span class="c"&gt;# Edit code → products automatically picks up changes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🏗️ Architecture Deep Dive
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Module Federation Configuration
&lt;/h3&gt;

&lt;p&gt;The magic that makes it all work:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Host Application (mfe-host):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// module-federation.config.prod.ts&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;shell&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;remotes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;products&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://hemantajax.github.io/mfedemos/products/remoteEntry.mjs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;cart&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://hemantajax.github.io/mfedemos/cart/remoteEntry.mjs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;profile&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://hemantajax.github.io/mfedemos/profile/remoteEntry.mjs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;orders&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://hemantajax.github.io/mfedemos/orders/remoteEntry.mjs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;analytics&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://hemantajax.github.io/mfedemos/analytics/remoteEntry.mjs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;notifications&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://hemantajax.github.io/mfedemos/notifications/remoteEntry.mjs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;messages&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://hemantajax.github.io/mfedemos/messages/remoteEntry.mjs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;admin&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://hemantajax.github.io/mfedemos/admin/remoteEntry.mjs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Route Configuration:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// app.routes.ts&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;appRoutes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Route&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;products&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;loadChildren&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;products/Routes&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;remoteRoutes&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;cart&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;loadChildren&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;cart/Routes&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;remoteRoutes&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="c1"&gt;// ... other routes&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Shared UI Kit Strategy
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Publishing Workflow:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Single npm Package&lt;/strong&gt; (&lt;code&gt;@hemantajax/mfe-uikit&lt;/code&gt;)&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Contains all shared components, services, utilities&lt;/li&gt;
&lt;li&gt;Versioned independently&lt;/li&gt;
&lt;li&gt;Published to GitHub Packages (or npm)&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Internal Organization&lt;/strong&gt; (in UI Kit repo)
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mfe-uikit/
├── libs/
│   ├── layout/          # Header, Footer, Sidebar
│   ├── components/      # Buttons, Forms, Cards
│   ├── services/        # API, Auth, Storage
│   ├── utils/           # Helper functions
│   ├── pipes/           # Custom pipes
│   ├── directives/      # Custom directives
│   └── uikit/           # ⭐ Meta package (re-exports all)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Usage in MFEs:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Before (monorepo):&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;HeaderComponent&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@nxmfe/shared/layout&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;AuthService&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@nxmfe/shared/services&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// After (polyrepo):&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;HeaderComponent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;AuthService&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@hemantajax/mfe-uikit&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Benefits:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Single version to manage&lt;/li&gt;
&lt;li&gt;✅ One &lt;code&gt;npm install&lt;/code&gt; command&lt;/li&gt;
&lt;li&gt;✅ Simpler imports&lt;/li&gt;
&lt;li&gt;✅ Can still organize code internally&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📊 Real-World Metrics
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Before (Monorepo)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Repository size:&lt;/strong&gt; 500MB (with .git)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Full build time:&lt;/strong&gt; 18 minutes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CI pipeline:&lt;/strong&gt; 25 minutes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deployments:&lt;/strong&gt; 2-3 times per week&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PR review time:&lt;/strong&gt; 2-3 days (bottleneck)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Teams blocked:&lt;/strong&gt; Often&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  After (Polyrepo)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Repository size:&lt;/strong&gt; 50-80MB per repo&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MFE build time:&lt;/strong&gt; 2-5 minutes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CI pipeline per MFE:&lt;/strong&gt; 5-8 minutes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deployments:&lt;/strong&gt; 10+ times per day (per team)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PR review time:&lt;/strong&gt; Same day&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Teams blocked:&lt;/strong&gt; Never&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🚀 When to Choose Polyrepo?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Choose Polyrepo When:
&lt;/h3&gt;

&lt;p&gt;✅ &lt;strong&gt;You have multiple independent teams&lt;/strong&gt; (3+ teams)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Each team owns specific features/domains&lt;/li&gt;
&lt;li&gt;Teams want different release schedules&lt;/li&gt;
&lt;li&gt;Teams are in different time zones&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ &lt;strong&gt;You need independent deployments&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Can't afford monorepo build times&lt;/li&gt;
&lt;li&gt;Need to deploy hotfixes to single MFE&lt;/li&gt;
&lt;li&gt;Different apps have different SLAs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ &lt;strong&gt;Enterprise requirements&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Need granular access control&lt;/li&gt;
&lt;li&gt;Compliance/security boundaries&lt;/li&gt;
&lt;li&gt;Different teams have different tech stacks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ &lt;strong&gt;Scaling beyond 20-30 developers&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PR bottlenecks in shared repo&lt;/li&gt;
&lt;li&gt;Difficult to coordinate releases&lt;/li&gt;
&lt;li&gt;CI/CD pipeline too complex&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Choose Monorepo When:
&lt;/h3&gt;

&lt;p&gt;✅ &lt;strong&gt;Small team&lt;/strong&gt; (&amp;lt; 20 developers)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Everyone can review all PRs&lt;/li&gt;
&lt;li&gt;Shared ownership model works&lt;/li&gt;
&lt;li&gt;Coordinated releases are preferred&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ &lt;strong&gt;Rapid prototyping&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Quick iteration across multiple apps&lt;/li&gt;
&lt;li&gt;Frequent refactoring of shared code&lt;/li&gt;
&lt;li&gt;Atomic commits across apps are valuable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ &lt;strong&gt;Simple deployment&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Can afford to build everything&lt;/li&gt;
&lt;li&gt;Single deployment schedule works&lt;/li&gt;
&lt;li&gt;Less infrastructure complexity&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🛠️ Implementation Checklist
&lt;/h2&gt;

&lt;p&gt;If you're migrating from monorepo to polyrepo:&lt;/p&gt;

&lt;h3&gt;
  
  
  Phase 1: Preparation
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Identify team boundaries&lt;/li&gt;
&lt;li&gt;[ ] Define shared code strategy&lt;/li&gt;
&lt;li&gt;[ ] Set up package registry (npm, GitHub Packages)&lt;/li&gt;
&lt;li&gt;[ ] Plan repository structure&lt;/li&gt;
&lt;li&gt;[ ] Document architecture decisions&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Phase 2: Extract Shared Code
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Create UI Kit repository&lt;/li&gt;
&lt;li&gt;[ ] Migrate shared libraries&lt;/li&gt;
&lt;li&gt;[ ] Set up automated publishing&lt;/li&gt;
&lt;li&gt;[ ] Test package installation&lt;/li&gt;
&lt;li&gt;[ ] Document shared API&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Phase 3: Split Micro-Frontends
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Create repo for each MFE&lt;/li&gt;
&lt;li&gt;[ ] Migrate code and dependencies&lt;/li&gt;
&lt;li&gt;[ ] Set up individual CI/CD&lt;/li&gt;
&lt;li&gt;[ ] Update Module Federation configs&lt;/li&gt;
&lt;li&gt;[ ] Test remote loading&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Phase 4: Update Host
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Update remote URLs&lt;/li&gt;
&lt;li&gt;[ ] Update production configs&lt;/li&gt;
&lt;li&gt;[ ] Test integration&lt;/li&gt;
&lt;li&gt;[ ] Set up monitoring&lt;/li&gt;
&lt;li&gt;[ ] Document deployment process&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Phase 5: Developer Experience
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Create setup scripts&lt;/li&gt;
&lt;li&gt;[ ] Write comprehensive docs&lt;/li&gt;
&lt;li&gt;[ ] Set up local development workflow&lt;/li&gt;
&lt;li&gt;[ ] Automate dependency updates&lt;/li&gt;
&lt;li&gt;[ ] Train teams&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔧 Developer Experience Tips
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Local Development Setup
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Use &lt;code&gt;npm link&lt;/code&gt; for UI Kit development:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Terminal 1: UI Kit (watch mode)&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;mfe-uikit
npm run build:watch

&lt;span class="c"&gt;# Terminal 2: Link UI Kit&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;mfe-uikit
npm &lt;span class="nb"&gt;link&lt;/span&gt;

&lt;span class="c"&gt;# Terminal 3: Products MFE&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;products
npm &lt;span class="nb"&gt;link&lt;/span&gt; @hemantajax/mfe-uikit
npm start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  2. Automated Dependency Updates
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Renovate Bot Configuration:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"extends"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"config:base"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"packageRules"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"matchPackagePatterns"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"@hemantajax/mfe-uikit"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"groupName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"UI Kit"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"automerge"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"automergeType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"pr"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  3. Integration Testing
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Separate test repository:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// integration-tests/tests/checkout.spec.ts&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;test&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;expect&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@playwright/test&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;complete checkout flow&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Navigate to host&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;goto&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://hemantajax.github.io/mfe-host/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// Interact with products MFE&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;goto&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/products&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;click&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;[data-testid="add-to-cart"]&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// Interact with cart MFE&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;goto&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/cart&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;locator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;[data-testid="cart-item"]&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;toBeVisible&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="c1"&gt;// Interact with orders MFE&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;click&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;[data-testid="checkout"]&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;goto&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/orders&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;locator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;[data-testid="order-success"]&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;toBeVisible&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  📚 Resources
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Live Demo &amp;amp; Source Code
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Demo:&lt;/strong&gt; &lt;a href="https://hemantajax.github.io/mfe-host/" rel="noopener noreferrer"&gt;https://hemantajax.github.io/mfe-host/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Host Repo:&lt;/strong&gt; &lt;a href="https://github.com/hemantajax/mfe-host" rel="noopener noreferrer"&gt;https://github.com/hemantajax/mfe-host&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;UI Kit Repo:&lt;/strong&gt; &lt;a href="https://github.com/hemantajax/mfe-uikit" rel="noopener noreferrer"&gt;https://github.com/hemantajax/mfe-uikit&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Remote MFEs (Deployed)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Products: &lt;a href="https://hemantajax.github.io/mfedemos/products/" rel="noopener noreferrer"&gt;https://hemantajax.github.io/mfedemos/products/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Cart: &lt;a href="https://hemantajax.github.io/mfedemos/cart/" rel="noopener noreferrer"&gt;https://hemantajax.github.io/mfedemos/cart/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Profile: &lt;a href="https://hemantajax.github.io/mfedemos/profile/" rel="noopener noreferrer"&gt;https://hemantajax.github.io/mfedemos/profile/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Orders: &lt;a href="https://hemantajax.github.io/mfedemos/orders/" rel="noopener noreferrer"&gt;https://hemantajax.github.io/mfedemos/orders/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Analytics: &lt;a href="https://hemantajax.github.io/mfedemos/analytics/" rel="noopener noreferrer"&gt;https://hemantajax.github.io/mfedemos/analytics/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Notifications: &lt;a href="https://hemantajax.github.io/mfedemos/notifications/" rel="noopener noreferrer"&gt;https://hemantajax.github.io/mfedemos/notifications/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Messages: &lt;a href="https://hemantajax.github.io/mfedemos/messages/" rel="noopener noreferrer"&gt;https://hemantajax.github.io/mfedemos/messages/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Admin: &lt;a href="https://hemantajax.github.io/mfedemos/admin/" rel="noopener noreferrer"&gt;https://hemantajax.github.io/mfedemos/admin/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Related Articles
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/hemant_singh_17817ad00a62/building-scalable-applications-with-micro-frontends-a-practical-guide-87n"&gt;Building Scalable Applications with Micro-Frontends (Monorepo)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🎯 Conclusion
&lt;/h2&gt;

&lt;p&gt;The shift from &lt;strong&gt;monorepo to polyrepo&lt;/strong&gt; wasn't just about technology—it was about &lt;strong&gt;empowering teams&lt;/strong&gt; to work independently while maintaining a cohesive architecture.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Takeaways:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Polyrepo isn't inherently better than monorepo&lt;/strong&gt;—it's a trade-off based on team size and organizational needs&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Start with monorepo&lt;/strong&gt; if you're a small team or prototyping—the simplicity is worth it&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Migrate to polyrepo&lt;/strong&gt; when team boundaries become clear and independent deployments become critical&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Invest in tooling&lt;/strong&gt; to mitigate polyrepo complexity (automation, scripts, docs)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Module Federation&lt;/strong&gt; makes polyrepo micro-frontends feasible—without it, this architecture would be painful&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  What Would I Do Differently?
&lt;/h3&gt;

&lt;p&gt;Looking back, I would:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Create the UI Kit earlier&lt;/strong&gt; - Even in monorepo, a separate UI Kit would have helped with versioning&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Automate more&lt;/strong&gt; - Set up Renovate Bot and deployment automation from day one&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Better documentation&lt;/strong&gt; - Invest in comprehensive setup guides before splitting repos&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Integration tests first&lt;/strong&gt; - Have strong integration test coverage before splitting&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  💬 Discussion
&lt;/h2&gt;

&lt;p&gt;What's your experience with monorepo vs. polyrepo? Have you tried micro-frontends in your organization?&lt;/p&gt;

&lt;p&gt;I'd love to hear about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What challenges did you face?&lt;/li&gt;
&lt;li&gt;What would you do differently?&lt;/li&gt;
&lt;li&gt;Any tips for teams considering this architecture?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Drop a comment below! 👇&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Follow me for more:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Twitter: &lt;a href="https://twitter.com/hemantajax" rel="noopener noreferrer"&gt;@hemantajax&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/hemantajax" rel="noopener noreferrer"&gt;@hemantajax&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;LinkedIn: &lt;a href="https://linkedin.com/in/hemantajax" rel="noopener noreferrer"&gt;Hemant Singh&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; #microfrontends #angular #architecture #modulefederation #webpack #nx #monorepo #polyrepo #webdev #javascript #typescript #frontend&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This article is based on real production experience migrating a medium-sized team from monorepo to polyrepo architecture. All code examples and demos are available in the linked repositories.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>microfrontends</category>
      <category>angular</category>
      <category>architecture</category>
      <category>modulefederation</category>
    </item>
    <item>
      <title>Building Scalable Applications with Micro-Frontends: A Practical Guide</title>
      <dc:creator>Hemant Singh</dc:creator>
      <pubDate>Mon, 20 Oct 2025 10:13:03 +0000</pubDate>
      <link>https://dev.to/hemant_singh_17817ad00a62/building-scalable-applications-with-micro-frontends-a-practical-guide-87n</link>
      <guid>https://dev.to/hemant_singh_17817ad00a62/building-scalable-applications-with-micro-frontends-a-practical-guide-87n</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F78q2vq7o4vooaha8hj8w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F78q2vq7o4vooaha8hj8w.png" alt="MFE" width="800" height="421"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Deployment structure ( MFE Demo ):
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Host: &lt;a href="https://hemantajax.github.io/mfedemos/" rel="noopener noreferrer"&gt;https://hemantajax.github.io/mfedemos/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Remotes:&lt;br&gt;
 • products: &lt;a href="https://hemantajax.github.io/mfedemos/products/" rel="noopener noreferrer"&gt;https://hemantajax.github.io/mfedemos/products/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;• cart: &lt;a href="https://hemantajax.github.io/mfedemos/cart/" rel="noopener noreferrer"&gt;https://hemantajax.github.io/mfedemos/cart/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;• profile: &lt;a href="https://hemantajax.github.io/mfedemos/profile/" rel="noopener noreferrer"&gt;https://hemantajax.github.io/mfedemos/profile/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;• orders: &lt;a href="https://hemantajax.github.io/mfedemos/orders/" rel="noopener noreferrer"&gt;https://hemantajax.github.io/mfedemos/orders/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;• analytics: &lt;a href="https://hemantajax.github.io/mfedemos/analytics/" rel="noopener noreferrer"&gt;https://hemantajax.github.io/mfedemos/analytics/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;• notifications: &lt;a href="https://hemantajax.github.io/mfedemos/notifications/" rel="noopener noreferrer"&gt;https://hemantajax.github.io/mfedemos/notifications/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;• messages: &lt;a href="https://hemantajax.github.io/mfedemos/messages/" rel="noopener noreferrer"&gt;https://hemantajax.github.io/mfedemos/messages/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;• admin: &lt;a href="https://hemantajax.github.io/mfedemos/admin/" rel="noopener noreferrer"&gt;https://hemantajax.github.io/mfedemos/admin/&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;In today's fast-paced development landscape, building scalable and maintainable applications is crucial. &lt;strong&gt;Micro-frontends&lt;/strong&gt; extend the microservices concept to frontend development, allowing teams to work independently while delivering a unified user experience.&lt;/p&gt;

&lt;p&gt;In this article, I'll share a practical approach to building micro-frontend applications using &lt;strong&gt;Angular 20&lt;/strong&gt;, &lt;strong&gt;Module Federation&lt;/strong&gt;, and &lt;strong&gt;Nx Workspace&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  🎯 What You'll Learn
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Creating a Host (Shell) application&lt;/li&gt;
&lt;li&gt;Building Remote micro-frontend applications&lt;/li&gt;
&lt;li&gt;Local development setup&lt;/li&gt;
&lt;li&gt;Production deployment strategy&lt;/li&gt;
&lt;li&gt;Sharing services across micro-frontends&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🏗️ Architecture Overview
&lt;/h2&gt;

&lt;p&gt;A micro-frontend architecture consists of:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Host Application&lt;/strong&gt; (Shell): The main application that orchestrates everything&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Remote Applications&lt;/strong&gt;: Independent micro-frontends loaded dynamically&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shared Libraries&lt;/strong&gt;: Common code, utilities, and services&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa165p66u83mah1tigien.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa165p66u83mah1tigien.png" alt="Micro-Frontend Architecture" width="800" height="421"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The diagram above shows how the Host (Shell) application dynamically loads multiple remote micro-frontends, all sharing common services and state management.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  📦 Step 1: Creating the Host Application
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// one time only&lt;/span&gt;
&lt;span class="nx"&gt;npx&lt;/span&gt; &lt;span class="nx"&gt;nx&lt;/span&gt; &lt;span class="nx"&gt;g&lt;/span&gt; &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;nx&lt;/span&gt;&lt;span class="sr"&gt;/angular:setup-mf mfeui --mfType=host --port=420&lt;/span&gt;&lt;span class="err"&gt;0
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The host application is your main shell that loads remote micro-frontends dynamically.&lt;/p&gt;

&lt;h3&gt;
  
  
  Module Federation Config (Host)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// module-federation.config.ts&lt;/span&gt;
&lt;span class="kr"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mfeui&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;remotes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;products&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;http://localhost:4201&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;cart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;http://localhost:4202&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;profile&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;http://localhost:4203&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;orders&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;http://localhost:4204&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Routing Configuration
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// app.routes.ts&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;appRoutes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Route&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;products&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;loadChildren&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;products/Routes&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;remoteRoutes&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;cart&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;loadChildren&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;cart/Routes&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;remoteRoutes&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="c1"&gt;// ... more routes&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔧 Step 2: Creating Remote Applications
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;npx&lt;/span&gt; &lt;span class="nx"&gt;nx&lt;/span&gt; &lt;span class="nx"&gt;g&lt;/span&gt; &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;nx&lt;/span&gt;&lt;span class="sr"&gt;/angular:remote apps/&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;remote&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="nx"&gt;host&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;mfeui&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="nx"&gt;port&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;PORT&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;scss&lt;/span&gt;

&lt;span class="c1"&gt;// Ex.&lt;/span&gt;
&lt;span class="nx"&gt;npx&lt;/span&gt; &lt;span class="nx"&gt;nx&lt;/span&gt; &lt;span class="nx"&gt;g&lt;/span&gt; &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;nx&lt;/span&gt;&lt;span class="sr"&gt;/angular:remote apps/&lt;/span&gt;&lt;span class="nx"&gt;products&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="nx"&gt;host&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;mfeui&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="nx"&gt;port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4201&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;scss&lt;/span&gt;

&lt;span class="nx"&gt;npx&lt;/span&gt; &lt;span class="nx"&gt;nx&lt;/span&gt; &lt;span class="nx"&gt;g&lt;/span&gt; &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;nx&lt;/span&gt;&lt;span class="sr"&gt;/angular:remote apps/&lt;/span&gt;&lt;span class="nx"&gt;cart&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="nx"&gt;host&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;mfeui&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="nx"&gt;port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4202&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;scss&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each remote is an independent Angular application that can be developed, tested, and deployed separately.&lt;/p&gt;

&lt;h3&gt;
  
  
  Module Federation Config (Remote)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// module-federation.config.ts (products remote)&lt;/span&gt;
&lt;span class="kr"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;products&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;exposes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./Routes&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;apps/products/src/app/remote-entry/entry.routes.ts&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Remote Entry Component
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// remote-entry.component.ts&lt;/span&gt;
&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;app-products-entry&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;template&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`
    &amp;lt;div class="container mt-4"&amp;gt;
      &amp;lt;h2&amp;gt;Products Micro-Frontend&amp;lt;/h2&amp;gt;
      &amp;lt;router-outlet&amp;gt;&amp;lt;/router-outlet&amp;gt;
    &amp;lt;/div&amp;gt;
  `&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;changeDetection&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ChangeDetectionStrategy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;OnPush&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;RemoteEntryComponent&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  💻 Local Development
&lt;/h2&gt;

&lt;p&gt;Running your micro-frontends locally is straightforward:&lt;/p&gt;

&lt;h3&gt;
  
  
  Start Individual Applications
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Terminal 1 - Host&lt;/span&gt;
nx serve mfeui &lt;span class="nt"&gt;--port&lt;/span&gt; 4200

&lt;span class="c"&gt;# Terminal 2 - Products Remote&lt;/span&gt;
nx serve products &lt;span class="nt"&gt;--port&lt;/span&gt; 4201

&lt;span class="c"&gt;# Terminal 3 - Cart Remote&lt;/span&gt;
nx serve cart &lt;span class="nt"&gt;--port&lt;/span&gt; 4202
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Start All at Once
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Use the development script&lt;/span&gt;
npm start

&lt;span class="c"&gt;# This runs all applications concurrently:&lt;/span&gt;
&lt;span class="c"&gt;# - Host (mfeui): http://localhost:4200&lt;/span&gt;
&lt;span class="c"&gt;# - Products: http://localhost:4201&lt;/span&gt;
&lt;span class="c"&gt;# - Cart: http://localhost:4202&lt;/span&gt;
&lt;span class="c"&gt;# - Profile: http://localhost:4203&lt;/span&gt;
&lt;span class="c"&gt;# - Orders: http://localhost:4204&lt;/span&gt;
&lt;span class="c"&gt;# - Analytics: http://localhost:4205&lt;/span&gt;
&lt;span class="c"&gt;# - Notifications: http://localhost:4206&lt;/span&gt;
&lt;span class="c"&gt;# - Messages: http://localhost:4207&lt;/span&gt;
&lt;span class="c"&gt;# - Admin: http://localhost:4208&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The host will automatically load remotes from their respective ports during development.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 Production Deployment
&lt;/h2&gt;

&lt;p&gt;For production, the configuration changes to use absolute URLs:&lt;/p&gt;

&lt;h3&gt;
  
  
  Production Module Federation Config
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// module-federation.config.prod.ts&lt;/span&gt;
&lt;span class="kr"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mfeui&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;remotes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;products&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://hemantajax.github.io/mfedemos/products/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;cart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://hemantajax.github.io/mfedemos/cart/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;profile&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://hemantajax.github.io/mfedemos/profile/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;orders&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://hemantajax.github.io/mfedemos/orders/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;analytics&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://hemantajax.github.io/mfedemos/analytics/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;notifications&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://hemantajax.github.io/mfedemos/notifications/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://hemantajax.github.io/mfedemos/messages/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;admin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://hemantajax.github.io/mfedemos/admin/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Build for Production
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Build host&lt;/span&gt;
nx build mfeui &lt;span class="nt"&gt;--configuration&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;production

&lt;span class="c"&gt;# Build remotes&lt;/span&gt;
nx build products &lt;span class="nt"&gt;--configuration&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;production
nx build cart &lt;span class="nt"&gt;--configuration&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;production
&lt;span class="c"&gt;# ... etc&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Deployment Structure
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://hemantajax.github.io/mfedemos/
├── index.html (Host)
├── products/
│   └── remoteEntry.js
├── cart/
│   └── remoteEntry.js
├── profile/
│   └── remoteEntry.js
└── ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔄 Sharing Services Across Micro-Frontends
&lt;/h2&gt;

&lt;p&gt;One of the most powerful features is sharing state and services across micro-frontends. This is where the magic happens!&lt;/p&gt;

&lt;h3&gt;
  
  
  Shared Service Architecture
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// libs/shared/services/src/lib/state.service.ts&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Injectable&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;signal&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@angular/core&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Injectable&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;providedIn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;root&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;StateService&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Shared state using Angular signals&lt;/span&gt;
  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;cartItemsSignal&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;signal&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nx"&gt;cartItems&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cartItemsSignal&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;asReadonly&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="nf"&gt;addToCart&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cartItemsSignal&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nf"&gt;removeFromCart&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cartItemsSignal&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Using Shared Services
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;In Products Remote:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ProductListComponent&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;stateService&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;inject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;StateService&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nf"&gt;addToCart&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;product&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Product&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Add product logic...&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stateService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addToCart&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;In Cart Remote:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CartComponent&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;stateService&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;inject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;StateService&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nx"&gt;cartItems&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stateService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cartItems&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nf"&gt;removeItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;CartItem&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Remove item logic...&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stateService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;removeFromCart&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;In Host Navigation:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;NavbarComponent&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;stateService&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;inject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;StateService&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nx"&gt;cartCount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stateService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cartItems&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Real-World Example
&lt;/h3&gt;

&lt;p&gt;For a complete guide on implementing shared services with state management, event communication, and best practices, check out:&lt;/p&gt;

&lt;p&gt;📚 &lt;strong&gt;&lt;a href="https://github.com/hemantajax/mfedemos/blob/main/docs/SHARED_SERVICES_GUIDE.md" rel="noopener noreferrer"&gt;Shared Services Guide&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This guide covers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ State management across micro-frontends&lt;/li&gt;
&lt;li&gt;✅ Event-driven communication&lt;/li&gt;
&lt;li&gt;✅ Service singleton patterns&lt;/li&gt;
&lt;li&gt;✅ Best practices and gotchas&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📊 Benefits We've Achieved
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Independent Development&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Teams work on separate micro-frontends without conflicts&lt;/li&gt;
&lt;li&gt;Each team owns their deployment pipeline&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. &lt;strong&gt;Scalability&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Add new features as new micro-frontends&lt;/li&gt;
&lt;li&gt;Scale teams independently&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. &lt;strong&gt;Technology Flexibility&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Different versions of Angular (if needed)&lt;/li&gt;
&lt;li&gt;Different UI libraries per micro-frontend&lt;/li&gt;
&lt;li&gt;Gradual migration capabilities&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. &lt;strong&gt;Performance&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Lazy loading of micro-frontends&lt;/li&gt;
&lt;li&gt;Load only what users need&lt;/li&gt;
&lt;li&gt;Reduced initial bundle size&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. &lt;strong&gt;Maintainability&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Smaller codebases per micro-frontend&lt;/li&gt;
&lt;li&gt;Easier to understand and modify&lt;/li&gt;
&lt;li&gt;Better test coverage&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🎓 Key Takeaways
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Start Simple&lt;/strong&gt;: Begin with a host and 2-3 remotes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shared Libraries&lt;/strong&gt;: Create shared code for common functionality&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Service Communication&lt;/strong&gt;: Use singleton services for cross-micro-frontend communication&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Environment Configs&lt;/strong&gt;: Separate configs for local and production&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentation&lt;/strong&gt;: Keep your architecture documented (crucial for team onboarding)&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  🔗 Live Demo &amp;amp; Source Code
&lt;/h2&gt;

&lt;p&gt;Want to see it in action?&lt;/p&gt;

&lt;p&gt;🌐 &lt;strong&gt;Live Demo&lt;/strong&gt;: &lt;a href="https://hemantajax.github.io/mfedemos/" rel="noopener noreferrer"&gt;https://hemantajax.github.io/mfedemos/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;💻 &lt;strong&gt;Source Code&lt;/strong&gt;: &lt;a href="https://github.com/hemantajax/mfedemos" rel="noopener noreferrer"&gt;https://github.com/hemantajax/mfedemos&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Explore the Documentation:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;📖 &lt;a href="https://github.com/hemantajax/mfedemos/blob/main/docs/DOCUMENTATION_INDEX.md" rel="noopener noreferrer"&gt;Complete Documentation Index&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🔧 &lt;a href="https://github.com/hemantajax/mfedemos/blob/main/docs/SHARED_SERVICES_GUIDE.md" rel="noopener noreferrer"&gt;Shared Services Guide&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🏗️ &lt;a href="https://github.com/hemantajax/mfedemos/blob/main/docs/LIBRARIES_ARCHITECTURE.md" rel="noopener noreferrer"&gt;Libraries Architecture&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🚀 &lt;a href="https://github.com/hemantajax/mfedemos/blob/main/docs/PORT_GUIDE.md" rel="noopener noreferrer"&gt;Port Guide&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  💬 Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Micro-frontends are not just about splitting code – they're about enabling team autonomy, improving scalability, and creating a more maintainable architecture.&lt;/p&gt;

&lt;p&gt;The learning curve is worth it, especially for large-scale applications with multiple teams.&lt;/p&gt;




</description>
      <category>microfrontend</category>
      <category>angular</category>
      <category>modulefederation</category>
      <category>architecture</category>
    </item>
  </channel>
</rss>
