<?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>Forem: Felice Lombardi</title>
    <description>The latest articles on Forem by Felice Lombardi (@managerfx).</description>
    <link>https://forem.com/managerfx</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%2F1212094%2F6592aa7b-b6d0-43e3-98c7-e22ef0a11a9b.jpeg</url>
      <title>Forem: Felice Lombardi</title>
      <link>https://forem.com/managerfx</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/managerfx"/>
    <language>en</language>
    <item>
      <title>What is NOT a Micro-Frontend: Clearing the Confusion</title>
      <dc:creator>Felice Lombardi</dc:creator>
      <pubDate>Fri, 13 Jun 2025 12:57:09 +0000</pubDate>
      <link>https://forem.com/managerfx/cosa-non-e-un-micro-frontend-facciamo-chiarezza-5lh</link>
      <guid>https://forem.com/managerfx/cosa-non-e-un-micro-frontend-facciamo-chiarezza-5lh</guid>
      <description>&lt;p&gt;As a Senior Frontend Architect, I've witnessed countless discussions about micro-frontends where teams mistakenly identify architectural patterns, leading to poor decisions and technical debt.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Pain Point: The Tragedy of Misunderstood Architecture
&lt;/h2&gt;

&lt;p&gt;Let me tell you a story that still haunts me. I was in a crucial architectural meeting where we were deciding the future of our frontend strategy. The lead architect confidently presented their "micro-frontend solution" – and I watched in horror as they described what was essentially a glorified component library.&lt;/p&gt;

&lt;p&gt;"We'll create reusable components," they enthusiastically explained, "the Login component, the Dashboard component, the UserProfile component. Each team can own their components, and we'll have micro-frontends!"&lt;/p&gt;

&lt;p&gt;Fortunately, I managed to catch the problem in time. After hours of discussion and presenting concrete examples, I was able to convince them of the true meaning of what a micro-frontend entails. We'll explore what that means later.&lt;/p&gt;

&lt;p&gt;But that wasn't the worst of it. In another project, I witnessed pure madness: an architect seriously proposing to compose entire pages using multiple iframes. "We'll have the header iframe, the sidebar iframe, the main content iframe, and the footer iframe," they said with a straight face. "Each team can own its iframe!"&lt;/p&gt;

&lt;p&gt;Thankfully, a few days later, they walked back their proposal entirely.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This article aims to prevent that pain by clearly defining what micro-frontends are NOT, so you can avoid these painful mistakes.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Let's clarify what micro-frontends truly are by examining what they are NOT.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Micro-Frontends Are NOT
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ❌ NOT Just Multiple SPAs Behind a Reverse Proxy
&lt;/h3&gt;

&lt;p&gt;Many developers think that having several Single Page Applications (SPAs) running on different ports and routing them through a reverse proxy creates a micro-frontend architecture. This is one of the most common misconceptions.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="c1"&gt;# This is NOT a micro-frontend architecture&lt;/span&gt;
&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="n"&gt;/dashboard&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="kn"&gt;proxy_pass&lt;/span&gt; &lt;span class="s"&gt;http://react-dashboard:3000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="n"&gt;/profile&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="kn"&gt;proxy_pass&lt;/span&gt; &lt;span class="s"&gt;http://vue-profile:3001&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="n"&gt;/billing&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="kn"&gt;proxy_pass&lt;/span&gt; &lt;span class="s"&gt;http://angular-billing:3002&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;Why it fails:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Full page reloads&lt;/strong&gt;: When users navigate from &lt;code&gt;/dashboard&lt;/code&gt; to &lt;code&gt;/profile&lt;/code&gt;, the entire page reloads, breaking the single-page application experience.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No shared state&lt;/strong&gt;: User authentication, cart data, or any global state is lost between applications.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inconsistent UI&lt;/strong&gt;: Each app loads its own CSS, fonts, and UI components, leading to visual flickering and inconsistent design.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance issues&lt;/strong&gt;: Each transition requires downloading new JavaScript bundles, CSS files, and fresh API calls.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Browser history problems&lt;/strong&gt;: Back button behavior becomes unpredictable across different applications.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Real-world analogy&lt;/strong&gt;: It's like having separate websites pretending to be a single application – imagine if Gmail reloaded the entire page every time you switched from Inbox to Compose!&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  ❌ NOT a Component Library or Design System
&lt;/h3&gt;

