<?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: Mridu Dixit</title>
    <description>The latest articles on Forem by Mridu Dixit (@mridudixit15).</description>
    <link>https://forem.com/mridudixit15</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%2F3096442%2F535779bc-1a98-4480-ae58-c932dda29b3a.png</url>
      <title>Forem: Mridu Dixit</title>
      <link>https://forem.com/mridudixit15</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/mridudixit15"/>
    <language>en</language>
    <item>
      <title>Stop Calling Functions in Angular Templates — It’s Slower Than You Think</title>
      <dc:creator>Mridu Dixit</dc:creator>
      <pubDate>Wed, 01 Apr 2026 14:25:42 +0000</pubDate>
      <link>https://forem.com/mridudixit15/stop-calling-functions-in-angular-templates-its-slower-than-you-think-3b1j</link>
      <guid>https://forem.com/mridudixit15/stop-calling-functions-in-angular-templates-its-slower-than-you-think-3b1j</guid>
      <description>&lt;p&gt;Calling functions in Angular templates looks clean:&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;p&amp;gt;&lt;/span&gt;{{ getFullName() }}&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But this pattern has a hidden cost.&lt;/p&gt;

&lt;p&gt;It’s not about correctness — it’s about how often Angular executes that function.&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚙️ What’s Really Happening
&lt;/h2&gt;

&lt;p&gt;Angular does not cache template function calls.&lt;/p&gt;

&lt;p&gt;Every change detection cycle re-evaluates:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;{{ getFullName() }}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Even if:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the data hasn’t changed&lt;/li&gt;
&lt;li&gt;the result is identical&lt;/li&gt;
&lt;li&gt;nothing visible updates&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The function still runs.&lt;/p&gt;

&lt;h2&gt;
  
  
  🚨 Why This Becomes a Problem
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Change Detection Runs More Than You Think&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Triggered by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;user interactions&lt;/li&gt;
&lt;li&gt;async events&lt;/li&gt;
&lt;li&gt;signals updating&lt;/li&gt;
&lt;li&gt;parent component changes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each trigger = function execution again.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;It Explodes Inside Lists&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&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;li&lt;/span&gt; &lt;span class="na"&gt;*ngFor=&lt;/span&gt;&lt;span class="s"&gt;"let user of users"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  {{ getFullName(user) }}
&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;100 items = 100 executions&lt;br&gt;
Per cycle.&lt;/p&gt;

&lt;p&gt;Now add:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;filtering&lt;/li&gt;
&lt;li&gt;formatting&lt;/li&gt;
&lt;li&gt;derived calculations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s where performance quietly degrades.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Cost Is Invisible Until It’s Not&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The real issue isn’t small functions — it’s what they turn into over time.&lt;/p&gt;

&lt;p&gt;Today:&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="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tomorrow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;formatting&lt;/li&gt;
&lt;li&gt;conditionals&lt;/li&gt;
&lt;li&gt;nested logic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Same template. Very different cost.&lt;/p&gt;

&lt;h2&gt;
  
  
  ❌ The Problem Pattern
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nf"&gt;getFullName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;User&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="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;firstName&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;lastName&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&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;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;{{ getFullName(user) }}&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Looks harmless. Scales poorly.&lt;/p&gt;