&lt;p&gt;Another common confusion happens when developers think that using shared UI components from a design system equates to micro-frontends. While component libraries are valuable, they are fundamentally different from micro-frontend architecture.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// This is a component library, NOT a micro-frontend&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;Button&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Modal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;DataTable&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;@company/ui-components&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;UserManagement&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Button&lt;/span&gt; &lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleCreate&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;Create&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Button&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;DataTable&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;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;Why it fails:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Shared dependencies&lt;/strong&gt;: All teams must use the same version of the component library, creating coordination overhead.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No independent deployments&lt;/strong&gt;: If the component library changes, all applications must update and redeploy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Single point of failure&lt;/strong&gt;: A bug in the shared component affects every application that uses it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Limited team autonomy&lt;/strong&gt;: Teams cannot make independent technology choices or significantly customize components.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not business-focused&lt;/strong&gt;: Components are UI building blocks, not complete business functionalities.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Think of it this way&lt;/strong&gt;: Component libraries are like LEGO bricks that everyone shares, but micro-frontends are like complete LEGO sets (spaceship, castle, car) that different teams build and can swap in and out of a larger city.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  ❌ NOT iframe-Based Solutions
&lt;/h3&gt;

&lt;p&gt;While iframes technically allow embedding different applications, they create more problems than they solve and represent an outdated approach that many beginners mistakenly consider "micro-frontends."&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"app-container"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;iframe&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"/dashboard-app"&lt;/span&gt; &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;"100%"&lt;/span&gt; &lt;span class="na"&gt;height=&lt;/span&gt;&lt;span class="s"&gt;"500px"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;iframe&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"/analytics-app"&lt;/span&gt; &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;"100%"&lt;/span&gt; &lt;span class="na"&gt;height=&lt;/span&gt;&lt;span class="s"&gt;"400px"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why it fails:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Styling nightmare&lt;/strong&gt;: Each iframe has its own CSS context, making it impossible to create consistent spacing, fonts, and colors across applications.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Communication barriers&lt;/strong&gt;: Parent and child applications struggle to share data or coordinate actions (like showing loading states).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Accessibility issues&lt;/strong&gt;: Screen readers and keyboard navigation break across iframe boundaries, failing users with disabilities.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance bottlenecks&lt;/strong&gt;: Each iframe loads a complete HTML document with its own CSS and JavaScript, consuming unnecessary resources.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Poor mobile responsiveness&lt;/strong&gt;: Iframes do not play well on mobile devices, leading to scrolling issues and touch interaction problems.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SEO challenges&lt;/strong&gt;: Search engines have difficulty correctly indexing content within iframes.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Real-world comparison&lt;/strong&gt;: Using iframes is like having separate TV screens for each room in your house instead of having one smart TV that can display different content – technically possible but clunky and inefficient.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  ❌ NOT Monorepos with Multiple Apps
&lt;/h3&gt;

&lt;p&gt;Many developers assume that organizing multiple applications within a single repository (monorepo) automatically creates a micro-frontend architecture. This is a fundamental misunderstanding of what micro-frontends represent.&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;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"company-apps"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"workspaces"&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="s2"&gt;"apps/dashboard"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"apps/admin"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"apps/mobile"&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;p&gt;&lt;strong&gt;Why it fails:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Deployment coupling&lt;/strong&gt;: Even if apps are separate, they are often deployed together, defeating the purpose of independent releases.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shared build process&lt;/strong&gt;: All applications typically use the same build tools, Node.js version, and deployment pipeline, limiting technology choices.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code organization ≠ Runtime integration&lt;/strong&gt;: Having separate folders doesn't mean the applications work together as a unified experience.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Missing runtime composition&lt;/strong&gt;: Users still navigate between entirely separate applications rather than seamlessly integrated functionalities.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Coordination overhead&lt;/strong&gt;: Teams still need to coordinate changes, updates, and releases because everything lives in the same repository.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Simple analogy&lt;/strong&gt;: A monorepo with multiple apps is like having separate apartments in the same building – they are organized together but are still completely independent living spaces. Micro-frontends are more like having different rooms in the same house that work together to create a single living experience.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  ❌ NOT Route-Based Code Splitting
&lt;/h3&gt;

&lt;p&gt;This is probably the most subtle misconception. Many developers believe that splitting their application's code based on routes and dynamically loading them creates micro-frontends. While code splitting is an excellent optimization technique, it's not the same as micro-frontend architecture.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// This is code splitting, NOT micro-frontend&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Dashboard&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;lazy&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;./Dashboard&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Profile&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;lazy&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;./Profile&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;App&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Router&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Routes&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Route&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/dashboard&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Dashboard&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;                &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Route&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/profile&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Profile&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Routes&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Router&lt;/span&gt;&lt;span class="err"&gt;&amp;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;Why it fails:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Single deployment unit&lt;/strong&gt;: All code splitting happens within one application that is deployed as a single unit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Single team ownership&lt;/strong&gt;: One team still owns the entire application, including all routes and functionalities.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shared dependencies&lt;/strong&gt;: All route components use the same React version, same build tools, same everything.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build-time splitting&lt;/strong&gt;: The splitting happens when you build the app, not when different teams deploy their functionalities.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Technology lock-in&lt;/strong&gt;: You can't have Dashboard in React and Profile in Vue – everything must use the same technology stack.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Coordination required&lt;/strong&gt;: Adding new routes or changing shared logic still requires coordination with the entire team.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Easy way to remember&lt;/strong&gt;: Code splitting is like having a large closet with organized sections (shirts, pants, shoes) – it's still one closet owned by one person. Micro-frontends are like having separate wardrobes that different people own and manage, but they all contribute to a unified clothing experience.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  What Micro-Frontends Really Are
&lt;/h2&gt;

&lt;p&gt;Micro-frontends are &lt;strong&gt;independently deployable frontend applications&lt;/strong&gt; that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Work together in a single page/browser context.&lt;/li&gt;
&lt;li&gt;Are owned by different teams with full autonomy.&lt;/li&gt;
&lt;li&gt;Are deployed independently without coordination.&lt;/li&gt;
&lt;li&gt;Are integrated at runtime using composition techniques.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ✅ A True Micro-Frontend Example
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Shell application (container)&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;registerApplication&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;start&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;single-spa&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nf"&gt;registerApplication&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;dashboard&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;app&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="nx"&gt;System&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@company/dashboard&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="na"&gt;activeWhen&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;/dashboard&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="nf"&gt;registerApplication&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;user-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;app&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="nx"&gt;System&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@company/user-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;activeWhen&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="p"&gt;});&lt;/span&gt;

&lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Individual micro-frontend (dashboard team)&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&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;react&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="nx"&gt;ReactDOM&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;react-dom&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="nx"&gt;singleSpaReact&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;single-spa-react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Dashboard&lt;/span&gt; &lt;span class="o"&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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Dashboard&lt;/span&gt; &lt;span class="nx"&gt;Content&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;;
&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;lifecycles&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;singleSpaReact&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;ReactDOM&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;rootComponent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Dashboard&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;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;bootstrap&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;mount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;unmount&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;lifecycles&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Key Indicators You're Doing Micro-Frontends Correctly
&lt;/h3&gt;

&lt;p&gt;✅ Different teams can deploy independently.&lt;br&gt;
✅ Applications seamlessly integrate at runtime.&lt;br&gt;
✅ Teams can choose different technologies.&lt;br&gt;
✅ Shared navigation and consistent UX.&lt;br&gt;
✅ Applications can communicate when necessary.&lt;/p&gt;