&lt;h2&gt;
  
  
  ✅ Better Patterns
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Precompute Values&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;user&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="nx"&gt;rawUser&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;fullName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;rawUser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;firstName&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;rawUser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;lastName&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&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 html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;{{ user.fullName }}&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Simple. Predictable. Fast.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Use Signals (computed)&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="nx"&gt;fullName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;computed&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
  &lt;span class="s2"&gt;`&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="nf"&gt;user&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;firstName&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &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="nf"&gt;user&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;lastName&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&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 html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;{{ fullName() }}&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Recomputes only when dependencies change.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Use Pure Pipes&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&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;p&amp;gt;&lt;/span&gt;{{ user | fullName }}&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pure pipes are memoized by Angular — they don’t recompute unnecessarily.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧠 When Is It Actually Okay?
&lt;/h2&gt;

&lt;p&gt;Template function calls are acceptable if:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the logic is trivial&lt;/li&gt;
&lt;li&gt;not inside loops&lt;/li&gt;
&lt;li&gt;not called frequently&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But in most real apps:&lt;/p&gt;

&lt;p&gt;Template functions are a scaling risk, not an immediate bug.&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚡ Rule of Thumb
&lt;/h2&gt;

&lt;p&gt;If it’s inside a template:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;assume it runs many times&lt;/li&gt;
&lt;li&gt;keep it cheap or precomputed&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🔥 Final Thought
&lt;/h2&gt;

&lt;p&gt;Angular performance isn’t about micro-optimizations.&lt;/p&gt;

&lt;p&gt;It’s about predictability.&lt;/p&gt;

&lt;p&gt;Templates should describe UI —&lt;br&gt;
not execute logic repeatedly.&lt;/p&gt;

&lt;p&gt;What feels clean now can become your slowest path later.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>angular</category>
      <category>programming</category>
      <category>javascript</category>
    </item>
    <item>
      <title>You Don’t Need NgRx Anymore — Or Do You?</title>
      <dc:creator>Mridu Dixit</dc:creator>
      <pubDate>Tue, 17 Mar 2026 18:12:53 +0000</pubDate>
      <link>https://forem.com/mridudixit15/you-dont-need-ngrx-anymore-or-do-you-237c</link>
      <guid>https://forem.com/mridudixit15/you-dont-need-ngrx-anymore-or-do-you-237c</guid>
      <description>&lt;p&gt;For years, NgRx was the go-to solution for state management in Angular.&lt;/p&gt;

&lt;p&gt;Actions.&lt;br&gt;
Reducers.&lt;br&gt;
Effects.&lt;br&gt;
Selectors.&lt;/p&gt;

&lt;p&gt;It brought structure, predictability, and scalability.&lt;/p&gt;

&lt;p&gt;But Angular has changed.&lt;/p&gt;

&lt;p&gt;With Signals, simpler services, and better reactivity, many developers are asking:&lt;/p&gt;

&lt;p&gt;Do we still need NgRx?&lt;/p&gt;

&lt;p&gt;The answer isn’t a simple yes or no.&lt;/p&gt;


&lt;h2&gt;
  
  
  🚀 Why NgRx Was So Popular
&lt;/h2&gt;

&lt;p&gt;NgRx solved real problems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Centralized state&lt;/li&gt;
&lt;li&gt;Predictable data flow&lt;/li&gt;
&lt;li&gt;Debugging with DevTools&lt;/li&gt;
&lt;li&gt;Great for large, complex apps&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For enterprise-scale applications, this structure was a lifesaver.&lt;/p&gt;



&lt;p&gt;⚡ What Changed in Angular&lt;/p&gt;

&lt;p&gt;Modern Angular introduced:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Signals (signal, computed, effect)&lt;/li&gt;
&lt;li&gt;Better component-level state&lt;/li&gt;
&lt;li&gt;Cleaner reactivity without heavy RxJS&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example without NgRx:&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="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="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UserStore&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;users&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="nx"&gt;User&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="nx"&gt;activeUsers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;computed&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;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;users&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;u&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;active&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nf"&gt;setUsers&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;[])&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;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&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;No reducers.&lt;br&gt;
No actions.&lt;br&gt;
No boilerplate.&lt;/p&gt;

&lt;p&gt;Just state + logic.&lt;/p&gt;




&lt;h2&gt;
  
  
  🤔 So… Do You Still Need NgRx?
&lt;/h2&gt;

&lt;p&gt;❌ &lt;strong&gt;You Probably DON’T Need NgRx If:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your app is small to medium&lt;/li&gt;
&lt;li&gt;State is mostly local or feature-based&lt;/li&gt;
&lt;li&gt;You don’t need time-travel debugging&lt;/li&gt;
&lt;li&gt;You prefer simpler, faster development&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Signals + services are often enough.&lt;/p&gt;




&lt;p&gt;✅ &lt;strong&gt;You STILL Need NgRx If:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You have a large enterprise app&lt;/li&gt;
&lt;li&gt;Multiple teams work on the same codebase&lt;/li&gt;
&lt;li&gt;State is deeply shared and complex&lt;/li&gt;
&lt;li&gt;You need strict patterns and tooling&lt;/li&gt;
&lt;li&gt;Debugging state transitions is critical&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;NgRx shines in complex systems, not simple apps.&lt;/p&gt;




&lt;p&gt;⚠️ T*&lt;em&gt;he Real Problem: Over-Engineering&lt;/em&gt;*&lt;/p&gt;

&lt;p&gt;Many apps adopted NgRx too early.&lt;/p&gt;

&lt;p&gt;Result:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Too much boilerplate&lt;/li&gt;
&lt;li&gt;Slower development&lt;/li&gt;
&lt;li&gt;Harder onboarding&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Using NgRx for simple state is like:&lt;/p&gt;

&lt;p&gt;using a microservices architecture for a to-do app&lt;/p&gt;




&lt;h2&gt;
  
  
  🔥 Signals vs NgRx — The Real Difference
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Signals&lt;/strong&gt;                             &lt;strong&gt;NgRx&lt;/strong&gt;&lt;br&gt;
Simple                             Structured&lt;br&gt;
Minimal boilerplate            Heavy boilerplate&lt;br&gt;
Great for local state              Great for global state&lt;br&gt;
Easy to learn   Steeper            learning curve&lt;/p&gt;

&lt;p&gt;This is not a replacement — it’s a tradeoff.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 The Better Approach
&lt;/h2&gt;

&lt;p&gt;You don’t have to choose one.&lt;/p&gt;

&lt;p&gt;Use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Signals for local/component state&lt;/li&gt;
&lt;li&gt;NgRx for global, complex workflows
This hybrid approach works best in real apps.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ⚡ A Practical Rule
&lt;/h2&gt;

&lt;p&gt;👉 Start with Signals&lt;br&gt;
👉 Add NgRx only when complexity demands it&lt;/p&gt;

&lt;p&gt;Not the other way around.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔚 Final Thought
&lt;/h2&gt;

&lt;p&gt;NgRx is not outdated.&lt;/p&gt;

&lt;p&gt;But it’s no longer the default.&lt;/p&gt;

&lt;p&gt;Angular has evolved — and so should your approach to state management.&lt;/p&gt;

&lt;p&gt;The real skill isn’t choosing a tool.&lt;/p&gt;

&lt;p&gt;It’s knowing when you actually need it.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>signal</category>
      <category>ngrx</category>
      <category>angular</category>
    </item>
    <item>
      <title>Signals Made Angular Faster — But Also Easier to Misuse</title>
      <dc:creator>Mridu Dixit</dc:creator>
      <pubDate>Wed, 18 Feb 2026 16:06:39 +0000</pubDate>
      <link>https://forem.com/mridudixit15/signals-made-angular-faster-but-also-easier-to-misuse-2dii</link>
      <guid>https://forem.com/mridudixit15/signals-made-angular-faster-but-also-easier-to-misuse-2dii</guid>
      <description>&lt;p&gt;Angular Signals changed everything.&lt;/p&gt;

&lt;p&gt;No more heavy RxJS for simple state.&lt;br&gt;
No more manual subscriptions everywhere.&lt;br&gt;
Finer-grained reactivity.&lt;br&gt;
Better performance.&lt;/p&gt;

&lt;p&gt;But here’s the uncomfortable truth:&lt;/p&gt;

&lt;p&gt;Signals made Angular faster — and also much easier to misuse.&lt;/p&gt;

&lt;p&gt;Let’s talk about where developers are getting it wrong.&lt;/p&gt;
&lt;h2&gt;
  
  
  🚀 Why Signals Are Powerful
&lt;/h2&gt;

&lt;p&gt;Signals give Angular:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fine-grained reactivity&lt;/li&gt;
&lt;li&gt;Automatic dependency tracking&lt;/li&gt;
&lt;li&gt;Cleaner state management&lt;/li&gt;
&lt;li&gt;Better compatibility with zoneless apps&lt;/li&gt;
&lt;/ul&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;count = signal(0);

increment() {
  this.count.update(v =&amp;gt; v + 1);
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Template:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;p&amp;gt;{{ count() }}&amp;lt;/p&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Simple. Reactive. Fast.&lt;/p&gt;

&lt;p&gt;But speed + simplicity can create new problems.&lt;/p&gt;

&lt;h2&gt;
  
  
  ❌ Misuse #1: Calling Signals Excessively in Templates
&lt;/h2&gt;

&lt;p&gt;Bad pattern:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;p&amp;gt;{{ expensiveComputed() }}&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;{{ expensiveComputed() }}&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;{{ expensiveComputed() }}&amp;lt;/p&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each call re-evaluates dependencies.&lt;/p&gt;

&lt;p&gt;If your computed logic is heavy, you just created hidden performance cost.&lt;/p&gt;

&lt;p&gt;✔ Fix:&lt;br&gt;
Store in a local template variable or simplify computed logic.&lt;/p&gt;
&lt;h2&gt;
  
  
  ❌ Misuse #2: Overusing computed() for Heavy Logic
&lt;/h2&gt;

&lt;p&gt;Bad pattern:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;filteredUsers = computed(() =&amp;gt; {
  return this.users()
    .filter(u =&amp;gt; u.active)
    .sort(...)
    .map(...);
});

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If users() changes often, this recalculates fully.&lt;/p&gt;

&lt;p&gt;Signals are reactive — not magical.&lt;/p&gt;

&lt;p&gt;✔ Fix:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Break computations&lt;/li&gt;
&lt;li&gt;Normalize state&lt;/li&gt;
&lt;li&gt;Avoid expensive transformations inside computed&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ❌ Misuse #3: Using Effects Like Subscriptions
&lt;/h2&gt;

&lt;p&gt;Developers are replacing RxJS subscriptions with effects everywhere.&lt;/p&gt;

&lt;p&gt;Bad pattern:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;effect(() =&amp;gt; {
  console.log(this.user());
});

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Effects should be rare and intentional.&lt;/p&gt;

&lt;p&gt;Too many effects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;cause cascading updates&lt;/li&gt;
&lt;li&gt;create debugging nightmares&lt;/li&gt;
&lt;li&gt;feel like hidden side-effects&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✔ Rule:&lt;br&gt;
Use computed() for derivation.&lt;br&gt;
Use effect() only for external side effects.&lt;/p&gt;
&lt;h2&gt;
  
  
  ❌ Misuse #4: Treating Signals Like Global State
&lt;/h2&gt;

&lt;p&gt;Putting everything in a service:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;user = signal(null);
cart = signal([]);
theme = signal('light');

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now your app becomes tightly coupled and hard to test.&lt;/p&gt;

&lt;p&gt;Signals are reactive primitives — not architecture.&lt;/p&gt;

&lt;h2&gt;
  
  
  ❌ Misuse #5: Mixing Signals and RxJS Without Boundaries
&lt;/h2&gt;

&lt;p&gt;Many apps now look like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;signals&lt;/li&gt;
&lt;li&gt;observables&lt;/li&gt;
&lt;li&gt;subjects&lt;/li&gt;
&lt;li&gt;effects&lt;/li&gt;
&lt;li&gt;async pipe&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All together.&lt;/p&gt;

&lt;p&gt;That’s not progress.&lt;br&gt;
That’s confusion.&lt;/p&gt;

&lt;p&gt;✔ Decide:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;UI state → signals&lt;/li&gt;
&lt;li&gt;Streams &amp;amp; async flows → RxJS&lt;/li&gt;
&lt;li&gt;Keep boundaries clear&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🧠 The Real Shift Signals Introduced
&lt;/h2&gt;

&lt;p&gt;Signals changed Angular’s mental model:&lt;/p&gt;

&lt;p&gt;From:&lt;/p&gt;

&lt;p&gt;"Change detection runs everywhere"&lt;/p&gt;

&lt;p&gt;To:&lt;/p&gt;

&lt;p&gt;"Reactivity happens where dependencies exist"&lt;/p&gt;

&lt;p&gt;But this requires discipline.&lt;/p&gt;

&lt;p&gt;Signals reward:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;clean state modeling&lt;/li&gt;
&lt;li&gt;small derivations&lt;/li&gt;
&lt;li&gt;clear boundaries&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They punish:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;heavy computations&lt;/li&gt;
&lt;li&gt;hidden effects&lt;/li&gt;
&lt;li&gt;sloppy architecture&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ⚡ Are Signals Worth It?
&lt;/h2&gt;

&lt;p&gt;Absolutely.&lt;/p&gt;

&lt;p&gt;They:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;reduce unnecessary checks&lt;/li&gt;
&lt;li&gt;improve performance clarity&lt;/li&gt;
&lt;li&gt;simplify component state&lt;/li&gt;
&lt;li&gt;work beautifully with zoneless Angular&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But performance doesn’t come from using signals.&lt;/p&gt;

&lt;p&gt;It comes from using them correctly.&lt;/p&gt;

&lt;h2&gt;
  
  
  🔥 Final Thought
&lt;/h2&gt;

&lt;p&gt;Signals didn’t just make Angular faster.&lt;/p&gt;

&lt;p&gt;They made Angular more powerful.&lt;/p&gt;

&lt;p&gt;And with more power comes the ability to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;write elegant code&lt;/li&gt;
&lt;li&gt;or create subtle performance bugs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The choice is yours.&lt;/p&gt;

</description>
      <category>angular</category>
      <category>signals</category>
      <category>webdev</category>
      <category>performance</category>
    </item>
    <item>
      <title>Why Your App Is Secure… Until the First API Call</title>
      <dc:creator>Mridu Dixit</dc:creator>
      <pubDate>Thu, 12 Feb 2026 14:54:27 +0000</pubDate>
      <link>https://forem.com/mridudixit15/why-your-app-is-secure-until-the-first-api-call-4abc</link>
      <guid>https://forem.com/mridudixit15/why-your-app-is-secure-until-the-first-api-call-4abc</guid>
      <description>&lt;p&gt;Your app looks secure.&lt;/p&gt;

&lt;p&gt;Login works.&lt;br&gt;
Routes are protected.&lt;br&gt;
Buttons are hidden.&lt;br&gt;
Tokens exist.&lt;/p&gt;

&lt;p&gt;And yet — the moment the first API call is made, most apps quietly fall apart.&lt;/p&gt;

&lt;p&gt;This isn’t a theory problem.&lt;br&gt;
It’s one of the most common security failures in modern web apps.&lt;/p&gt;

&lt;p&gt;Let’s talk about why.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Illusion of Security in Frontend Apps
&lt;/h2&gt;

&lt;p&gt;Most apps rely heavily on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;route guards&lt;/li&gt;
&lt;li&gt;UI-based permissions&lt;/li&gt;
&lt;li&gt;role-based rendering&lt;/li&gt;
&lt;li&gt;client-side checks&lt;/li&gt;
&lt;/ul&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if (user.role === 'admin') {
  showAdminPanel();
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This looks secure, but it’s only cosmetic.&lt;/p&gt;

&lt;p&gt;Anyone can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;open DevTools&lt;/li&gt;
&lt;li&gt;intercept requests&lt;/li&gt;
&lt;li&gt;call your API directly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The UI is not your security boundary.&lt;/p&gt;

&lt;h2&gt;
  
  
  The First API Call Is the Real Test
&lt;/h2&gt;

&lt;p&gt;Here’s where things break.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POST /api/delete-user
Authorization: Bearer &amp;lt;token&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Questions most apps don’t answer properly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Who is allowed to call this?&lt;/li&gt;
&lt;li&gt;What role is required?&lt;/li&gt;
&lt;li&gt;Does this user own the resource?&lt;/li&gt;
&lt;li&gt;Is this request replayable?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the backend trusts the frontend — you already lost.&lt;/p&gt;

&lt;h2&gt;
  
  
  Myth: “We Use JWT, So We’re Secure”
&lt;/h2&gt;

&lt;p&gt;JWTs only prove:&lt;/p&gt;

&lt;p&gt;Someone logged in.&lt;/p&gt;

&lt;p&gt;They do not prove:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;permission&lt;/li&gt;
&lt;li&gt;ownership&lt;/li&gt;
&lt;li&gt;intent&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bad pattern ❌:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const userId = req.body.userId;
deleteUser(userId);

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Correct pattern ✅:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const userId = req.auth.userId;
deleteUser(userId);

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The server must derive identity, not accept it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Myth: “Routes Are Protected”
&lt;/h2&gt;

&lt;p&gt;Protecting pages ≠ protecting APIs.&lt;/p&gt;

&lt;p&gt;Anyone can call:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl https://api.yourapp.com/delete-user

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Even if the page is hidden.&lt;/p&gt;

&lt;p&gt;APIs must protect themselves. Always.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common First-API-Call Security Mistakes
&lt;/h2&gt;

&lt;p&gt;❌ &lt;strong&gt;Trusting client-sent IDs&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;{ "userId": "123" }

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;❌ &lt;strong&gt;Role checks only in frontend&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;if (isAdmin) { ... }

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;❌ &lt;strong&gt;No ownership validation&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;deletePost(postId);

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;❌ &lt;strong&gt;Assuming “internal API” means safe&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What Real API Security Looks Like
&lt;/h2&gt;

&lt;p&gt;Every API call should answer three questions:&lt;/p&gt;

&lt;p&gt;1️⃣ &lt;strong&gt;Who is calling?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Validate token&lt;/li&gt;
&lt;li&gt;Extract identity on server&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;2️⃣ &lt;strong&gt;Are they allowed?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Role-based checks&lt;/li&gt;
&lt;li&gt;Permission-based checks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;3️⃣ &lt;strong&gt;Do they own the resource?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User ↔ data relationship&lt;/li&gt;
&lt;li&gt;Tenant isolation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If any answer is missing — it’s a vulnerability.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Frontend’s Real Responsibility&lt;/strong&gt;&lt;br&gt;
Frontend security is about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;preventing accidental misuse&lt;/li&gt;
&lt;li&gt;improving UX&lt;/li&gt;
&lt;li&gt;reducing obvious errors&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is not about enforcing trust.&lt;/p&gt;

&lt;p&gt;The backend must assume:&lt;/p&gt;

&lt;p&gt;Every request is hostile until proven otherwise.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Keeps Happening
&lt;/h2&gt;

&lt;p&gt;Because modern stacks make it easy to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;build fast&lt;/li&gt;
&lt;li&gt;ship auth quickly&lt;/li&gt;
&lt;li&gt;hide complexity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But security doesn’t come from tools.&lt;br&gt;
It comes from boundaries.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Takeaway
&lt;/h2&gt;

&lt;p&gt;If your security model breaks when someone skips the UI —&lt;br&gt;
your app was never secure.&lt;/p&gt;

&lt;p&gt;The first API call is where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;trust should end&lt;/li&gt;
&lt;li&gt;validation should begin&lt;/li&gt;
&lt;li&gt;real security lives&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>programming</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Using Prisma with Next.js and Supabase — What Actually Works (and What Doesn’t)</title>
      <dc:creator>Mridu Dixit</dc:creator>
      <pubDate>Fri, 30 Jan 2026 13:20:23 +0000</pubDate>
      <link>https://forem.com/mridudixit15/using-prisma-with-nextjs-and-supabase-what-actually-works-and-what-doesnt-4e76</link>
      <guid>https://forem.com/mridudixit15/using-prisma-with-nextjs-and-supabase-what-actually-works-and-what-doesnt-4e76</guid>
      <description>&lt;p&gt;Next.js, Supabase, and Prisma are often mentioned together — but the integration isn’t always obvious.&lt;/p&gt;

&lt;p&gt;Should you use Supabase as a database, as auth only, or both?&lt;br&gt;
Where does Prisma fit when Supabase already exposes Postgres?&lt;/p&gt;

&lt;p&gt;Let’s clear the confusion and look at real-world usage patterns.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Real Roles (Clear This First)
&lt;/h2&gt;

&lt;p&gt;🔹 &lt;strong&gt;Supabase&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Managed PostgreSQL&lt;/li&gt;
&lt;li&gt;Authentication (JWT-based)&lt;/li&gt;
&lt;li&gt;Realtime, Storage, Edge Functions&lt;/li&gt;
&lt;li&gt;Auto-generated REST &amp;amp; GraphQL APIs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔹 Prisma&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Type-safe ORM&lt;/li&gt;
&lt;li&gt;Schema-driven data modeling&lt;/li&gt;
&lt;li&gt;Migrations&lt;/li&gt;
&lt;li&gt;Excellent DX for complex queries&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔹 Next.js&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;App Router / Server Actions&lt;/li&gt;
&lt;li&gt;API routes&lt;/li&gt;
&lt;li&gt;SSR / SSG / ISR&lt;/li&gt;
&lt;li&gt;Backend + frontend in one app&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Supabase ≠ Prisma replacement&lt;br&gt;
👉 Prisma ≠ Auth provider&lt;/p&gt;

&lt;p&gt;They solve different problems.&lt;/p&gt;
&lt;h2&gt;
  
  
  Most Common (and Best) Architecture
&lt;/h2&gt;

&lt;p&gt;✅ &lt;strong&gt;Supabase for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PostgreSQL hosting&lt;/li&gt;
&lt;li&gt;Authentication&lt;/li&gt;
&lt;li&gt;Row Level Security (RLS)&lt;/li&gt;
&lt;li&gt;Storage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ &lt;strong&gt;Prisma for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Database access&lt;/li&gt;
&lt;li&gt;Complex queries&lt;/li&gt;
&lt;li&gt;Business logic&lt;/li&gt;
&lt;li&gt;Type safety&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ &lt;strong&gt;Next.js for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;UI&lt;/li&gt;
&lt;li&gt;Server Actions&lt;/li&gt;
&lt;li&gt;API orchestration&lt;/li&gt;
&lt;li&gt;This combo gives you control + safety + speed.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  How Prisma Connects to Supabase
&lt;/h2&gt;

&lt;p&gt;Supabase is just Postgres under the hood.&lt;/p&gt;

&lt;p&gt;You connect Prisma using the direct database URL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DATABASE_URL="postgresql://user:password@db.supabase.co:5432/postgres"

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then define your Prisma schema normally:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;model User {
  id        String   @id @default(uuid())
  email     String   @unique
  createdAt DateTime @default(now())
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx prisma migrate dev

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Prisma migrations work perfectly with Supabase.&lt;/p&gt;

&lt;h2&gt;
  
  
  Auth: Supabase Auth + Prisma (Important Pattern)
&lt;/h2&gt;

&lt;p&gt;Supabase Auth users live in:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;auth.users

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Best practice:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Do not manage auth users with Prisma&lt;/li&gt;
&lt;li&gt;Reference auth.users.id in your tables&lt;/li&gt;
&lt;/ul&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;model Profile {
  id     String @id
  userId String @unique
  name   String
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then sync on signup using:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Supabase Edge Functions&lt;/li&gt;
&lt;li&gt;Next.js Server Actions&lt;/li&gt;
&lt;li&gt;Webhooks&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Row Level Security (RLS) vs Prisma — The Tradeoff
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;⚠️ Important Truth&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Prisma bypasses Supabase RLS when using the service role or DB URL.&lt;/p&gt;

&lt;p&gt;That means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;RLS does not protect Prisma queries&lt;/li&gt;
&lt;li&gt;You must enforce authorization in your backend&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Best Practice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use Prisma only in server-side code&lt;/li&gt;
&lt;li&gt;Validate user identity from Supabase JWT&lt;/li&gt;
&lt;li&gt;Apply access rules in Prisma queries&lt;/li&gt;
&lt;li&gt;This is why Next.js Server Actions work beautifully here.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  When NOT to Use Prisma with Supabase
&lt;/h2&gt;

&lt;p&gt;❌ If you only need simple CRUD&lt;br&gt;
❌ If you rely heavily on Supabase auto-generated APIs&lt;br&gt;
❌ If you want RLS to handle all security&lt;/p&gt;

&lt;p&gt;In these cases, Supabase client SDK alone may be enough.&lt;/p&gt;

&lt;p&gt;When Prisma + Supabase Is a Power Combo&lt;/p&gt;

&lt;p&gt;✅ Complex relational queries&lt;br&gt;
✅ Non-trivial business logic&lt;br&gt;
✅ Multi-tenant apps&lt;br&gt;
✅ Admin dashboards&lt;br&gt;
✅ Type safety across backend&lt;/p&gt;

&lt;p&gt;This is where Prisma shines.&lt;/p&gt;

&lt;h2&gt;
  
  
  Performance &amp;amp; DX Benefits
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Prisma gives compile-time safety&lt;/li&gt;
&lt;li&gt;Supabase gives infra + auth&lt;/li&gt;
&lt;li&gt;Next.js gives full-stack control&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You avoid:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Raw SQL everywhere&lt;/li&gt;
&lt;li&gt;Duplicate types&lt;/li&gt;
&lt;li&gt;Unclear data ownership&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Final Verdict
&lt;/h2&gt;

&lt;p&gt;Supabase + Prisma is not redundant — it’s complementary.&lt;/p&gt;

&lt;p&gt;Use Supabase as:&lt;/p&gt;

&lt;p&gt;Infrastructure + Auth + Platform&lt;/p&gt;

&lt;p&gt;Use Prisma as:&lt;/p&gt;

&lt;p&gt;Your application’s data layer&lt;/p&gt;

&lt;p&gt;Together with Next.js, this stack is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;scalable&lt;/li&gt;
&lt;li&gt;maintainable&lt;/li&gt;
&lt;li&gt;production-ready&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>supabase</category>
      <category>nextjs</category>
      <category>prisma</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Stop Using ngIf Like This — Angular’s @if, @for &amp; @empty Are Cleaner</title>
      <dc:creator>Mridu Dixit</dc:creator>
      <pubDate>Thu, 22 Jan 2026 12:08:17 +0000</pubDate>
      <link>https://forem.com/mridudixit15/stop-using-ngif-like-this-angulars-if-for-empty-are-cleaner-4d4n</link>
      <guid>https://forem.com/mridudixit15/stop-using-ngif-like-this-angulars-if-for-empty-are-cleaner-4d4n</guid>
      <description>&lt;p&gt;Angular developers have used *ngIf and *ngFor for years. They work — but they also hide complexity, encourage messy templates, and become painful as UI logic grows.&lt;/p&gt;

&lt;p&gt;Angular’s template control flow syntax (@if, &lt;a class="mentioned-user" href="https://dev.to/for"&gt;@for&lt;/a&gt;, &lt;a class="mentioned-user" href="https://dev.to/empty"&gt;@empty&lt;/a&gt;, &lt;a class="mentioned-user" href="https://dev.to/switch"&gt;@switch&lt;/a&gt;) solves these problems with clear, explicit, and readable blocks.&lt;/p&gt;

&lt;p&gt;If you’re still writing Angular templates the old way, this article shows why you should stop — and what to use instead.&lt;/p&gt;

&lt;p&gt;**What’s Wrong with ngIf and ngFor?&lt;/p&gt;

&lt;p&gt;The issue isn’t that they’re broken — it’s that they don’t scale well.&lt;/p&gt;

&lt;p&gt;Common problems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hidden  logic&lt;/li&gt;
&lt;li&gt;Asterisk (*) magic that’s hard to reason about&lt;/li&gt;
&lt;li&gt;Nested conditions become unreadable&lt;/li&gt;
&lt;li&gt;Empty states require extra boilerplate
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;div *ngIf="user; else loading"&amp;gt;
  &amp;lt;app-profile [user]="user"&amp;gt;&amp;lt;/app-profile&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;ng-template #loading&amp;gt;
  &amp;lt;app-spinner&amp;gt;&amp;lt;/app-spinner&amp;gt;
&amp;lt;/ng-template&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This works — but the logic is split across multiple places.&lt;/p&gt;

&lt;h2&gt;
  
  
  @if — Clear, Explicit Conditional Rendering
&lt;/h2&gt;

&lt;p&gt;✅ &lt;strong&gt;Cleaner Alternative&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;@if (user) {
  &amp;lt;app-profile [user]="user"&amp;gt;&amp;lt;/app-profile&amp;gt;
} @else {
  &amp;lt;app-spinner&amp;gt;&amp;lt;/app-spinner&amp;gt;
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why this is better:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No &lt;/li&gt;
&lt;li&gt;No indirection&lt;/li&gt;
&lt;li&gt;Reads like real control flow&lt;/li&gt;
&lt;li&gt;Easy to extend and refactor&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nested conditions also stay readable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@if (user) {
  @if (user.isAdmin) {
    &amp;lt;admin-panel /&amp;gt;
  } @else {
    &amp;lt;user-dashboard /&amp;gt;
  }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  *&lt;a class="mentioned-user" href="https://dev.to/for"&gt;@for&lt;/a&gt; — A Better ngFor
&lt;/h2&gt;

&lt;p&gt;❌ &lt;strong&gt;Old Way&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;&amp;lt;li *ngFor="let item of items; trackBy: trackById"&amp;gt;
  {{ item.name }}
&amp;lt;/li&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;New Way&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;@for (item of items; track item.id) {
  &amp;lt;li&amp;gt;{{ item.name }}&amp;lt;/li&amp;gt;
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Built-in variables are explicit and intuitive:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@for (item of items; let i = $index) {
  &amp;lt;p&amp;gt;{{ i + 1 }}. {{ item.name }}&amp;lt;/p&amp;gt;
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Available variables:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;$index&lt;/li&gt;
&lt;li&gt;$count&lt;/li&gt;
&lt;li&gt;$first&lt;/li&gt;
&lt;li&gt;$last&lt;/li&gt;
&lt;li&gt;$even&lt;/li&gt;
&lt;li&gt;$odd&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a class="mentioned-user" href="https://dev.to/empty"&gt;@empty&lt;/a&gt; — No More Manual Empty State Checks
&lt;/h2&gt;

&lt;p&gt;This is where Angular really shines.&lt;/p&gt;

&lt;p&gt;❌ &lt;strong&gt;Old Pattern&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;&amp;lt;ul *ngIf="items.length &amp;gt; 0; else empty"&amp;gt;
  &amp;lt;li *ngFor="let item of items"&amp;gt;{{ item }}&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;

&amp;lt;ng-template #empty&amp;gt;
  No items found
&amp;lt;/ng-template&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;New Pattern&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;@for (item of items) {
  &amp;lt;li&amp;gt;{{ item }}&amp;lt;/li&amp;gt;
} @empty {
  &amp;lt;li&amp;gt;No items found&amp;lt;/li&amp;gt;
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why &lt;a class="mentioned-user" href="https://dev.to/empty"&gt;@empty&lt;/a&gt; is a big win:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No extra conditions&lt;/li&gt;
&lt;li&gt;Empty state stays next to the list&lt;/li&gt;
&lt;li&gt;Perfect for tables, dropdowns, dashboards&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a class="mentioned-user" href="https://dev.to/switch"&gt;@switch&lt;/a&gt; — Readable State-Based UI
&lt;/h2&gt;

&lt;p&gt;❌ &lt;strong&gt;Old ngSwitch&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;&amp;lt;div [ngSwitch]="status"&amp;gt;
  &amp;lt;p *ngSwitchCase="'loading'"&amp;gt;Loading...&amp;lt;/p&amp;gt;
  &amp;lt;p *ngSwitchCase="'success'"&amp;gt;Success&amp;lt;/p&amp;gt;
  &amp;lt;p *ngSwitchDefault&amp;gt;Error&amp;lt;/p&amp;gt;
&amp;lt;/div&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;New Control Flow&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;@switch (status) {
  @case ('loading') {
    &amp;lt;p&amp;gt;Loading...&amp;lt;/p&amp;gt;
  }
  @case ('success') {
    &amp;lt;p&amp;gt;Success&amp;lt;/p&amp;gt;
  }
  @default {
    &amp;lt;p&amp;gt;Error&amp;lt;/p&amp;gt;
  }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This reads exactly how it behaves.&lt;/p&gt;

&lt;h2&gt;
  
  
  Works Perfectly with Signals
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;items = signal&amp;lt;string[]&amp;gt;([]);

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@for (item of items()) {
  &amp;lt;p&amp;gt;{{ item }}&amp;lt;/p&amp;gt;
} @empty {
  &amp;lt;p&amp;gt;No data available&amp;lt;/p&amp;gt;
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No subscriptions.&lt;br&gt;
No async pipe noise.&lt;br&gt;
Angular handles reactivity automatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  Performance &amp;amp; Maintainability Benefits
&lt;/h2&gt;

&lt;p&gt;Angular’s control flow blocks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reduce unnecessary DOM nodes&lt;/li&gt;
&lt;li&gt;Improve compile-time optimizations&lt;/li&gt;
&lt;li&gt;Work seamlessly with zoneless Angular&lt;/li&gt;
&lt;li&gt;Make templates easier to test and review
This is not just syntax sugar — it’s better architecture.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  *Should You Stop Using ngIf Completely?
&lt;/h2&gt;

&lt;p&gt;No — existing code is fine.&lt;/p&gt;

&lt;p&gt;But for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;New components&lt;/li&gt;
&lt;li&gt;New features&lt;/li&gt;
&lt;li&gt;Signal-based state&lt;/li&gt;
&lt;li&gt;Complex UI logic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 @if, &lt;a class="mentioned-user" href="https://dev.to/for"&gt;@for&lt;/a&gt;, and &lt;a class="mentioned-user" href="https://dev.to/empty"&gt;@empty&lt;/a&gt; should be your default choice&lt;/p&gt;

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

&lt;p&gt;*ngIf and *ngFor were great — but Angular templates have moved on.&lt;/p&gt;

&lt;p&gt;If you care about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;clean templates&lt;/li&gt;
&lt;li&gt;readable UI logic&lt;/li&gt;
&lt;li&gt;scalable Angular apps&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;then it’s time to stop using *ngIf like it’s 2018 and start writing templates the modern Angular way.&lt;/p&gt;

</description>
      <category>angular</category>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Zoneless Angular Explained — How Change Detection Works Without Zone.js</title>
      <dc:creator>Mridu Dixit</dc:creator>
      <pubDate>Fri, 09 Jan 2026 18:06:14 +0000</pubDate>
      <link>https://forem.com/mridudixit15/zoneless-angular-explained-how-change-detection-works-without-zonejs-1ahp</link>
      <guid>https://forem.com/mridudixit15/zoneless-angular-explained-how-change-detection-works-without-zonejs-1ahp</guid>
      <description>&lt;p&gt;For years, Angular relied on Zone.js to automatically trigger change detection. It worked—but it also made performance unpredictable and debugging harder.&lt;/p&gt;

&lt;p&gt;With modern Angular, especially alongside Signals, Angular can now run without Zone.js.&lt;/p&gt;

&lt;p&gt;This article explains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what Zone.js actually did&lt;/li&gt;
&lt;li&gt;how Angular works without it&lt;/li&gt;
&lt;li&gt;what triggers change detection now&lt;/li&gt;
&lt;li&gt;when you should (and shouldn’t) go zoneless&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What Zone.js Did in Angular
&lt;/h2&gt;

&lt;p&gt;Zone.js monkey-patches async APIs like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;setTimeout&lt;/li&gt;
&lt;li&gt;Promise&lt;/li&gt;
&lt;li&gt;fetch&lt;/li&gt;
&lt;li&gt;DOM events&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Whenever anything async happened, Angular would:&lt;br&gt;
👉 re-run change detection for the entire component tree.&lt;/p&gt;
&lt;h2&gt;
  
  
  Result:
&lt;/h2&gt;

&lt;p&gt;✔ UI always stayed in sync&lt;br&gt;
❌ Too many unnecessary checks&lt;br&gt;
❌ Hard to control performance&lt;br&gt;
❌ “Why did my component re-render?” moments&lt;/p&gt;
&lt;h2&gt;
  
  
  The Problem with Zone-Based Change Detection
&lt;/h2&gt;

&lt;p&gt;With Zone.js:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Any async event can trigger CD&lt;/li&gt;
&lt;li&gt;Even unrelated components re-check&lt;/li&gt;
&lt;li&gt;Performance tuning becomes guesswork&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This was fine for small apps—but large apps paid the price.&lt;/p&gt;
&lt;h2&gt;
  
  
  What Is Zoneless Angular?
&lt;/h2&gt;

&lt;p&gt;Zoneless Angular means:&lt;/p&gt;

&lt;p&gt;Angular does not automatically run change detection on async events.&lt;/p&gt;

&lt;p&gt;Instead, &lt;strong&gt;you explicitly tell Angular when state changes.&lt;/strong&gt;&lt;br&gt;
No magic.&lt;br&gt;
No global re-checks.&lt;br&gt;
Full control.&lt;/p&gt;
&lt;h2&gt;
  
  
  How Change Detection Works Without Zone.js
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;🔑 Key Concept&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Change detection runs only when Angular knows data has changed.&lt;/p&gt;

&lt;p&gt;This happens via:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Signals&lt;/li&gt;
&lt;li&gt;Input changes&lt;/li&gt;
&lt;li&gt;Explicit triggers&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Signals: The Backbone of Zoneless Angular
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Example: Signal-based state&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;count = signal(0);

increment() {
  this.count.update(v =&amp;gt; v + 1);
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Template&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;&amp;lt;button (click)="increment()"&amp;gt;+&amp;lt;/button&amp;gt;
&amp;lt;p&amp;gt;Count: {{ count() }}&amp;lt;/p&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What happens?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Signal updates&lt;/li&gt;
&lt;li&gt;Angular knows exactly what changed&lt;/li&gt;
&lt;li&gt;Only dependent views re-render
✔ No global change detection
✔ No Zone.js involved&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Computed Signals (Derived State)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;doubleCount = computed(() =&amp;gt; this.count() * 2);

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Angular tracks dependencies automatically.&lt;/p&gt;

&lt;p&gt;Only affected templates update — nothing else.&lt;/p&gt;

&lt;h2&gt;
  
  
  Effects (Side Effects Without Zone)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;effect(() =&amp;gt; {
  console.log('Count changed:', this.count());
});

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Used for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;logging&lt;/li&gt;
&lt;li&gt;analytics&lt;/li&gt;
&lt;li&gt;syncing storage&lt;/li&gt;
&lt;li&gt;triggering API calls&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What About Async Operations?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;❌ Old Zone-based approach&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;setTimeout(() =&amp;gt; {
  this.value = 10;
}, 1000);

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Angular had to guess when to update UI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✅ Zoneless Approach&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;value = signal(0);

setTimeout(() =&amp;gt; {
  this.value.set(10);
}, 1000);

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Signal update → Angular reacts → UI updates.&lt;/p&gt;

&lt;h2&gt;
  
  
  Running Angular Without Zone.js
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Bootstrap example:&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;bootstrapApplication(AppComponent, {
  providers: [
    provideZoneChangeDetection({
      eventCoalescing: true,
      runCoalescing: true
    })
  ]
});

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To fully remove Zone.js:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Remove zone.js import&lt;/li&gt;
&lt;li&gt;Use signals &amp;amp; explicit triggers&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What Still Triggers Change Detection?
&lt;/h2&gt;

&lt;p&gt;Even without Zone.js:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Signal updates&lt;/li&gt;
&lt;li&gt;Input bindings&lt;/li&gt;
&lt;li&gt;Event handlers&lt;/li&gt;
&lt;li&gt;Manual ChangeDetectorRef calls
Angular stays reactive — just not automatic everywhere.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  When Zoneless Angular Shines
&lt;/h2&gt;

&lt;p&gt;✅ Large applications&lt;br&gt;
✅ Performance-critical UIs&lt;br&gt;
✅ Apps using Signals heavily&lt;br&gt;
✅ Teams that want predictability&lt;/p&gt;

&lt;h2&gt;
  
  
  When NOT to Go Zoneless (Yet)
&lt;/h2&gt;

&lt;p&gt;⚠ Legacy apps with heavy RxJS&lt;br&gt;
⚠ Apps relying on implicit async updates&lt;br&gt;
⚠ Teams not ready to refactor state logic&lt;/p&gt;

&lt;p&gt;Zoneless is opt-in, not mandatory.&lt;/p&gt;

&lt;h2&gt;
  
  
  Zoneless + Signals = Predictable Angular
&lt;/h2&gt;

&lt;p&gt;This combo gives Angular:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;deterministic rendering&lt;/li&gt;
&lt;li&gt;fewer re-renders&lt;/li&gt;
&lt;li&gt;easier performance debugging&lt;/li&gt;
&lt;li&gt;modern reactive mental model&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Angular becomes:&lt;/p&gt;

&lt;p&gt;“Update only what changed — nothing else.”&lt;/p&gt;

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

&lt;p&gt;Zoneless Angular is not about removing features — it’s about removing guesswork.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Zone.js = automatic but noisy&lt;/li&gt;
&lt;li&gt;Zoneless + Signals = explicit and fast&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You don’t need to go zoneless everywhere—but understanding it makes you a better Angular developer.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>angular</category>
      <category>zoneless</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Angular 21 — What’s New, What’s Changed</title>
      <dc:creator>Mridu Dixit</dc:creator>
      <pubDate>Tue, 30 Dec 2025 06:59:30 +0000</pubDate>
      <link>https://forem.com/mridudixit15/angular-21-whats-new-whats-changed-3fl3</link>
      <guid>https://forem.com/mridudixit15/angular-21-whats-new-whats-changed-3fl3</guid>
      <description>&lt;p&gt;Angular 21 focuses on simplification, performance, and modern reactive patterns. Instead of adding flashy APIs, it strengthens what Angular developers already use daily.&lt;/p&gt;

&lt;p&gt;Let’s explore Angular 21 features with practical examples so you can immediately apply them.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Standalone Components by Default (No NgModules)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;❌ Old Way (NgModule-based)&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;@NgModule({
  declarations: [UserComponent],
  imports: [CommonModule],
})
export class UserModule {}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;✅ Angular 21 Way (Standalone)&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;@Component({
  selector: 'app-user',
  standalone: true,
  imports: [CommonModule],
  template: `&amp;lt;h2&amp;gt;User Works!&amp;lt;/h2&amp;gt;`
})
export class UserComponent {}

&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;Less boilerplate&lt;/li&gt;
&lt;li&gt;Clear dependencies&lt;/li&gt;
&lt;li&gt;Easier lazy loading&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. Signals for State Management (Simple &amp;amp; Predictable)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;❌ Before (RxJS for simple state)&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;user$ = new BehaviorSubject&amp;lt;User | null&amp;gt;(null);

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;✅ Angular 21 Signals&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;user = signal&amp;lt;User | null&amp;gt;(null);

setUser(data: User) {
  this.user.set(data);
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Using it in template:&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;&amp;lt;div *ngIf="user()"&amp;gt;
  Welcome {{ user()?.name }}
&amp;lt;/div&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;➡️ No subscriptions. No memory leaks. Clean reactivity.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Computed Signals (Derived State)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;firstName = signal('Mridu');
lastName = signal('Dixit');

fullName = computed(() =&amp;gt; `${this.firstName()} ${this.lastName()}`);

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;h3&amp;gt;{{ fullName() }}&amp;lt;/h3&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;➡️ Angular automatically recalculates when dependencies change.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Effect API (Reacting to Changes)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;effect(() =&amp;gt; {
  console.log('User changed:', this.user());
});

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use cases:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Analytics tracking&lt;/li&gt;
&lt;li&gt;API calls&lt;/li&gt;
&lt;li&gt;Logging&lt;/li&gt;
&lt;li&gt;Syncing localStorage&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  5. Zoneless Angular (Better Performance)
&lt;/h2&gt;

&lt;p&gt;Angular 21 makes Zone.js optional.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Enable zoneless mode:&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;bootstrapApplication(AppComponent, {
  providers: [provideZoneChangeDetection({ eventCoalescing: true })]
});

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;Faster change detection&lt;/li&gt;
&lt;li&gt;More predictable updates&lt;/li&gt;
&lt;li&gt;Signals + zoneless = 🔥&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  6. Faster Builds with esbuild (Under the Hood)
&lt;/h2&gt;

&lt;p&gt;You don’t configure this manually — Angular CLI handles it.&lt;/p&gt;

&lt;p&gt;What you’ll notice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Faster ng serve&lt;/li&gt;
&lt;li&gt;Faster rebuilds&lt;/li&gt;
&lt;li&gt;Lower memory usage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Especially noticeable in large projects.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Improved SSR &amp;amp; Hydration (Less Pain)
&lt;/h2&gt;

&lt;p&gt;Server Component Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@Component({
  standalone: true,
  template: `&amp;lt;p&amp;gt;Data loaded on server&amp;lt;/p&amp;gt;`
})
export class ServerOnlyComponent {}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Angular 21 improves:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hydration mismatch handling&lt;/li&gt;
&lt;li&gt;Async data consistency&lt;/li&gt;
&lt;li&gt;Debugging experience&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Result → more reliable SSR apps.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Better Dependency Injection with Standalone Apps
&lt;/h2&gt;

&lt;p&gt;Global provider:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;bootstrapApplication(AppComponent, {
  providers: [provideHttpClient()]
});

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Component-level provider:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@Component({
  standalone: true,
  providers: [UserService]
})
export class UserComponent {}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;➡️ Clear scope, fewer surprises.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Stronger Template Type Safety
&lt;/h2&gt;

&lt;p&gt;Angular catches this at build time:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;p&amp;gt;{{ user.nonExistingProp }}&amp;lt;/p&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✔ No more silent runtime bugs&lt;br&gt;
✔ Better IDE autocomplete&lt;br&gt;
✔ Safer refactors&lt;/p&gt;

&lt;h2&gt;
  
  
  10. Migration Is Smooth (No Breaking Shock)
&lt;/h2&gt;

&lt;p&gt;Angular 21 supports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Existing RxJS code&lt;/li&gt;
&lt;li&gt;NgModules (still supported)&lt;/li&gt;
&lt;li&gt;Incremental migration to signals&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You don’t have to rewrite everything.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who Should Use Angular 21?
&lt;/h2&gt;

&lt;p&gt;✅ New Angular projects&lt;br&gt;
✅ Apps already using standalone components&lt;br&gt;
✅ Performance-sensitive apps&lt;br&gt;
✅ Teams tired of overusing RxJS for simple state&lt;/p&gt;

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

&lt;p&gt;Angular 21 is about clarity and confidence:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Standalone-first architecture&lt;/li&gt;
&lt;li&gt;Signals for state&lt;/li&gt;
&lt;li&gt;Zoneless performance&lt;/li&gt;
&lt;li&gt;Faster builds&lt;/li&gt;
&lt;li&gt;Cleaner mental model&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Angular is no longer “heavy” — it’s modern, reactive, and production-ready.&lt;/p&gt;

</description>
      <category>angular</category>
      <category>programming</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Webpack vs Vite in Angular — Which One Really Wins?</title>
      <dc:creator>Mridu Dixit</dc:creator>
      <pubDate>Wed, 17 Dec 2025 04:41:26 +0000</pubDate>
      <link>https://forem.com/mridudixit15/webpack-vs-vite-in-angular-which-one-really-wins-2apc</link>
      <guid>https://forem.com/mridudixit15/webpack-vs-vite-in-angular-which-one-really-wins-2apc</guid>
      <description>&lt;p&gt;Angular has traditionally relied on Webpack under the hood, but with Vite rapidly gaining popularity across the frontend ecosystem, many Angular developers are asking:&lt;/p&gt;

&lt;p&gt;👉 Should I stick with Webpack, or is Vite a better choice for Angular projects?&lt;/p&gt;

&lt;p&gt;Let’s break it down honestly, practically, and without hype.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is Webpack in Angular?
&lt;/h2&gt;

&lt;p&gt;Webpack has been Angular’s default bundler for years through Angular CLI.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Strengths&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deep integration with Angular CLI&lt;/li&gt;
&lt;li&gt;Mature, stable, and battle-tested&lt;/li&gt;
&lt;li&gt;Full control over build and optimization pipeline&lt;/li&gt;
&lt;li&gt;Excellent support for SSR, i18n, and advanced builds&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;❌ &lt;strong&gt;Pain Points&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Slower cold starts for large applications&lt;/li&gt;
&lt;li&gt;Complex configuration&lt;/li&gt;
&lt;li&gt;High memory usage&lt;/li&gt;
&lt;li&gt;Hard to customize without ejecting&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What Is Vite — and Why Developers Love It
&lt;/h2&gt;

&lt;p&gt;Vite is a modern build tool built around:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Native ES modules&lt;/li&gt;
&lt;li&gt;esbuild for lightning-fast bundling&lt;/li&gt;
&lt;li&gt;A dev server that avoids bundling during development&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🚀 &lt;strong&gt;Why Vite Feels Fast&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Instant dev server startup&lt;/li&gt;
&lt;li&gt;On-demand module loading&lt;/li&gt;
&lt;li&gt;Extremely fast Hot Module Replacement (HMR)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Angular + Vite: Current Reality
&lt;/h2&gt;

&lt;p&gt;Angular does not officially replace Webpack with Vite.&lt;/p&gt;

&lt;p&gt;However, Angular has adopted:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;esbuild for faster builds&lt;/li&gt;
&lt;li&gt;A Vite-like development experience&lt;/li&gt;
&lt;li&gt;Community-driven Vite integrations (experimental)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Angular CLI still relies on Webpack for production builds, SSR, and advanced features.&lt;/p&gt;

&lt;h2&gt;
  
  
  Developer Experience Comparison
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Feature Webpack&lt;/strong&gt;        (&lt;strong&gt;Angular CLI&lt;/strong&gt;)                 &lt;strong&gt;Vite&lt;/strong&gt;&lt;br&gt;
Dev server startup    Slow                      Instant&lt;br&gt;
Hot reload           Decent                  Extremely fast&lt;br&gt;
Configuration            Complex              Minimal&lt;br&gt;
Angular compatibility     Native               Experimental&lt;br&gt;
SSR support           Stable              Limited&lt;br&gt;
Ecosystem            Very mature         Rapidly growing&lt;/p&gt;

&lt;h2&gt;
  
  
  Build &amp;amp; Optimization
&lt;/h2&gt;

&lt;p&gt;🔧 &lt;strong&gt;Webpack&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Strong optimization and tree-shaking&lt;/li&gt;
&lt;li&gt;Predictable production builds&lt;/li&gt;
&lt;li&gt;Advanced code-splitting&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;⚡ &lt;strong&gt;Vite&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Faster builds via esbuild&lt;/li&gt;
&lt;li&gt;Simple configuration&lt;/li&gt;
&lt;li&gt;Limited deep Angular optimizations&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  SSR &amp;amp; Enterprise Use Cases
&lt;/h2&gt;

&lt;p&gt;If your Angular application relies on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Server-Side Rendering&lt;/li&gt;
&lt;li&gt;Internationalization&lt;/li&gt;
&lt;li&gt;Large monorepos&lt;/li&gt;
&lt;li&gt;Complex build pipelines&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 &lt;strong&gt;Webpack&lt;/strong&gt; remains the safest and most reliable choice.&lt;/p&gt;

&lt;h2&gt;
  
  
  Should Angular Developers Use Vite?
&lt;/h2&gt;

&lt;p&gt;✅ &lt;strong&gt;Choose Webpack if:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You’re building production-grade Angular apps&lt;/li&gt;
&lt;li&gt;You need SSR or advanced Angular CLI features&lt;/li&gt;
&lt;li&gt;Stability and long-term support matter&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🚀 &lt;strong&gt;Choose Vite if:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You’re prototyping or experimenting&lt;/li&gt;
&lt;li&gt;You value fast feedback loops&lt;/li&gt;
&lt;li&gt;Your app is relatively small&lt;/li&gt;
&lt;li&gt;You’re comfortable with experimental tooling&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Real Takeaway
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Webpack is still the backbone of Angular builds&lt;/li&gt;
&lt;li&gt;Vite delivers an unmatched developer experience&lt;/li&gt;
&lt;li&gt;Angular is clearly moving toward faster, simpler tooling inspired by Vite&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Webpack powers Angular today.&lt;br&gt;
Vite shapes how Angular tooling is evolving.&lt;/p&gt;

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

&lt;p&gt;Both tools are excellent—but they solve different problems.&lt;/p&gt;

&lt;p&gt;Until Angular officially adopts Vite end-to-end, Webpack remains the default and safest option, while Vite shines for experimentation and speed.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>angular</category>
      <category>webpack</category>
      <category>vite</category>
    </item>
    <item>
      <title>Top 10 API Call Security Mistakes Developers Still Make in 2025</title>
      <dc:creator>Mridu Dixit</dc:creator>
      <pubDate>Wed, 10 Dec 2025 12:29:08 +0000</pubDate>
      <link>https://forem.com/mridudixit15/top-10-api-call-security-mistakes-developers-still-make-in-2025-439p</link>
      <guid>https://forem.com/mridudixit15/top-10-api-call-security-mistakes-developers-still-make-in-2025-439p</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Even in 2025, API call security remains one of the biggest weaknesses in modern applications. With more frontend-heavy apps, more third-party integrations, and more public APIs, developers are still repeating the same mistakes—leading to data leaks, token theft, and full application compromise.&lt;/p&gt;

&lt;p&gt;Here are the top 10 API call security mistakes developers still make in 2025, and how to fix them.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Exposing API Keys in Frontend Code
&lt;/h2&gt;

&lt;p&gt;Yes, it still happens.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Publishing API keys inside:&lt;/li&gt;
&lt;li&gt;Angular/React source code&lt;/li&gt;
&lt;li&gt;environment.ts files&lt;/li&gt;
&lt;li&gt;mobile builds (APK/IPA)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;…makes them accessible to anyone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✅ Fix:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Never trust frontend to hide secrets&lt;/li&gt;
&lt;li&gt;Move sensitive calls to a backend or Cloud Function proxy&lt;/li&gt;
&lt;li&gt;Use restricted API keys with domain-level rules&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. Using Only Client-Side Validation
&lt;/h2&gt;

&lt;p&gt;Client-side validation is easily bypassed with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Postman&lt;/li&gt;
&lt;li&gt;cURL&lt;/li&gt;
&lt;li&gt;Browser network tab edits
Relying on frontend checks leaves the backend wide open.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;✅ Fix&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;Perform all critical validation on the server (auth, role checks, payload checks).&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Missing Proper Authentication (Tokenless API Calls)
&lt;/h2&gt;

&lt;p&gt;Some developers still allow API endpoints to be accessed without:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JWT&lt;/li&gt;
&lt;li&gt;OAuth2 token&lt;/li&gt;
&lt;li&gt;API key&lt;/li&gt;
&lt;li&gt;Session cookie&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This leads to data leaking in minutes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✅ Fix&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enforce auth on every request.&lt;/li&gt;
&lt;li&gt;No public endpoints unless explicitly intended.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  4. Storing JWT Access Tokens in LocalStorage
&lt;/h2&gt;

&lt;p&gt;Storing tokens in localStorage is still a major attack vector.&lt;/p&gt;

&lt;p&gt;Reason:&lt;br&gt;
If the site gets an XSS, attackers steal the token instantly.&lt;/p&gt;

&lt;p&gt;✅ Fix:&lt;/p&gt;

&lt;p&gt;Use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HttpOnly cookies for access/refresh tokens&lt;/li&gt;
&lt;li&gt;Short-lived tokens&lt;/li&gt;
&lt;li&gt;Token rotation&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  5. Not Implementing Rate Limiting
&lt;/h2&gt;

&lt;p&gt;Hackers abuse APIs by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Brute forcing logins&lt;/li&gt;
&lt;li&gt;Sending 10k requests per second&lt;/li&gt;
&lt;li&gt;Enumerating users&lt;/li&gt;
&lt;li&gt;Without rate limits, your APIs burn quickly.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ Fix:&lt;/p&gt;

&lt;p&gt;Enable rate limiting at:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API Gateway&lt;/li&gt;
&lt;li&gt;Cloudflare/WAF&lt;/li&gt;
&lt;li&gt;Backend server&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  6. No Authorization Checks (Role / Permission Validation)
&lt;/h2&gt;

&lt;p&gt;Many APIs authenticate users but never check permissions.&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User A can access User B’s data&lt;/li&gt;
&lt;li&gt;Non-admins calling admin APIs&lt;/li&gt;
&lt;li&gt;Direct object reference (IDOR) attacks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ Fix:&lt;/p&gt;

&lt;p&gt;Always validate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Role&lt;/li&gt;
&lt;li&gt;Permissions&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Resource ownership&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;ol&gt;
&lt;li&gt;Passing Sensitive Data Without Encryption
Sending passwords, tokens, or personal data over non-HTTPS is a disaster.&lt;/li&gt;
&lt;/ol&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Yes—developers still do it in dev/staging.&lt;/p&gt;

&lt;p&gt;✅ Fix:&lt;/p&gt;

&lt;p&gt;E&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;nforce HTTPS&lt;/li&gt;
&lt;li&gt;Use HSTS&lt;/li&gt;
&lt;li&gt;Reject mixed content&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  8. Not Validating Request Payloads
&lt;/h2&gt;

&lt;p&gt;Hackers send:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Extra fields&lt;/li&gt;
&lt;li&gt;Missing fields&lt;/li&gt;
&lt;li&gt;Malicious JSON&lt;/li&gt;
&lt;li&gt;Overly large payloads&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without schema validation, your API breaks or leaks data.&lt;/p&gt;

&lt;p&gt;✅ Fix:&lt;/p&gt;

&lt;p&gt;Use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Zod / Yup&lt;/li&gt;
&lt;li&gt;Joi&lt;/li&gt;
&lt;li&gt;JSON schema&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Validation pipes (NestJS)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;ol&gt;
&lt;li&gt;Overly Verbose Error Messages
Returning errors like:
&lt;/li&gt;
&lt;/ol&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User not found in DB table users_master

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;or&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;JWT expired at 2025-01-20T10:32:18Z

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;leaks internal logic to attackers.&lt;/p&gt;

&lt;p&gt;✅ Fix:&lt;/p&gt;

&lt;p&gt;Send generic safe responses:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Invalid credentials.

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Log detailed errors on backend only.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. No Logging &amp;amp; Monitoring
&lt;/h2&gt;

&lt;p&gt;Developers often don’t track:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Failed requests&lt;/li&gt;
&lt;li&gt;Suspicious API activity&lt;/li&gt;
&lt;li&gt;Repeated auth failures&lt;/li&gt;
&lt;li&gt;Sudden traffic spikes&lt;/li&gt;
&lt;li&gt;This lets attackers run unchecked.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ Fix:&lt;/p&gt;

&lt;p&gt;Use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Firebase Monitoring&lt;/li&gt;
&lt;li&gt;Cloud Logging&lt;/li&gt;
&lt;li&gt;ELK / Datadog&lt;/li&gt;
&lt;li&gt;Alerts for unusual API patterns&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;API security is no longer optional—it's a survival requirement in 2025.&lt;br&gt;
Avoiding these 10 mistakes will make your applications safer, harder to attack, and more reliable.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Top 10 Mistakes Developers Still Make with Firebase in 2025</title>
      <dc:creator>Mridu Dixit</dc:creator>
      <pubDate>Wed, 26 Nov 2025 12:38:19 +0000</pubDate>
      <link>https://forem.com/mridudixit15/top-10-mistakes-developers-still-make-with-firebase-in-2025-53ah</link>
      <guid>https://forem.com/mridudixit15/top-10-mistakes-developers-still-make-with-firebase-in-2025-53ah</guid>
      <description>&lt;p&gt;Even in 2025, Firebase remains one of the most popular platforms for building real-time, serverless, and scalable applications. But with ease of use comes a new wave of misconfigurations, billing shocks, and performance issues—mostly caused by small but critical mistakes.&lt;/p&gt;

&lt;p&gt;Here are the 10 most common Firebase mistakes developers still make in 2025—and how to avoid them.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Treating Firestore Like a SQL Database
&lt;/h2&gt;

&lt;p&gt;Firestore is a NoSQL document DB. Developers still try to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;store highly relational data&lt;/li&gt;
&lt;li&gt;perform “joins” inside documents&lt;/li&gt;
&lt;li&gt;nest deeply structured objects&lt;/li&gt;
&lt;li&gt;run many small reads instead of one optimized read&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Fix&lt;/strong&gt;:&lt;br&gt;
Design for documents &amp;amp; collections. Prefer flatter structures and denormalize when it improves read efficiency.&lt;/p&gt;
&lt;h2&gt;
  
  
  2. Overusing Realtime Listeners Everywhere
&lt;/h2&gt;

&lt;p&gt;Many apps subscribe to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;entire collections&lt;/li&gt;
&lt;li&gt;large documents&lt;/li&gt;
&lt;li&gt;listeners that run even when screens are hidden&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This results in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;battery drain (mobile)&lt;/li&gt;
&lt;li&gt;unnecessary read costs&lt;/li&gt;
&lt;li&gt;re-renders in frontend frameworks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Fix&lt;/strong&gt;:&lt;br&gt;
Use .get() for static pages. Add listeners only where real-time matters.&lt;/p&gt;
&lt;h2&gt;
  
  
  3. Ignoring Firestore Indexes Until Production
&lt;/h2&gt;

&lt;p&gt;2025, and devs still discover index errors… in production.&lt;/p&gt;

&lt;p&gt;Symptoms:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;queries suddenly fail&lt;/li&gt;
&lt;li&gt;slow Firestore performance&lt;/li&gt;
&lt;li&gt;Cloud Functions time out on complex queries&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Fix&lt;/strong&gt;:&lt;br&gt;
Review the index suggestions in the Firebase Console early. Create composite indexes proactively.&lt;/p&gt;
&lt;h2&gt;
  
  
  4. Weak or Nonexistent Firebase Security Rules
&lt;/h2&gt;

&lt;p&gt;Mistake: Opening security rules to public during development and forgetting to lock them later:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// ⚠️ Danger
allow read, write: if true;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Common vulnerabilities&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;clients can overwrite documents&lt;/li&gt;
&lt;li&gt;access documents from other tenants&lt;/li&gt;
&lt;li&gt;delete entire collections
&lt;strong&gt;Fix&lt;/strong&gt;:
Follow “least privilege” and test rules using Firebase Emulator Suite.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  5. Storing Too Much in a Single Document
&lt;/h2&gt;

&lt;p&gt;Firestore documents have limits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1 MB per document&lt;/li&gt;
&lt;li&gt;Write rate: 1 write per second per document&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Mistake&lt;/strong&gt;: Storing large arrays, logs, chats, or full history in one big doc.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix&lt;/strong&gt;:&lt;br&gt;
Break large data into subcollections. Store lists as paginated documents.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Forgetting About Cold Starts in Cloud Functions
&lt;/h2&gt;

&lt;p&gt;Even in 2025, cold starts exist—especially on free tier or low-traffic functions.&lt;/p&gt;

&lt;p&gt;Mistakes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;packaging too many dependencies&lt;/li&gt;
&lt;li&gt;deploying many small functions&lt;/li&gt;
&lt;li&gt;running heavy initialization code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Fix&lt;/strong&gt;:&lt;br&gt;
Use 1–5 grouped functions per region. Switch to 2nd Gen Cloud Functions (faster scaling + fewer cold starts).&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Using Admin SDK Logic on Client Side
&lt;/h2&gt;

&lt;p&gt;Unexpected but common issue:&lt;br&gt;
Developers leak sensitive logic in frontend apps.&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;verifying tokens on client&lt;/li&gt;
&lt;li&gt;writing data with elevated privileges&lt;/li&gt;
&lt;li&gt;performing restricted queries from browser/mobile&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Fix&lt;/strong&gt;:&lt;br&gt;
Admin SDK should only run on secure environments like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cloud Functions&lt;/li&gt;
&lt;li&gt;server backend&lt;/li&gt;
&lt;li&gt;Admin panel with validated sessions&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  8. Not Leveraging Firestore’s Local Cache
&lt;/h2&gt;

&lt;p&gt;Firestore has a powerful built-in cache for offline support. But:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;many disable it&lt;/li&gt;
&lt;li&gt;reload UI before cache hydrates&lt;/li&gt;
&lt;li&gt;run duplicate network requests&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Fix&lt;/strong&gt;:&lt;br&gt;
Enable caching (default ON), and design UI to read cached data instantly.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Incorrect Environment Handling (Web, Angular, React)
&lt;/h2&gt;

&lt;p&gt;2025 mistake: Hardcoding Firebase config in frontend bundles—or storing prod config in dev environments.&lt;/p&gt;

&lt;p&gt;Typical issues:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;misconfigured API keys&lt;/li&gt;
&lt;li&gt;SSR builds leaking env variables&lt;/li&gt;
&lt;li&gt;staging accidentally pointing to production&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Fix&lt;/strong&gt;:&lt;br&gt;
Use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Angular: runtime environments (app.config.ts + external JSON)&lt;/li&gt;
&lt;li&gt;React/Next.js: server-side env + runtime config&lt;/li&gt;
&lt;li&gt;Set separate Firebase projects for dev/stage/prod&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;10. Not Monitoring Quotas &amp;amp; Billing&lt;/strong&gt;&lt;br&gt;
Firestore and Firebase are deceptively simple—but cost can explode fast due to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;chat apps&lt;/li&gt;
&lt;li&gt;real-time listeners&lt;/li&gt;
&lt;li&gt;large collections&lt;/li&gt;
&lt;li&gt;over-triggered functions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fix:&lt;br&gt;
Use Firebase’s:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Usage dashboard&lt;/li&gt;
&lt;li&gt;Cost explorer&lt;/li&gt;
&lt;li&gt;Alerts for reads/writes/functions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Always set a budget alert early.&lt;/p&gt;

&lt;p&gt;🧠 Final Thoughts&lt;/p&gt;

&lt;p&gt;Firebase is powerful, scalable, and developer-friendly—but only when used correctly. A few small configuration mistakes can lead to huge performance problems or billing surprises.&lt;/p&gt;

&lt;p&gt;Avoiding these 10 mistakes will help keep your Firebase applications fast, secure, and cost-efficient in 2025.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>frontend</category>
      <category>firebase</category>
      <category>programming</category>
    </item>
    <item>
      <title>🧱 SSR vs SSG vs ISR: Choosing the Right Rendering Strategy in 2025</title>
      <dc:creator>Mridu Dixit</dc:creator>
      <pubDate>Wed, 19 Nov 2025 04:36:38 +0000</pubDate>
      <link>https://forem.com/mridudixit15/ssr-vs-ssg-vs-isr-choosing-the-right-rendering-strategy-in-2025-44e0</link>
      <guid>https://forem.com/mridudixit15/ssr-vs-ssg-vs-isr-choosing-the-right-rendering-strategy-in-2025-44e0</guid>
      <description>&lt;p&gt;The web in 2025 is faster, smarter, and more dynamic than ever. But how your app renders still determines whether users stay or bounce. Let’s decode SSR, SSG, and ISR — and which one truly wins today.&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚡ 1. Server-Side Rendering (SSR)
&lt;/h2&gt;

&lt;p&gt;SSR generates HTML on-demand for every request. Frameworks like Next.js, Angular Universal, and Nuxt.js shine here.&lt;/p&gt;

&lt;h2&gt;
  
  
  ✅ Pros:
&lt;/h2&gt;

&lt;p&gt;SEO-friendly and fast first paint.&lt;/p&gt;

&lt;p&gt;Always delivers the latest data.&lt;/p&gt;

&lt;h2&gt;
  
  
  ❌ Cons:
&lt;/h2&gt;

&lt;p&gt;Heavier server load.&lt;/p&gt;

&lt;p&gt;Slower on repeated requests.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧩 Example (Next.js):
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export async function getServerSideProps() {
  const data = await fetchAPI();
  return { props: { data } };
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ⚙️ 2. Static Site Generation (SSG)
&lt;/h2&gt;

&lt;p&gt;SSG builds pages once at build time — lightning-fast delivery with CDN caching.&lt;/p&gt;

&lt;h2&gt;
  
  
  ✅ Pros:
&lt;/h2&gt;

&lt;p&gt;Instant page loads.&lt;/p&gt;

&lt;p&gt;Super cost-effective and scalable.&lt;/p&gt;

&lt;h2&gt;
  
  
  ❌ Cons:
&lt;/h2&gt;

&lt;p&gt;Data becomes stale until rebuild.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧩 Example:
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export async function getStaticProps() {
  const posts = await fetchPosts();
  return { props: { posts } };
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🔄 3. Incremental Static Regeneration (ISR)
&lt;/h2&gt;

&lt;p&gt;ISR is the hybrid approach — it combines SSG’s speed with SSR’s freshness by rebuilding pages in the background.&lt;/p&gt;

&lt;h2&gt;
  
  
  ✅ Pros:
&lt;/h2&gt;

&lt;p&gt;Near real-time updates.&lt;/p&gt;

&lt;p&gt;Great balance of performance and data accuracy.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧩 Example:
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export async function getStaticProps() {
  const posts = await fetchPosts();
  return {
    props: { posts },
    revalidate: 60, // Rebuild every 60s
  };
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🚀 Which Should You Choose in 2025?
&lt;/h3&gt;

&lt;p&gt;Feature                  SSR            SSG         ISR&lt;br&gt;
Speed                    ⚡⚡         ⚡⚡⚡           ⚡⚡⚡&lt;br&gt;
Fresh Data       ✅ Always   ❌ On rebuild       ✅ Periodically&lt;br&gt;
Scalability          ⚡            ⚡⚡⚡           ⚡⚡&lt;br&gt;
Use Case       Dynamic dashboards   Blogs/docs E-commerce,hybrid apps&lt;/p&gt;

&lt;h2&gt;
  
  
  🧠 Final Takeaway
&lt;/h2&gt;

&lt;p&gt;In 2025, ISR is the sweet spot — it gives you the speed of SSG with the freshness of SSR.&lt;br&gt;
For pure static content, go SSG.&lt;br&gt;
For real-time dashboards, choose SSR.&lt;br&gt;
But if you want both — ISR is your best friend.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ssr</category>
      <category>isr</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