&lt;h2&gt;
  
  
  When NOT to Use Micro-Frontends
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Small teams (&amp;lt; 3 frontend teams)&lt;/li&gt;
&lt;li&gt;Simple applications&lt;/li&gt;
&lt;li&gt;Tight coupling requirements&lt;/li&gt;
&lt;li&gt;Performance is hyper-critical&lt;/li&gt;
&lt;li&gt;Limited infrastructure resources&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;Micro-frontends solve organizational problems, not technical ones. They enable team autonomy and independent deployment at the cost of increased complexity. Before adopting them, ensure you have the team structure and organizational needs that justify the architectural overhead.&lt;/p&gt;

&lt;p&gt;The key is to understand that micro-frontends are about &lt;strong&gt;runtime integration of independently deployed applications&lt;/strong&gt;, not just splitting code or using multiple technologies.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Definitive Definition
&lt;/h2&gt;

&lt;p&gt;To close this discussion, I'll share the definition from Luca Mezzalira, one of the most respected voices in the micro-frontend community and author of "Building Micro-Frontends":&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Micro-frontends are the technical representation of a business subdomain. They allow independent implementation with the same or different technology. Finally, they should minimise the code shared and owned by other subdomains owned by a single team."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This definition perfectly captures the essence:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Focus on business subdomain&lt;/strong&gt;: Not technical functionalities, but complete business capabilities.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Strong boundaries&lt;/strong&gt;: Clear separation of concerns and responsibilities.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clear contracts&lt;/strong&gt;: Well-defined interfaces for communication.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No shared logic&lt;/strong&gt;: True independence between different subdomains.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When evaluating whether you're building true micro-frontends, ask yourself: "Does this represent a complete business subdomain with its own team, deployment cycle, and clear boundaries?" If the answer is no, you're likely dealing with one of the anti-patterns we've discussed.&lt;/p&gt;




&lt;p&gt;What's your experience with micro-frontends? Have you seen these anti-patterns in your organization? Share your thoughts in the comments below! 👇&lt;/p&gt;

</description>
      <category>microfrontends</category>
      <category>architecture</category>
      <category>frontend</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Angular vs. Blazor WASM: My Architectural Battle for Performance and Scalability!⚔️</title>
      <dc:creator>Felice Lombardi</dc:creator>
      <pubDate>Fri, 06 Jun 2025 13:50:29 +0000</pubDate>
      <link>https://forem.com/managerfx/da-angular-a-blazor-wasm-un-viaggio-nel-frontend-3b36</link>
      <guid>https://forem.com/managerfx/da-angular-a-blazor-wasm-un-viaggio-nel-frontend-3b36</guid>
      <description>&lt;p&gt;As a Technical Architect with years of experience in Angular, I dove headfirst into Blazor WebAssembly. The result? A comparative analysis that goes beyond a simple "what does what": it's a story of how these two platforms tackle the most critical challenges for any architect: &lt;strong&gt;performance&lt;/strong&gt;, &lt;strong&gt;build optimizations&lt;/strong&gt;, and &lt;strong&gt;dependency management&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It's not just about syntax; it's about business impact and scalability. Are you ready to see the cards on the table? 🚀&lt;/p&gt;




&lt;h2&gt;
  
  
  🏎️ Lazy Loading: Who Loads Faster and Better?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Lazy loading&lt;/strong&gt; is our ace up the sleeve for lightning-fast startup times. But how do these two giants implement it?&lt;/p&gt;

&lt;h3&gt;
  
  
  Angular: The Master of JavaScript Modularity 🎯
&lt;/h3&gt;

&lt;p&gt;Angular, with its router, makes lazy loading a breeze. Loading entire &lt;strong&gt;feature modules&lt;/strong&gt; or individual &lt;strong&gt;standalone components&lt;/strong&gt; (thanks Angular 17!) only when needed is a dream for modularization.&lt;/p&gt;

&lt;p&gt;The mechanism is clean: it leverages dynamic ECMAScript &lt;code&gt;import()&lt;/code&gt;. The browser downloads only what's necessary, when it's necessary.&lt;br&gt;
Configuration? A single line in the routing:&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-routing.module.ts&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;routes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Routes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="nx"&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;admin&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="nx"&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;./admin/admin.module&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="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;AdminModule&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="nx"&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;dashboard&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="nx"&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;./dashboard/dashboard.component&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;c&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;DashboardComponent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Angular 17+&lt;/span&gt;
&lt;span class="err"&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;A super-efficient flow that I love.&lt;/p&gt;

&lt;h3&gt;
  
  
  Blazor WebAssembly: Loading DLLs? A New C# Frontier 🌐
&lt;/h3&gt;

&lt;p&gt;Blazor WebAssembly (.NET 5+) brought lazy loading to the .NET world, but the approach is different: we're talking about deferred loading of &lt;strong&gt;assemblies (.dll)&lt;/strong&gt;. Here, I had to reset my mind from the JavaScript paradigm.&lt;/p&gt;

&lt;p&gt;You declare the assembly in the &lt;code&gt;.csproj&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;ItemGroup&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;BlazorWebAssemblyLazyLoad&lt;/span&gt; &lt;span class="na"&gt;Include=&lt;/span&gt;&lt;span class="s"&gt;"MyApp.Features.Admin.dll"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/ItemGroup&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And you manage it programmatically with &lt;code&gt;ILazyAssemblyLoader&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// MyComponent.razor.cs (example)&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Inject&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="n"&gt;ILazyAssemblyLoader&lt;/span&gt; &lt;span class="n"&gt;LazyAssemblyLoader&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt; &lt;span class="nf"&gt;LoadAdminFeature&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;assemblies&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;LazyAssemblyLoader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;LoadAssembliesAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s"&gt;"MyApp.Features.Admin.dll"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="c1"&gt;// ... post-load logic&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Simple, yes, but it requires more manual management at the project level.&lt;/p&gt;




&lt;h3&gt;
  
  
  🚨 The Real Differences in Lazy Loading:
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Characteristic           &lt;/th&gt;
&lt;th&gt;Angular                                 &lt;/th&gt;
&lt;th&gt;Blazor WebAssembly                         &lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Loading Unit&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Module/Chunk (.js), Standalone Component&lt;/td&gt;
&lt;td&gt;Assembly (.dll)                           &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Granularity&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;High (module or component)           &lt;/td&gt;
&lt;td&gt;Limited (assembly level)                 &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Integration&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Natively in the Router                   &lt;/td&gt;
&lt;td&gt;.csproj configuration and C# code         &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Tooling &amp;amp; DX&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Mature (CLI, automatic)                 &lt;/td&gt;
&lt;td&gt;Requires attention to project structure&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;My take here?&lt;/strong&gt; Angular offers an almost magical fluidity in lazy loading thanks to its router integration. Blazor, while powerful, asks you to think more "in terms of .dll files" and less "in terms of UI routes."&lt;/p&gt;




&lt;h2&gt;
  
  
  🌳 Tree Shaking &amp;amp; Dead Code Elimination: Bundle Sizes Under Control?
&lt;/h2&gt;

&lt;p&gt;Optimizing bundle size is vital. Let's see who wins the "dead code" battle.&lt;/p&gt;

&lt;h3&gt;
  
  
  Angular: The Scalpel of JS/TS Tree Shaking ✂️
&lt;/h3&gt;

&lt;p&gt;Angular, with Webpack/esbuild/Vite, is a master of &lt;strong&gt;tree shaking&lt;/strong&gt;. It removes unused JavaScript/TypeScript code thanks to static analysis of ES modules.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; Leaner bundles, reduced loading times. It's a proven mechanism that works great with well-structured code.&lt;/p&gt;

&lt;h3&gt;
  
  
  Blazor WebAssembly: The .NET IL Linker – A Double-Edged Sword 🔪
&lt;/h3&gt;

&lt;p&gt;Blazor WebAssembly relies on the .NET &lt;strong&gt;IL linker&lt;/strong&gt; for "trimming." It analyzes the &lt;strong&gt;CIL bytecode&lt;/strong&gt; to eliminate unreachable classes and methods.&lt;/p&gt;

&lt;p&gt;Enable in &lt;code&gt;.csproj&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;PropertyGroup&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;PublishTrimmed&amp;gt;&lt;/span&gt;true&lt;span class="nt"&gt;&amp;lt;/PublishTrimmed&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;TrimMode&amp;gt;&lt;/span&gt;link&lt;span class="nt"&gt;&amp;lt;/TrimMode&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/PropertyGroup&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;But beware!&lt;/strong&gt; Here I broke a sweat:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Reflection:&lt;/strong&gt; Extensive use of reflection can fool the linker.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Untrimmed Libraries:&lt;/strong&gt; Not all .NET libraries are "trim-friendly."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Warnings:&lt;/strong&gt; Monitoring linker warnings is &lt;strong&gt;FUNDAMENTAL&lt;/strong&gt; to avoid runtime issues. I've seen more than one &lt;code&gt;MissingMethodException&lt;/code&gt;!&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  ⚠️ The Insidious Differences in Tree Shaking:
&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;Angular                                   &lt;/th&gt;
&lt;th&gt;Blazor WebAssembly                                     &lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Basic Technique&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Static JS/TS analysis                     &lt;/td&gt;
&lt;td&gt;IL Linker (CIL bytecode)                               &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Target Language&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;JavaScript                               &lt;/td&gt;
&lt;td&gt;.NET Intermediate Language (CIL)                       &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Effectiveness&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Excellent with ES modules and pure functions&lt;/td&gt;
&lt;td&gt;Good, but compromised by reflection and untrimmed libraries&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Main Risks&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Minimal                                   &lt;/td&gt;
&lt;td&gt;Runtime exceptions if linker is too aggressive   &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;My biggest challenge here?&lt;/strong&gt; Learning to "talk" to the IL linker. It's not an automatic process like JS tree shaking; it requires greater architectural awareness of dependencies.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚙️ AOT vs JIT Compilation: Startup and Performance Under the Magnifying Glass
&lt;/h2&gt;

&lt;p&gt;Compilation is the heart of performance. Here, the two frameworks take radically different paths.&lt;/p&gt;

&lt;h3&gt;
  
  
  Angular: AOT by Default – JavaScript Ready to Go! 🚀
&lt;/h3&gt;

&lt;p&gt;Angular compiles &lt;strong&gt;AOT (Ahead-of-Time)&lt;/strong&gt; by default for production builds. HTML and TypeScript become optimized JavaScript &lt;em&gt;before&lt;/em&gt; the browser sees a single byte of code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Benefits (which I love):&lt;/strong&gt; Fast startup, build-time errors (not runtime!), security, and better tree shaking. The browser downloads code that's already ready for execution.&lt;/p&gt;

&lt;h3&gt;
  
  
  Blazor WebAssembly: JIT by Default, Optional AOT – A Difficult Compromise 🤔
&lt;/h3&gt;

&lt;p&gt;Blazor WebAssembly by default uses &lt;strong&gt;JIT (Just-in-Time)&lt;/strong&gt; compilation: the .NET runtime interprets the CIL code in the browser. This can slow down the initial startup.&lt;/p&gt;

&lt;p&gt;But from .NET 7+, there's &lt;strong&gt;optional AOT&lt;/strong&gt;: CIL is translated into &lt;strong&gt;native WebAssembly&lt;/strong&gt; before deployment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Enable AOT:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;PropertyGroup&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;RunAOTCompilation&amp;gt;&lt;/span&gt;true&lt;span class="nt"&gt;&amp;lt;/RunAOTCompilation&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/PropertyGroup&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Blazor AOT Advantages:&lt;/strong&gt; Incredible runtime performance, less memory consumption.&lt;br&gt;
&lt;strong&gt;Blazor AOT Disadvantages (and this is where the choice becomes critical):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MASSIVE Payload Increase:&lt;/strong&gt; Compiled WebAssembly code is &lt;em&gt;much&lt;/em&gt; larger. This is a trade-off you must justify.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Very Long Build Times:&lt;/strong&gt; AOT compilation is intensive and can extend build times.&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  🤯 Crucial Differences in Compilation:
&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;Angular (AOT)           &lt;/th&gt;
&lt;th&gt;Blazor WASM (JIT Default)                   &lt;/th&gt;
&lt;th&gt;Blazor WASM (Optional AOT)                   &lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Phase&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Build-time             &lt;/td&gt;
&lt;td&gt;Runtime                                     &lt;/td&gt;
&lt;td&gt;Build-time                                   &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Startup&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Fast                 &lt;/td&gt;
&lt;td&gt;Slow (downloads .NET runtime + CIL interpreter)&lt;/td&gt;
&lt;td&gt;Medium (downloads larger native WebAssembly)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Performance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Good (optimized JS) &lt;/td&gt;
&lt;td&gt;Medium (CIL interpretation)                 &lt;/td&gt;
&lt;td&gt;High (native WebAssembly)                     &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Payload Size&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Optimized             &lt;/td&gt;
&lt;td&gt;Medium (.NET Runtime + CIL)                 &lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Very heavy&lt;/strong&gt; (.NET Runtime + WASM)       &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;The architect's dilemma?&lt;/strong&gt; In Blazor, you either accept a slower startup with a contained payload (JIT), or gain runtime speed by heavily sacrificing bundle size (AOT). Angular, on the other hand, offers you the best of both worlds for JavaScript frontend.&lt;/p&gt;


&lt;h2&gt;
  
  
  🧬 Shared Dependency Management: The Double-Edged Sword of Modularity
&lt;/h2&gt;

&lt;p&gt;How do we manage common code? Both have an approach, but with different consequences.&lt;/p&gt;
&lt;h3&gt;
  
  
  Angular: Injector Hierarchy and &lt;code&gt;providedIn: 'root'&lt;/code&gt; – The Singleton Paradigm 🌿
&lt;/h3&gt;

&lt;p&gt;In Angular, &lt;code&gt;SharedModule&lt;/code&gt;s are the norm. The key is the &lt;strong&gt;injector hierarchy&lt;/strong&gt;. I've learned that for global, tree-shakable singleton services, &lt;code&gt;providedIn: 'root'&lt;/code&gt; is a blessing:&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;// my-singleton.service.ts&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="err"&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="c1"&gt;// Singleton and tree-shakable&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;MySingletonService&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="cm"&gt;/* ... */&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Without this, you risk multiple instances of services in lazy-loaded modules, a classic mistake to avoid.&lt;/p&gt;

&lt;h3&gt;
  
  
  Blazor WebAssembly: Shared Projects and Linker Constraints – .NET in the Browser 🏗️
&lt;/h3&gt;

&lt;p&gt;Blazor uses .NET class libraries (&lt;code&gt;.dll&lt;/code&gt;) for code sharing (&lt;code&gt;MyApp.Shared&lt;/code&gt;). It seems familiar to .NET developers, but...&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Beware of the pitfalls!&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Payload:&lt;/strong&gt; Even a small part of a DLL can drag the entire assembly into the bundle, unless the linker works miracles.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Incompatible Dependencies:&lt;/strong&gt; I've spent hours debugging &lt;code&gt;System.IO.File&lt;/code&gt; or Entity Framework Core magically appearing in the browser and crashing everything! Server-side APIs don't live well in WebAssembly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trimming:&lt;/strong&gt; Shared libraries must be &lt;em&gt;trim-friendly&lt;/em&gt; or the linker won't do its job.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  💡 Best Practices and Architectural Considerations: My Lessons from the Field
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Angular:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Services:&lt;/strong&gt; Always &lt;code&gt;providedIn: 'root'&lt;/code&gt; for singletons.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Modularity:&lt;/strong&gt; Logical, lazy-loaded.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bundle Analysis:&lt;/strong&gt; Webpack Bundle Analyzer is my best friend.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;UI Performance:&lt;/strong&gt; &lt;code&gt;OnPush&lt;/code&gt; change detection where possible.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Blazor WebAssembly:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Shared Projects:&lt;/strong&gt; Minimal and lightweight, only DTOs and strictly client-side logic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Isolate Dependencies:&lt;/strong&gt; No server-centric dependencies on the client!&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Linker:&lt;/strong&gt; Configure it aggressively and monitor IL warnings.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reflection:&lt;/strong&gt; Use it extremely sparingly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AOT:&lt;/strong&gt; Evaluate it only for critical performance needs, aware of the payload increase.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Conclusion of the "Duel" 🥊
&lt;/h2&gt;

&lt;p&gt;Angular and Blazor WebAssembly are both thoroughbreds for client-side development, but with different souls.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Angular:&lt;/strong&gt; Maturity, refined integration of lazy loading and tree shaking, solid ground for those seeking robustness and a vast ecosystem.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Blazor WebAssembly:&lt;/strong&gt; The excitement of bringing C# to the browser. A flat learning curve for .NET devs, but requires constant vigilance on dependency management and runtime/compilation implications.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;As an architect, my choice is never "one or the other" upfront.&lt;/strong&gt; It depends on project requirements, team expertise, and tolerance for compromises.&lt;/p&gt;




&lt;h2&gt;
  
  
  🤯 Final Thoughts from an Architect: When I Wouldn't Use...
&lt;/h2&gt;

&lt;p&gt;This is the most important part for me: &lt;strong&gt;when is a framework not the best solution?&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  I wouldn't use Blazor WebAssembly if...
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Absolute priority on initial load and mini bundles:&lt;/strong&gt; The .NET runtime, while optimized, can be an obstacle for sites requiring an almost instantaneous "first paint."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Maximum runtime performance with high computational loads (without AOT):&lt;/strong&gt; If I cannot accept the AOT payload increase, default CIL interpretation might not be enough for intensive calculations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extended frontend ecosystem and mature UI libraries:&lt;/strong&gt; For very specific UI/UX needs, the Blazor ecosystem, while growing, is still less supplied than the JavaScript one.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  I wouldn't use Angular if...
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Small, rapid projects or prototypes:&lt;/strong&gt; Its opinionated structure and "boilerplate" can slow down contexts where prototyping speed is the absolute priority. Angular can be "overkill."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Team with little frontend experience or preference for other paradigms:&lt;/strong&gt; The learning curve for TypeScript, RxJS, and complex DI can be steep. If the team prefers more minimalist libraries, Angular might not be the right choice.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Maximum end-to-end C# code reuse:&lt;/strong&gt; If the goal is to reuse C# business logic between backend and frontend, Angular obviously doesn't offer this intrinsic advantage.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;And you? What have been your experiences or your "never agains" with Angular or Blazor WebAssembly? I'm curious to hear your perspectives! 👇&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  🔗 Useful Resources (For those who want to dig deeper!):
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://angular.io/guide/lazy-loading-modules" rel="noopener noreferrer"&gt;Angular - Lazy-loading feature modules&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/aspnet/core/blazor/webassembly-lazy-load-assemblies?view=aspnetcore-8.0" rel="noopener noreferrer"&gt;Microsoft Docs - Lazy load assemblies in Blazor WebAssembly&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.google.com/search?q=https://angular.io/guide/build%23tree-shaking" rel="noopener noreferrer"&gt;Angular - Tree shaking guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.google.com/search?q=https://learn.microsoft.com/en-us/dotnet/core/deploying/trim-self-contained%3Fpivots%3Ddotnet-8-0" rel="noopener noreferrer"&gt;Microsoft Docs - Trim self-contained deployments and executables&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://angular.io/guide/aot-compiler" rel="noopener noreferrer"&gt;Angular - Ahead-of-Time (AOT) compilation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.google.com/search?q=https://learn.microsoft.com/en-us/aspnet/core/blazor/webassembly-aot-compilation%3Fview%3Daspnetcore-8.0" rel="noopener noreferrer"&gt;Microsoft Docs - ASP.NET Core Blazor WebAssembly AOT compilation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>balzor</category>
      <category>angular</category>
      <category>dotnet</category>
      <category>performance</category>
    </item>
  </channel>
</rss>
