<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Shanthi's Dev Diary</title>
    <description>The latest articles on DEV Community by Shanthi's Dev Diary (@shantih_palani).</description>
    <link>https://dev.to/shantih_palani</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1302602%2Ff068a6b7-1771-41a1-b353-a664ecda5e62.png</url>
      <title>DEV Community: Shanthi's Dev Diary</title>
      <link>https://dev.to/shantih_palani</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shantih_palani"/>
    <language>en</language>
    <item>
      <title>React 19.3: The Release That Makes React Feel More Native</title>
      <dc:creator>Shanthi's Dev Diary</dc:creator>
      <pubDate>Mon, 14 Sep 2026 17:57:00 +0000</pubDate>
      <link>https://dev.to/shantih_palani/react-193-the-release-that-makes-react-feel-more-native-3pnh</link>
      <guid>https://dev.to/shantih_palani/react-193-the-release-that-makes-react-feel-more-native-3pnh</guid>
      <description>&lt;h1&gt;
  
  
  React 19.3: The Release That Makes React Feel More Native
&lt;/h1&gt;

&lt;p&gt;React 19.3 is here.&lt;/p&gt;

&lt;p&gt;And while this isn't one of those releases where you need to rewrite your entire application, there are a few changes that are genuinely interesting for anyone building modern React applications.&lt;/p&gt;

&lt;p&gt;The biggest ones are &lt;strong&gt;View Transitions&lt;/strong&gt; and &lt;strong&gt;Fragment Refs&lt;/strong&gt;, both of which were experimental APIs before becoming stable in React 19.3.&lt;/p&gt;

&lt;p&gt;What I find interesting about this release is that React is moving further into an area that frontend developers care about a lot:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How an application feels, not just how it works.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Let's look at the changes that matter.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. View Transitions are now stable
&lt;/h2&gt;

&lt;p&gt;This is probably the feature that will get the most attention.&lt;/p&gt;

&lt;p&gt;React 19.3 introduces the stable &lt;code&gt;&amp;lt;ViewTransition&amp;gt;&lt;/code&gt; component, which allows React applications to animate UI changes using the browser's View Transition API.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ViewTransition&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;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;function&lt;/span&gt; &lt;span class="nf"&gt;Product&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;product&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ViewTransition&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ProductCard&lt;/span&gt; &lt;span class="na"&gt;product&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;product&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;ViewTransition&lt;/span&gt;&lt;span class="p"&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;The interesting part isn't simply that React can now animate components.&lt;/p&gt;

&lt;p&gt;It's &lt;strong&gt;when&lt;/strong&gt; React decides to animate them.&lt;/p&gt;

&lt;p&gt;React understands different kinds of transitions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;enter&lt;/code&gt; — something is added&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;exit&lt;/code&gt; — something is removed&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;update&lt;/code&gt; — existing content or styling changes&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;share&lt;/code&gt; — something moves from one place to another&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This means animations can become part of the UI transition model instead of being manually wired into every state change.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. View Transitions work with React Transitions
&lt;/h2&gt;

&lt;p&gt;Here's where this becomes more interesting.&lt;/p&gt;

&lt;p&gt;A View Transition is triggered when an update is marked as a React Transition.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;ViewTransition&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;startTransition&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;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;function&lt;/span&gt; &lt;span class="nf"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&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;showItem&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setShowItem&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&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="p"&gt;&amp;lt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;
        &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&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="p"&gt;{&lt;/span&gt;
          &lt;span class="nf"&gt;startTransition&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="nf"&gt;setShowItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prev&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
          &lt;span class="p"&gt;});&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;showItem&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hide&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Show&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

      &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;showItem&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ViewTransition&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Video&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;ViewTransition&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&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;React can now connect the state transition with the visual transition.&lt;/p&gt;

&lt;p&gt;Updates inside &lt;code&gt;startTransition&lt;/code&gt;, Suspense reveals, and updates caused by &lt;code&gt;useDeferredValue&lt;/code&gt; can trigger View Transitions.&lt;/p&gt;

&lt;p&gt;That distinction is important.&lt;/p&gt;

&lt;p&gt;Not every state update should be animated.&lt;/p&gt;

&lt;p&gt;An urgent interaction should usually happen immediately.&lt;/p&gt;

&lt;p&gt;A non-urgent transition can be animated.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. &lt;code&gt;addTransitionType()&lt;/code&gt; gives meaning to a transition
&lt;/h2&gt;

&lt;p&gt;Here's another feature I think developers will find useful.&lt;/p&gt;

&lt;p&gt;Imagine a carousel.&lt;/p&gt;

&lt;p&gt;When the user clicks Next, you want the slide to move from right to left.&lt;/p&gt;

&lt;p&gt;When they click Previous, you want it to move in the opposite direction.&lt;/p&gt;

&lt;p&gt;Both actions might update the same piece of state:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="nf"&gt;setCurrentSlide&lt;/span&gt;&lt;span class="p"&gt;(...)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So how does the animation know &lt;em&gt;why&lt;/em&gt; the state changed?&lt;/p&gt;

&lt;p&gt;React 19.3 introduces:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="nf"&gt;addTransitionType&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="nf"&gt;startTransition&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="nf"&gt;addTransitionType&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;next&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nf"&gt;setCurrentSlide&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;current&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="nf"&gt;startTransition&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="nf"&gt;addTransitionType&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;previous&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nf"&gt;setCurrentSlide&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;current&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can then configure different animations based on the transition type.&lt;/p&gt;

&lt;p&gt;This is a nice shift in thinking.&lt;/p&gt;

&lt;p&gt;Instead of saying:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Animate this component."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;you can say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"This UI changed because the user went to the next slide."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That additional context gives the animation system more control.&lt;/p&gt;




&lt;h1&gt;
  
  
  4. Suspense + View Transitions
&lt;/h1&gt;

&lt;p&gt;This is probably my favorite part of the release.&lt;/p&gt;

&lt;p&gt;Consider a component that suspends while data is loading.&lt;/p&gt;

&lt;p&gt;Normally you might have:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Suspense&lt;/span&gt; &lt;span class="na"&gt;fallback&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Loading&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ProductDetails&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Suspense&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;React 19.3 allows you to wrap the Suspense boundary with &lt;code&gt;ViewTransition&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ViewTransition&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Suspense&lt;/span&gt; &lt;span class="na"&gt;fallback&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Loading&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ProductDetails&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Suspense&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;ViewTransition&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When the suspended content becomes available, React can animate the transition from the fallback to the actual content.&lt;/p&gt;

&lt;p&gt;But there is an important UX lesson here.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't animate everything.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;React's documentation recommends that fallbacks appear immediately, while the transition from fallback to final content can be animated. Already-loaded content should ideally appear immediately.&lt;/p&gt;

&lt;p&gt;That is a subtle but important distinction.&lt;/p&gt;

&lt;p&gt;Animations should make the application feel faster, not make it feel slower.&lt;/p&gt;




&lt;h1&gt;
  
  
  5. Images and fonts can participate in transitions
&lt;/h1&gt;

&lt;p&gt;View Transitions aren't limited to React components.&lt;/p&gt;

&lt;p&gt;React 19.3 also allows images and fonts to participate in Suspense-based loading sequences.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ViewTransition&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Suspense&lt;/span&gt; &lt;span class="na"&gt;fallback&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Fallback&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;img&lt;/span&gt; &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;imageSrc&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;

    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;style&lt;/span&gt; &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;fontSrc&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;precedence&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"default"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;`@font-face {
        font-family: 'Fancy';
        src: url(&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;fontSrc&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;) format('truetype');
      }`&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;style&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Suspense&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;ViewTransition&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This can help avoid the typical experience where an image or font suddenly appears whenever the browser happens to finish loading it.&lt;/p&gt;

&lt;p&gt;Instead, multiple resources can participate in a coordinated loading experience.&lt;/p&gt;

&lt;p&gt;For product pages, profile cards, media-heavy interfaces, and dashboards, this could become particularly useful.&lt;/p&gt;




&lt;h1&gt;
  
  
  6. Fragment Refs are finally stable
&lt;/h1&gt;

&lt;p&gt;The second major feature is &lt;strong&gt;Fragment Refs&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;We've all encountered this problem.&lt;/p&gt;

&lt;p&gt;A component renders multiple elements:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Heading&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Heading&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Heading&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You want a ref to the group.&lt;/p&gt;

&lt;p&gt;But there isn't a single DOM element you can attach the ref to.&lt;/p&gt;

&lt;p&gt;You could add:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  ...
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But now you've changed the DOM structure just to support behavior.&lt;/p&gt;

&lt;p&gt;That can affect CSS, layout, accessibility, or existing component behavior.&lt;/p&gt;

&lt;p&gt;Fragment Refs solve this problem.&lt;/p&gt;

&lt;p&gt;React 19.3 allows a ref to be passed directly to a Fragment.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fragmentRef&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useRef&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Fragment&lt;/span&gt; &lt;span class="na"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;fragmentRef&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Heading&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Heading&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Heading&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Fragment&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The ref gives you a &lt;code&gt;FragmentInstance&lt;/code&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  7. What can you do with FragmentInstance?
&lt;/h1&gt;

&lt;p&gt;This isn't just a ref that exists for the sake of having a ref.&lt;/p&gt;

&lt;p&gt;The FragmentInstance provides several useful operations.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Add and remove event listeners&lt;/li&gt;
&lt;li&gt;Dispatch events&lt;/li&gt;
&lt;li&gt;Manage focus&lt;/li&gt;
&lt;li&gt;Observe elements&lt;/li&gt;
&lt;li&gt;Measure client rectangles&lt;/li&gt;
&lt;li&gt;Scroll elements into view&lt;/li&gt;
&lt;li&gt;Access the root node&lt;/li&gt;
&lt;li&gt;Compare document positions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One particularly interesting use case is an &lt;code&gt;InView&lt;/code&gt; component.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;InView&lt;/span&gt; &lt;span class="na"&gt;onChange&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;setIsVisible&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Card&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Card&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;InView&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;InView&lt;/code&gt; component can observe its children without requiring them to have a common DOM wrapper or expose their own refs.&lt;/p&gt;

&lt;p&gt;That can make reusable UI components considerably cleaner.&lt;/p&gt;




&lt;h1&gt;
  
  
  8. A new &lt;code&gt;browser&lt;/code&gt; API for server rendering
&lt;/h1&gt;

&lt;p&gt;React 19.3 also introduces a &lt;code&gt;browser&lt;/code&gt; API in &lt;code&gt;react-dom&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Server rendering creates an interesting problem.&lt;/p&gt;

&lt;p&gt;Some components simply don't make sense on the server.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;timeZone&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Intl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DateTimeFormat&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolvedOptions&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;timeZone&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The user's timezone is a browser concern.&lt;/p&gt;

&lt;p&gt;Previously, developers often handled this with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;mounted&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setMounted&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nf"&gt;useEffect&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="nf"&gt;setMounted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&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;or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;undefined&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;React 19.3 provides a more direct mechanism:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;use&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;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="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;browser&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;react-dom&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;TimeZone&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;browser&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;timeZone&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Intl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DateTimeFormat&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolvedOptions&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;timeZone&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;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;timeZone&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;During server rendering, &lt;code&gt;use(browser())&lt;/code&gt; suspends and allows the nearest Suspense fallback to be rendered. On the client, it doesn't suspend.&lt;/p&gt;

&lt;p&gt;This is particularly interesting for applications that mix server-rendered and browser-specific experiences.&lt;/p&gt;




&lt;h1&gt;
  
  
  9. Trusted Types support
&lt;/h1&gt;

&lt;p&gt;Security is another area where React 19.3 gets an important improvement.&lt;/p&gt;

&lt;p&gt;React now integrates with the browser's &lt;strong&gt;Trusted Types API&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Trusted Types helps protect applications against DOM-based XSS by requiring certain DOM injection APIs to receive trusted objects rather than arbitrary strings.&lt;/p&gt;

&lt;p&gt;Previously, React could coerce Trusted Types objects into strings.&lt;/p&gt;

&lt;p&gt;React 19.3 now passes these values through without that coercion, allowing browser Trusted Types policies to work correctly.&lt;/p&gt;

&lt;p&gt;For applications with strong Content Security Policy requirements, this is a meaningful improvement.&lt;/p&gt;




&lt;h1&gt;
  
  
  10. Server Components get a small but useful improvement
&lt;/h1&gt;

&lt;p&gt;React 19.3 also makes it possible for Server Components to render Context directly.&lt;/p&gt;

&lt;p&gt;Previously, you might create a separate provider component:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;UserProvider&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="nx"&gt;currentUser&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;children&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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;UserContext&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;currentUser&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;UserContext&lt;/span&gt;&lt;span class="p"&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;Then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;UserProvider&lt;/span&gt; &lt;span class="na"&gt;currentUser&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;currentUser&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;UserProvider&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With React 19.3, a Server Component can render the Context directly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;UserContext&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;currentUser&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;UserContext&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This removes a wrapper whose only purpose was forwarding a value into Context.&lt;/p&gt;

&lt;p&gt;It's a relatively small change, but one that can simplify Server Component code.&lt;/p&gt;




&lt;h1&gt;
  
  
  11. There are also some important fixes
&lt;/h1&gt;

&lt;p&gt;React 19.3 isn't only about new APIs.&lt;/p&gt;

&lt;p&gt;The release includes changes to how transitions are rendered, so a slow Transition doesn't hold up unrelated transitions.&lt;/p&gt;

&lt;p&gt;There are also fixes around:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;useDeferredValue&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Context propagation through Suspense&lt;/li&gt;
&lt;li&gt;&lt;code&gt;useSyncExternalStore&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;useEffectEvent&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Fast Refresh&lt;/li&gt;
&lt;li&gt;Activity&lt;/li&gt;
&lt;li&gt;Hydration&lt;/li&gt;
&lt;li&gt;Mobile Safari View Transition crashes&lt;/li&gt;
&lt;li&gt;Server Components&lt;/li&gt;
&lt;li&gt;Form state&lt;/li&gt;
&lt;li&gt;DOM behavior&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So upgrading isn't just about getting shiny new APIs. There are also stability and correctness improvements underneath.&lt;/p&gt;




&lt;h1&gt;
  
  
  What actually matters for a React developer?
&lt;/h1&gt;

&lt;p&gt;If I had to narrow React 19.3 down to four things, I'd pick:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. View Transitions
&lt;/h3&gt;

&lt;p&gt;This can fundamentally improve how navigation and state changes feel.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Fragment Refs
&lt;/h3&gt;

&lt;p&gt;A much cleaner way to interact with groups of DOM elements without introducing unnecessary wrappers.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. &lt;code&gt;browser()&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;A more React-native way of dealing with components that should only render meaningfully in the browser.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Trusted Types
&lt;/h3&gt;

&lt;p&gt;An important security improvement for applications with strong CSP and XSS protection requirements.&lt;/p&gt;




&lt;h1&gt;
  
  
  Should you upgrade immediately?
&lt;/h1&gt;

&lt;p&gt;Not necessarily.&lt;/p&gt;

&lt;p&gt;If you're maintaining a production application, I'd first check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React version compatibility&lt;/li&gt;
&lt;li&gt;Next.js/framework compatibility&lt;/li&gt;
&lt;li&gt;Third-party libraries&lt;/li&gt;
&lt;li&gt;Testing setup&lt;/li&gt;
&lt;li&gt;SSR/hydration behavior&lt;/li&gt;
&lt;li&gt;Any libraries that depend on React internals&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But if you're starting a new application or experimenting with modern React patterns, &lt;strong&gt;React 19.3 is worth exploring&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Especially if your application has rich transitions, Suspense-heavy loading experiences, or complex DOM interactions.&lt;/p&gt;




&lt;h1&gt;
  
  
  The bigger picture
&lt;/h1&gt;

&lt;p&gt;What I find interesting about React 19.3 isn't any single API.&lt;/p&gt;

&lt;p&gt;It's the direction.&lt;/p&gt;

&lt;p&gt;React has historically focused heavily on &lt;strong&gt;rendering UI based on state&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Now we're seeing more attention on the transition between states:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;State A
   ↓
Transition
   ↓
State B
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;How does the UI move?&lt;/p&gt;

&lt;p&gt;How does loading feel?&lt;/p&gt;

&lt;p&gt;How does content appear?&lt;/p&gt;

&lt;p&gt;How do we interact with groups of DOM nodes without destroying the component structure?&lt;/p&gt;

&lt;p&gt;How do server-rendered and browser-only experiences coexist?&lt;/p&gt;

&lt;p&gt;Those are increasingly important questions for frontend engineering.&lt;/p&gt;

&lt;p&gt;Because a technically correct application isn't necessarily a good application.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The best frontend experiences are the ones where users barely notice the transitions between states.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And React 19.3 takes another step in that direction.&lt;/p&gt;

</description>
      <category>frontend</category>
      <category>javascript</category>
      <category>react</category>
      <category>webdev</category>
    </item>
    <item>
      <title>If REST APIs Keep Asking, Webhooks Simply Call</title>
      <dc:creator>Shanthi's Dev Diary</dc:creator>
      <pubDate>Thu, 06 Aug 2026 15:27:33 +0000</pubDate>
      <link>https://dev.to/shantih_palani/if-rest-apis-keep-asking-webhooks-simply-call-4cle</link>
      <guid>https://dev.to/shantih_palani/if-rest-apis-keep-asking-webhooks-simply-call-4cle</guid>
      <description>&lt;h2&gt;
  
  
  REST API vs Webhook: Stop Asking "Are We There Yet?" 🚗💨
&lt;/h2&gt;

&lt;p&gt;If you've been building applications for a while, you've probably worked with &lt;strong&gt;REST APIs&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And at some point, you've probably written something like this:&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="nf"&gt;setInterval&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="nf"&gt;checkStatus&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Congratulations. 🎉&lt;/p&gt;

&lt;p&gt;You've successfully taught your application to behave like a kid on a road trip:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"Are we there yet?"&lt;/strong&gt;&lt;br&gt;
"No."&lt;br&gt;
&lt;strong&gt;"Are we there yet?"&lt;/strong&gt;&lt;br&gt;
"No."&lt;br&gt;
&lt;strong&gt;"How about now?"&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's basically &lt;strong&gt;polling&lt;/strong&gt;. 😄&lt;/p&gt;

&lt;p&gt;And this is exactly where &lt;strong&gt;Webhooks&lt;/strong&gt; enter the picture.&lt;/p&gt;

&lt;p&gt;Let's understand REST APIs vs Webhooks without making it feel like we're reading an RFC document.&lt;/p&gt;




&lt;h2&gt;
  
  
  🍕 Let's Start With Pizza
&lt;/h2&gt;

&lt;p&gt;Imagine you've ordered a pizza.&lt;/p&gt;

&lt;p&gt;You have two ways to know whether it's ready.&lt;/p&gt;

&lt;h3&gt;
  
  
  REST API Approach
&lt;/h3&gt;

&lt;p&gt;You call the restaurant every 2 minutes.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;👩‍💻 You: "Is my pizza ready?"&lt;/p&gt;

&lt;p&gt;🍕 Restaurant: "No."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Two minutes later...&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;👩‍💻 You: "Now?"&lt;/p&gt;

&lt;p&gt;🍕 Restaurant: "Still no."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Two minutes later...&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;👩‍💻 You: "Now?"&lt;/p&gt;

&lt;p&gt;🍕 Restaurant: "Please stop calling us."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Finally...&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;👩‍💻 You: "Now?"&lt;/p&gt;

&lt;p&gt;🍕 Restaurant: "YES!"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is essentially &lt;strong&gt;polling an API&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Your application keeps asking the server whether something has changed.&lt;/p&gt;




&lt;h3&gt;
  
  
  Webhook Approach
&lt;/h3&gt;

&lt;p&gt;Now imagine a slightly smarter restaurant.&lt;/p&gt;

&lt;p&gt;You order the pizza and continue watching Netflix.&lt;/p&gt;

&lt;p&gt;When the pizza is ready:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🔔 &lt;strong&gt;Ding Dong!&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The restaurant notifies you.&lt;/p&gt;

&lt;p&gt;You didn't ask.&lt;/p&gt;

&lt;p&gt;You didn't poll.&lt;/p&gt;

&lt;p&gt;You didn't write a &lt;code&gt;setInterval()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;You just got notified when something happened.&lt;/p&gt;

&lt;p&gt;That's a &lt;strong&gt;Webhook&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  So, What Exactly Is a REST API?
&lt;/h2&gt;

&lt;p&gt;REST stands for &lt;strong&gt;Representational State Transfer&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Which sounds complicated enough to impress someone at a meeting.&lt;/p&gt;

&lt;p&gt;But the idea is simple.&lt;/p&gt;

&lt;p&gt;A client sends a request.&lt;/p&gt;

&lt;p&gt;The server sends a response.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Client
   │
   │  GET /orders/123
   ▼
Server
   │
   │  200 OK
   ▼
{
  "status": "Shipped"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important part is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The client starts the conversation.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The server isn't randomly calling your frontend at 2 AM saying:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"HEY! ORDER 123 JUST SHIPPED!"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It waits until you ask.&lt;/p&gt;




&lt;h2&gt;
  
  
  Common REST Methods
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GET&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Give me something&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;POST&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Create something&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PUT&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Replace something&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PATCH&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Change something&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;DELETE&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;This relationship isn't working&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Okay... technically &lt;code&gt;DELETE&lt;/code&gt; removes a resource. 😄&lt;/p&gt;




&lt;h2&gt;
  
  
  Example REST Request
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /api/users/101
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Response:&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;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;101&lt;/span&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;"Alex"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Developer"&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;Simple.&lt;/p&gt;

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

&lt;p&gt;Reliable.&lt;/p&gt;

&lt;p&gt;REST APIs are perfect when &lt;strong&gt;you know when you need the data&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is a Webhook?
&lt;/h2&gt;

&lt;p&gt;A Webhook flips the communication model.&lt;/p&gt;

&lt;p&gt;Instead of:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Hey server, anything new?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The server says:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I'll tell you when something happens."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Your application exposes an endpoint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POST /webhooks/payment
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then another service calls it when an event occurs.&lt;/p&gt;

&lt;p&gt;For example:&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;"event"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"payment.completed"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"orderId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1234&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"amount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;250&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;Your application didn't ask for this.&lt;/p&gt;

&lt;p&gt;The payment provider sent it because something happened.&lt;/p&gt;

&lt;p&gt;That's why Webhooks are often described as:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Event-driven HTTP callbacks.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Or, if you prefer:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"Call me when something interesting happens."&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  REST API vs Webhook Communication
&lt;/h2&gt;

&lt;h2&gt;
  
  
  REST API
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Client                      Server

   │                           │
   │──── Anything new? ───────►│
   │◄────── Nope ──────────────│
   │                           │
   │──── Anything new? ───────►│
   │◄────── Still nope ────────│
   │                           │
   │──── Anything new? ───────►│
   │◄────── YES! ──────────────│
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Webhook
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Application                 Provider

     │                          │
     │                          │
     │       *event occurs*     │
     │                          │
     │◄──── HEY! UPDATE! ───────│
     │                          │
     │────── 200 OK ───────────►│
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Much quieter.&lt;/p&gt;

&lt;p&gt;Your servers will thank you.&lt;/p&gt;

&lt;p&gt;Your cloud bill might too. 😄&lt;/p&gt;




&lt;h2&gt;
  
  
  Polling vs Push
&lt;/h2&gt;

&lt;p&gt;Let's say you're waiting for a payment to complete.&lt;/p&gt;

&lt;h3&gt;
  
  
  Polling
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /payment/status

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

&lt;/div&gt;



&lt;p&gt;Five seconds later:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /payment/status

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

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /payment/status

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

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /payment/status

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

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /payment/status

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

&lt;/div&gt;



&lt;p&gt;Your server:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"You could've just waited for me to tell you." 😑&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  Webhook
&lt;/h3&gt;

&lt;p&gt;Payment succeeds.&lt;/p&gt;

&lt;p&gt;The payment provider immediately sends:&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;"event"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"payment.success"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"paymentId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"pay_123"&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;Your application processes it.&lt;/p&gt;

&lt;p&gt;Done.&lt;/p&gt;

&lt;p&gt;No unnecessary requests.&lt;/p&gt;

&lt;p&gt;No polling.&lt;/p&gt;

&lt;p&gt;No server harassment.&lt;/p&gt;




&lt;h2&gt;
  
  
  Real-World Example: GitHub 💻
&lt;/h2&gt;

&lt;p&gt;Imagine building CI/CD without Webhooks.&lt;/p&gt;

&lt;p&gt;Your CI server would constantly ask:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Hey GitHub, new commit?

No.

New commit?

No.

New commit?

No.

New commit?

YES!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead, when someone pushes code, GitHub sends a Webhook.&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;"event"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"push"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"repository"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"awesome-project"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"branch"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"main"&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;Your pipeline wakes up and starts working.&lt;/p&gt;

&lt;p&gt;Meanwhile, the developer who pushed on Friday evening suddenly remembers:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Maybe I shouldn't have deployed that."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Too late. 🚀&lt;/p&gt;




&lt;h2&gt;
  
  
  Real-World Example: Payments 💳
&lt;/h2&gt;

&lt;p&gt;Payment systems are one of the best examples of why Webhooks matter.&lt;/p&gt;

&lt;p&gt;Your application might initiate a payment using a REST API.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POST /payments
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The payment provider responds:&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;"paymentId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"12345"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"processing"&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;But the final payment result may happen seconds—or minutes—later.&lt;/p&gt;

&lt;p&gt;Instead of repeatedly checking:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /payments/12345

GET /payments/12345

GET /payments/12345
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The provider sends:&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;"event"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"payment.completed"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"paymentId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"12345"&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;REST started the process.&lt;/p&gt;

&lt;p&gt;Webhook told us how it ended.&lt;/p&gt;

&lt;p&gt;A beautiful relationship. ❤️&lt;/p&gt;

&lt;p&gt;Unlike some microservices.&lt;/p&gt;




&lt;h2&gt;
  
  
  Real-World Example: WhatsApp Business 💬
&lt;/h2&gt;

&lt;p&gt;Messaging systems are another perfect example.&lt;/p&gt;

&lt;p&gt;Your application sends a message using an API.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POST /messages
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The message may go through multiple states:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Sent
  ↓
Delivered
  ↓
Read
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You don't want to keep asking:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Is it delivered?

Is it delivered?

Is it delivered?

Did they read it?

Did they read it?

WHY HAVEN'T THEY READ IT?!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At this point, we're no longer debugging.&lt;/p&gt;

&lt;p&gt;We're emotionally invested. 😂&lt;/p&gt;

&lt;p&gt;Instead, Webhooks notify your application whenever the status changes.&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;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"delivered"&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;Later:&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;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"read"&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;Your application updates accordingly.&lt;/p&gt;




&lt;h1&gt;
  
  
  REST APIs Are Great At...
&lt;/h1&gt;

&lt;p&gt;REST APIs are ideal when your application needs to &lt;strong&gt;actively perform an operation&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fetch users&lt;/li&gt;
&lt;li&gt;Search products&lt;/li&gt;
&lt;li&gt;Create orders&lt;/li&gt;
&lt;li&gt;Update profiles&lt;/li&gt;
&lt;li&gt;Delete records&lt;/li&gt;
&lt;li&gt;Generate reports&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Think:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"I need something right now."&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Use an API.&lt;/p&gt;




&lt;h1&gt;
  
  
  Webhooks Are Great At...
&lt;/h1&gt;

&lt;p&gt;Webhooks are ideal when your application needs to &lt;strong&gt;react when something happens&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Payment completed&lt;/li&gt;
&lt;li&gt;Order shipped&lt;/li&gt;
&lt;li&gt;Message delivered&lt;/li&gt;
&lt;li&gt;Email opened&lt;/li&gt;
&lt;li&gt;User registered&lt;/li&gt;
&lt;li&gt;GitHub push received&lt;/li&gt;
&lt;li&gt;Build completed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Think:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"Tell me when something happens."&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Use a Webhook.&lt;/p&gt;




&lt;h1&gt;
  
  
  REST API vs Webhook
&lt;/h1&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;REST API&lt;/th&gt;
&lt;th&gt;Webhook&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Communication&lt;/td&gt;
&lt;td&gt;Request → Response&lt;/td&gt;
&lt;td&gt;Event → Notification&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Initiated By&lt;/td&gt;
&lt;td&gt;Client&lt;/td&gt;
&lt;td&gt;Provider&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Updates&lt;/td&gt;
&lt;td&gt;Polling&lt;/td&gt;
&lt;td&gt;Push&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Real-Time&lt;/td&gt;
&lt;td&gt;Not necessarily&lt;/td&gt;
&lt;td&gt;Usually&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HTTP Methods&lt;/td&gt;
&lt;td&gt;GET, POST, PUT, PATCH, DELETE&lt;/td&gt;
&lt;td&gt;Mostly POST&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best For&lt;/td&gt;
&lt;td&gt;CRUD &amp;amp; commands&lt;/td&gt;
&lt;td&gt;Event notifications&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Network Requests&lt;/td&gt;
&lt;td&gt;Potentially many&lt;/td&gt;
&lt;td&gt;Usually only when needed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Endpoint&lt;/td&gt;
&lt;td&gt;Provider exposes API&lt;/td&gt;
&lt;td&gt;Consumer exposes endpoint&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Developer Mood&lt;/td&gt;
&lt;td&gt;🙂&lt;/td&gt;
&lt;td&gt;😎&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Okay, that last row may not be scientifically verified.&lt;/p&gt;




&lt;h1&gt;
  
  
  Why Not Use Webhooks for Everything?
&lt;/h1&gt;

&lt;p&gt;At this point, Webhooks might sound magical.&lt;/p&gt;

&lt;p&gt;So why not replace APIs completely?&lt;/p&gt;

&lt;p&gt;Because imagine asking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Webhook, give me all products under ₹1,000."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Webhook:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"That's... not my job."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Webhooks notify you about events.&lt;/p&gt;

&lt;p&gt;They aren't designed for arbitrary data retrieval.&lt;/p&gt;

&lt;p&gt;Similarly, REST APIs don't magically notify you when something changes unless you ask.&lt;/p&gt;

&lt;p&gt;They solve different problems.&lt;/p&gt;




&lt;h1&gt;
  
  
  The Best Architecture? Use Both 🤝
&lt;/h1&gt;

&lt;p&gt;Most modern integrations use &lt;strong&gt;REST APIs and Webhooks together&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                 USER
                   │
                   │
                   ▼
            REST API Request
             Create Order
                   │
                   ▼
              Application
                   │
                   ▼
            Payment Provider
                   │
                   │
            Payment Completed
                   │
                   ▼
                WEBHOOK
                   │
                   ▼
           Update Database
                   │
                   ▼
           Notify Customer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;REST API:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Please do this."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Webhook:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Hey! That thing you asked for? It's done."&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  But Webhooks Come With Responsibilities ⚠️
&lt;/h1&gt;

&lt;p&gt;Webhooks are great, but don't blindly trust incoming requests.&lt;/p&gt;

&lt;p&gt;Anyone who discovers your endpoint could potentially send requests to it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POST /webhook

{
  "payment": "success"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your application:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Cool! Free money!"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;🚨 &lt;strong&gt;Absolutely not.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Always verify incoming Webhooks.&lt;/p&gt;

&lt;p&gt;Common protections include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HTTPS&lt;/li&gt;
&lt;li&gt;HMAC signatures&lt;/li&gt;
&lt;li&gt;Secret tokens&lt;/li&gt;
&lt;li&gt;Timestamp validation&lt;/li&gt;
&lt;li&gt;Replay protection&lt;/li&gt;
&lt;li&gt;Idempotency&lt;/li&gt;
&lt;li&gt;Retry handling&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Don't Forget Idempotency
&lt;/h1&gt;

&lt;p&gt;Webhook providers may retry events.&lt;/p&gt;

&lt;p&gt;That means you might receive:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;payment.completed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;twice.&lt;/p&gt;

&lt;p&gt;If your code blindly processes both:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Webhook #1 → Ship Product

Webhook #2 → Ship Product Again
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Customer:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Wow, amazing service!"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Finance team:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"We need to talk."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Your Webhook handlers should therefore be &lt;strong&gt;idempotent&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Processing the same event multiple times should produce the same result as processing it once.&lt;/p&gt;




&lt;h1&gt;
  
  
  What Happens If Your Webhook Fails?
&lt;/h1&gt;

&lt;p&gt;Suppose the provider sends:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POST /webhook
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But your server responds:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;500 Internal Server Error
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Most Webhook providers implement retry mechanisms.&lt;/p&gt;

&lt;p&gt;Something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Attempt 1 → Failed

Wait...

Attempt 2 → Failed

Wait longer...

Attempt 3 → Success 🎉
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is commonly implemented using &lt;strong&gt;exponential backoff&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So when designing Webhooks, always think about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Retries&lt;/li&gt;
&lt;li&gt;Duplicate events&lt;/li&gt;
&lt;li&gt;Event ordering&lt;/li&gt;
&lt;li&gt;Failed processing&lt;/li&gt;
&lt;li&gt;Logging and monitoring&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because distributed systems have one universal rule:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;If something can fail, eventually it will.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Usually in production.&lt;/p&gt;

&lt;p&gt;Usually on Friday.&lt;/p&gt;




&lt;h1&gt;
  
  
  Quick Decision Guide
&lt;/h1&gt;

&lt;p&gt;Ask yourself one question.&lt;/p&gt;

&lt;h3&gt;
  
  
  Do I need to request something?
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;YES
 │
 ▼
REST API
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Get Products
Create Order
Update User
Delete Record
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Do I need to know when something happens?
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;YES
 │
 ▼
WEBHOOK
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Payment Completed
Order Shipped
Message Delivered
Build Finished
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Need both?
&lt;/h3&gt;

&lt;p&gt;Welcome to modern software development. 😄&lt;/p&gt;




&lt;h1&gt;
  
  
  Final Takeaway
&lt;/h1&gt;

&lt;p&gt;The easiest way to remember the difference is:&lt;/p&gt;

&lt;h3&gt;
  
  
  REST API
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"Hey, do you have an update?"&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Webhook
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"I'll call you when I have an update."&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;REST APIs are &lt;strong&gt;request-driven&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Webhooks are &lt;strong&gt;event-driven&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And in most real-world systems, they work best &lt;strong&gt;together&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So the next time you find yourself writing:&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="nf"&gt;setInterval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;checkStatus&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pause for a second.&lt;/p&gt;

&lt;p&gt;Take a deep breath.&lt;/p&gt;

&lt;p&gt;And ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"Could this have been a Webhook?"&lt;/strong&gt; 😄&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;If you enjoyed this article, drop a ❤️, share it with another developer, and let me know:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's the funniest polling implementation you've seen in production?&lt;/strong&gt; 😄&lt;/p&gt;

&lt;p&gt;Happy Coding! 🚀&lt;/p&gt;

</description>
      <category>webhook</category>
      <category>restapi</category>
      <category>javascript</category>
      <category>node</category>
    </item>
    <item>
      <title>Why Firestore Keeps Throwing “Missing Index” Errors — And How to Fix It Like an Engineer</title>
      <dc:creator>Shanthi's Dev Diary</dc:creator>
      <pubDate>Wed, 29 Apr 2026 18:52:35 +0000</pubDate>
      <link>https://dev.to/shantih_palani/why-firestore-keeps-throwing-missing-index-errors-and-how-to-fix-it-like-an-engineer-4m9k</link>
      <guid>https://dev.to/shantih_palani/why-firestore-keeps-throwing-missing-index-errors-and-how-to-fix-it-like-an-engineer-4m9k</guid>
      <description>&lt;p&gt;If you’ve worked with Firestore long enough, you’ve definitely seen this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“The query requires an index. You can create it here…”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;At first, it feels harmless. You click the link, create the index, and move on.&lt;/p&gt;

&lt;p&gt;But as your application grows, this turns into:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Random API failures&lt;/li&gt;
&lt;li&gt;Broken production queries&lt;/li&gt;
&lt;li&gt;Confusing deployment issues&lt;/li&gt;
&lt;li&gt;A growing list of manually created indexes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I’ve been there. Let’s break down why this happens—and how to fix it properly.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Root Cause
&lt;/h2&gt;

&lt;p&gt;Firestore is &lt;strong&gt;not a relational database&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Unlike SQL databases that dynamically plan queries, Firestore depends entirely on &lt;strong&gt;pre-built indexes&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It automatically indexes single fields, but the moment you write queries like:&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="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;collection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;orders&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;status&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;==&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;completed&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;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;createdAt&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;&amp;gt;=&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;someDate&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;orderBy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;createdAt&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;desc&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Firestore needs a &lt;strong&gt;composite index&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If it doesn’t exist → your query fails.&lt;/p&gt;




&lt;h2&gt;
  
  
  How Firestore Thinks
&lt;/h2&gt;

&lt;p&gt;Instead of executing queries dynamically, Firestore does:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Do I already have an index that exactly matches this query?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Yes → return results fast &lt;/li&gt;
&lt;li&gt;No → throw error &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s it. No fallback. No query optimization.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Beginner Workflow (And Why It Breaks)
&lt;/h2&gt;

&lt;p&gt;Most developers follow this flow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Run query&lt;/li&gt;
&lt;li&gt;Get error&lt;/li&gt;
&lt;li&gt;Click “Create Index”&lt;/li&gt;
&lt;li&gt;Retry&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This works… until:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You deploy to staging or production&lt;/li&gt;
&lt;li&gt;A teammate runs the same query&lt;/li&gt;
&lt;li&gt;CI/CD pipelines execute code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now the index doesn’t exist there →  failure&lt;/p&gt;




&lt;h2&gt;
  
  
  The Real Problem in Production
&lt;/h2&gt;

&lt;p&gt;Manual index creation leads to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Environment inconsistencies&lt;/li&gt;
&lt;li&gt;Deployment risks&lt;/li&gt;
&lt;li&gt;Hard-to-debug runtime errors&lt;/li&gt;
&lt;li&gt;Lack of visibility into required indexes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Indexes become &lt;strong&gt;tribal knowledge&lt;/strong&gt;, not code.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Engineering Fix
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Version-Control Your Indexes
&lt;/h3&gt;

&lt;p&gt;Export your indexes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;firebase firestore:indexes &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; firestore.indexes.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you have something like:&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;"indexes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"collectionGroup"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"orders"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"queryScope"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"COLLECTION"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"fields"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"fieldPath"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"order"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ASCENDING"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"fieldPath"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"createdAt"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"order"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"DESCENDING"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;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;&lt;em&gt;This file should live in your repo.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  2. Deploy Indexes via CI/CD
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;firebase deploy &lt;span class="nt"&gt;--only&lt;/span&gt; firestore:indexes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now your indexes are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Repeatable&lt;/li&gt;
&lt;li&gt;Shareable&lt;/li&gt;
&lt;li&gt;Environment-safe&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  3. Design Queries Before Writing Them
&lt;/h3&gt;

&lt;p&gt;Instead of reacting to errors, think upfront:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What filters will this API support?&lt;/li&gt;
&lt;li&gt;What sorting is required?&lt;/li&gt;
&lt;li&gt;Will pagination be used?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Design indexes alongside your API.&lt;/p&gt;




&lt;h2&gt;
  
  
  Avoid Index Explosion
&lt;/h2&gt;

&lt;p&gt;This is where things get messy.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bad Pattern
&lt;/h3&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="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;status&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;==&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;==&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;region&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;==&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;region&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;orderBy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;createdAt&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This creates &lt;strong&gt;combinatorial index explosion&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  Better Approach: Denormalization
&lt;/h3&gt;

&lt;p&gt;Instead of multiple filters:&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="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;status_type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;==&lt;/span&gt;&lt;span class="dl"&gt;'&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;status&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="kd"&gt;type&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;p&gt;Or simplify queries:&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="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;status&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;==&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;orderBy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;createdAt&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;em&gt;Fewer combinations = fewer indexes&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Advanced Tricks
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Use &lt;code&gt;in&lt;/code&gt; Queries
&lt;/h3&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="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;status&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;in&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;open&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pending&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reduces multiple queries and index combinations.&lt;/p&gt;




&lt;h3&gt;
  
  
  Avoid Multiple Range Filters
&lt;/h3&gt;

&lt;p&gt;This won’t work:&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="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;createdAt&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;price&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;y&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;&lt;em&gt;Firestore limitation — redesign your schema.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Use Composite Fields
&lt;/h3&gt;

&lt;p&gt;Instead of:&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="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;firstName&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;==&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;John&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;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;lastName&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;==&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Doe&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Store:&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="nx"&gt;fullName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;John_Doe&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Backend Best Practice (Node.js)
&lt;/h2&gt;

&lt;p&gt;Always log index errors clearly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;try&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;snapshot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;code&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Missing Firestore index:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Frontend (React) Gotcha
&lt;/h2&gt;

&lt;p&gt;Don’t let UI generate random query combinations.&lt;/p&gt;

&lt;p&gt;Instead:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Define fixed query patterns&lt;/li&gt;
&lt;li&gt;Map UI filters → backend-controlled queries&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Your backend should control index complexity, not the UI.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Mindset Shift
&lt;/h2&gt;

&lt;p&gt;Stop thinking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Firestore will figure it out.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Start thinking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Every query must already be indexed.”&lt;/p&gt;
&lt;/blockquote&gt;




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

&lt;p&gt;Firestore is incredibly fast—but only if you respect its rules.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Treat indexes as code&lt;/li&gt;
&lt;li&gt;Design queries upfront&lt;/li&gt;
&lt;li&gt;Reduce combinations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You’ll avoid 90% of these errors.&lt;/p&gt;




&lt;p&gt;If you’re currently struggling with index errors, don’t just fix them—&lt;strong&gt;systematize them&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That’s the difference between a working app and a scalable one.&lt;/p&gt;

</description>
      <category>firestore</category>
      <category>googlecloud</category>
      <category>node</category>
      <category>nosql</category>
    </item>
    <item>
      <title>Web Components: The Most Underrated Feature of the Modern Web</title>
      <dc:creator>Shanthi's Dev Diary</dc:creator>
      <pubDate>Sun, 15 Mar 2026 18:57:34 +0000</pubDate>
      <link>https://dev.to/shantih_palani/web-components-the-most-underrated-feature-of-the-modern-web-40cd</link>
      <guid>https://dev.to/shantih_palani/web-components-the-most-underrated-feature-of-the-modern-web-40cd</guid>
      <description>&lt;p&gt;A few days ago, one of my colleagues casually asked me:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Do you know Web Components?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;My immediate answer was:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Yes, of course.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But a few seconds later I paused and thought:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Wait… what exactly are Web Components?&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I had &lt;strong&gt;heard about them in tech talks&lt;/strong&gt;, maybe read about them somewhere, but I couldn’t confidently say:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I had used them in a project&lt;/li&gt;
&lt;li&gt;I fully understood how they worked&lt;/li&gt;
&lt;li&gt;I knew when to use them&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That moment made me curious.&lt;/p&gt;

&lt;p&gt;So I started digging deeper… and realized something surprising:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Web Components might be one of the most underrated features of the modern web.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What Are Web Components?
&lt;/h2&gt;

&lt;p&gt;Web Components are a set of &lt;strong&gt;native browser APIs&lt;/strong&gt; that allow developers to create &lt;strong&gt;custom, reusable HTML elements&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Instead of relying on framework-specific components like in React, Angular, or Vue, Web Components let you define your own HTML tags.&lt;/p&gt;

&lt;p&gt;Example:&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;user-card&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Shanthi"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/user-card&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once defined, the browser itself understands this component.&lt;/p&gt;

&lt;p&gt;That means the same component can work in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React apps&lt;/li&gt;
&lt;li&gt;Angular apps&lt;/li&gt;
&lt;li&gt;Vue apps&lt;/li&gt;
&lt;li&gt;Plain HTML pages&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Write once, use anywhere.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The 4 Building Blocks of Web Components
&lt;/h2&gt;

&lt;p&gt;Web Components are built on four main browser standards.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Custom Elements
&lt;/h2&gt;

&lt;p&gt;Custom Elements allow you to create your own HTML tags.&lt;/p&gt;

&lt;p&gt;Example:&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="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UserCard&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;HTMLElement&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;connectedCallback&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;innerHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`&amp;lt;p&amp;gt;Hello &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;getAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/p&amp;gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;customElements&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;define&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user-card&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;UserCard&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now the browser recognizes:&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;user-card&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Shanthi"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/user-card&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  2. Shadow DOM
&lt;/h2&gt;

&lt;p&gt;Shadow DOM provides &lt;strong&gt;encapsulation&lt;/strong&gt;.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Styles inside the component stay inside the component&lt;/li&gt;
&lt;li&gt;External CSS cannot break it&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 javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;shadow&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;attachShadow&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;open&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;shadow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`
  &amp;lt;style&amp;gt;
    p { color: blue; }
  &amp;lt;/style&amp;gt;
  &amp;lt;p&amp;gt;Hello from Shadow DOM&amp;lt;/p&amp;gt;
`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Think of it like giving your component &lt;strong&gt;its own private DOM and CSS space&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. HTML Templates
&lt;/h2&gt;

&lt;p&gt;Templates allow you to define reusable HTML structures.&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;template&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"cardTemplate"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&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;"card"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;h3&amp;gt;&amp;lt;/h3&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/template&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;JavaScript can clone this template whenever needed.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. ES Modules
&lt;/h2&gt;

&lt;p&gt;Web Components are usually distributed using &lt;strong&gt;JavaScript modules&lt;/strong&gt;.&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;import&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./user-card.js&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This keeps components &lt;strong&gt;modular and reusable across applications&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Simple Web Component Example
&lt;/h2&gt;

&lt;p&gt;Let’s build a small component.&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="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;HelloWorld&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;HTMLElement&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;connectedCallback&lt;/span&gt;&lt;span class="p"&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;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Developer&lt;/span&gt;&lt;span class="dl"&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;innerHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`
      &amp;lt;style&amp;gt;
        div {
          padding: 10px;
          border: 1px solid #ddd;
          border-radius: 6px;
        }
      &amp;lt;/style&amp;gt;
      &amp;lt;div&amp;gt;Hello &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;span class="s2"&gt; 👋&amp;lt;/div&amp;gt;
    `&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;customElements&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;define&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;hello-world&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;HelloWorld&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Usage:&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;hello-world&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Shanthi"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/hello-world&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Hello Shanthi 👋
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Why Web Components Matter
&lt;/h2&gt;

&lt;h2&gt;
  
  
  1. Framework Independence
&lt;/h2&gt;

&lt;p&gt;A single Web Component can work in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React&lt;/li&gt;
&lt;li&gt;Angular&lt;/li&gt;
&lt;li&gt;Vue&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is especially useful for organizations managing &lt;strong&gt;multiple frontend stacks&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Perfect for Design Systems
&lt;/h2&gt;

&lt;p&gt;Web Components are great for building &lt;strong&gt;design system libraries&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Example components:&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;company-button&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;company-modal&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;company-card&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These can be reused across multiple applications without rewriting them for each framework.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Long-Term Stability
&lt;/h2&gt;

&lt;p&gt;Frameworks evolve quickly.&lt;/p&gt;

&lt;p&gt;But Web Components are &lt;strong&gt;browser standards&lt;/strong&gt;, meaning they will keep working regardless of which framework becomes popular next.&lt;/p&gt;




&lt;h2&gt;
  
  
  Fun Facts About Web Components
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🧠 Fun Fact #1
&lt;/h3&gt;

&lt;p&gt;Many developers &lt;strong&gt;use Web Components without realizing it&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For example, the &lt;code&gt;&amp;lt;video&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;audio&amp;gt;&lt;/code&gt; elements behave like complex components built into the browser.&lt;/p&gt;




&lt;h3&gt;
  
  
  🧠 Fun Fact #2
&lt;/h3&gt;

&lt;p&gt;Google was one of the early promoters of Web Components and created the &lt;strong&gt;Polymer library&lt;/strong&gt; to help developers adopt them.&lt;/p&gt;




&lt;h3&gt;
  
  
  🧠 Fun Fact #3
&lt;/h3&gt;

&lt;p&gt;Salesforce built their UI framework called &lt;strong&gt;Lightning Web Components&lt;/strong&gt; using this concept.&lt;/p&gt;




&lt;h3&gt;
  
  
  🧠 Fun Fact #4
&lt;/h3&gt;

&lt;p&gt;Many modern &lt;strong&gt;microfrontend architectures&lt;/strong&gt; use Web Components as a way to integrate applications built with different frameworks.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Aren’t Web Components More Popular?
&lt;/h2&gt;

&lt;p&gt;This was the question I kept asking myself.&lt;/p&gt;

&lt;p&gt;A few possible reasons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Framework ecosystems became dominant&lt;/li&gt;
&lt;li&gt;Earlier browser support was inconsistent&lt;/li&gt;
&lt;li&gt;Developers are more comfortable using framework-specific solutions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But things are changing.&lt;/p&gt;

&lt;p&gt;Modern browsers now fully support Web Components, and more teams are exploring them for &lt;strong&gt;design systems and cross-framework libraries&lt;/strong&gt;.&lt;/p&gt;




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

&lt;p&gt;It’s funny how a simple question from a colleague made me revisit a concept I had only heard about in passing.&lt;/p&gt;

&lt;p&gt;Sometimes, technologies exist in the background for years before we truly notice their potential.&lt;/p&gt;

&lt;p&gt;Web Components might not be the most talked-about topic in frontend development, but they offer something powerful:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reusable UI components that work across frameworks.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And that makes them one of the &lt;strong&gt;most underrated features of the modern web.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;💡 &lt;strong&gt;Now I’m curious&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Have you used Web Components in production?&lt;/p&gt;

&lt;p&gt;Or are they still one of those technologies you’ve heard about but never explored deeply?&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>frontend</category>
      <category>webcomponents</category>
    </item>
    <item>
      <title>Understanding the &lt;Activity&gt; Component in React 19</title>
      <dc:creator>Shanthi's Dev Diary</dc:creator>
      <pubDate>Wed, 21 Jan 2026 09:09:30 +0000</pubDate>
      <link>https://dev.to/shantih_palani/understanding-the-component-in-react-19-2k01</link>
      <guid>https://dev.to/shantih_palani/understanding-the-component-in-react-19-2k01</guid>
      <description>&lt;p&gt;React 19 continues to push the boundaries of UI performance and control. One of the quieter—but powerful—additions is the &lt;strong&gt;&lt;code&gt;&amp;lt;Activity&amp;gt;&lt;/code&gt; component&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;At first glance, it looks like another conditional rendering helper. But under the hood, &lt;code&gt;&amp;lt;Activity&amp;gt;&lt;/code&gt; solves a long-standing problem in React apps:&lt;br&gt;&lt;br&gt;
&lt;strong&gt;hiding UI without destroying its state or effects&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Let’s break it down.&lt;/p&gt;


&lt;h2&gt;
  
  
  🤔 The Problem with Conditional Rendering
&lt;/h2&gt;

&lt;p&gt;In React today, hiding UI usually means &lt;strong&gt;unmounting it&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;isVisible&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ChatWindow&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When &lt;code&gt;isVisible&lt;/code&gt; becomes &lt;code&gt;false&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The component unmounts&lt;/li&gt;
&lt;li&gt;State is lost&lt;/li&gt;
&lt;li&gt;Effects are cleaned up&lt;/li&gt;
&lt;li&gt;Timers, subscriptions, and caches reset&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is often &lt;em&gt;not&lt;/em&gt; what we want.&lt;/p&gt;




&lt;h2&gt;
  
  
  🆕 Enter &lt;code&gt;&amp;lt;Activity&amp;gt;&lt;/code&gt; in React 19
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;&amp;lt;Activity&amp;gt;&lt;/code&gt; component allows you to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hide UI&lt;/li&gt;
&lt;li&gt;Keep it &lt;strong&gt;mounted&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Preserve &lt;strong&gt;state, effects, and subscriptions&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Think of it as &lt;strong&gt;pausing visibility, not lifecycle&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✨ Basic Usage
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Activity&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="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Activity&lt;/span&gt; &lt;span class="na"&gt;visible&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;isVisible&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ChatWindow&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Activity&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  What happens here?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;When &lt;code&gt;visible={false}&lt;/code&gt;:

&lt;ul&gt;
&lt;li&gt;The UI is hidden&lt;/li&gt;
&lt;li&gt;The component stays mounted&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;When &lt;code&gt;visible={true}&lt;/code&gt;:

&lt;ul&gt;
&lt;li&gt;The UI reappears instantly&lt;/li&gt;
&lt;li&gt;State is preserved&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧠 How &lt;code&gt;&amp;lt;Activity&amp;gt;&lt;/code&gt; Thinks
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Behavior&lt;/th&gt;
&lt;th&gt;Conditional Rendering&lt;/th&gt;
&lt;th&gt;&lt;code&gt;&amp;lt;Activity&amp;gt;&lt;/code&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Component mounted&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;State preserved&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Effects retained&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UI visible&lt;/td&gt;
&lt;td&gt;Conditional&lt;/td&gt;
&lt;td&gt;Controlled&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🔥 Real-World Use Cases
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1️⃣ Tabbed Interfaces
&lt;/h3&gt;

&lt;p&gt;Switch tabs without losing form input or scroll position.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Activity&lt;/span&gt; &lt;span class="na"&gt;visible&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;activeTab&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="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ProfileForm&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Activity&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  2️⃣ Modals &amp;amp; Drawers
&lt;/h3&gt;

&lt;p&gt;Avoid re-initializing data every time a modal opens.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Activity&lt;/span&gt; &lt;span class="na"&gt;visible&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;isOpen&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;SettingsModal&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Activity&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  3️⃣ Background UI
&lt;/h3&gt;

&lt;p&gt;Keep background widgets alive but invisible.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Activity&lt;/span&gt; &lt;span class="na"&gt;visible&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;LiveSyncService&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Activity&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ⚠️ Things to Keep in Mind
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;Activity&amp;gt;&lt;/code&gt; &lt;strong&gt;does not stop effects&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Background logic &lt;strong&gt;continues running&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Use carefully with:

&lt;ul&gt;
&lt;li&gt;Polling&lt;/li&gt;
&lt;li&gt;Intervals&lt;/li&gt;
&lt;li&gt;Heavy subscriptions&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;If you want effects to pause, you must handle that explicitly.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧩 &lt;code&gt;&amp;lt;Activity&amp;gt;&lt;/code&gt; vs &lt;code&gt;Suspense&lt;/code&gt;
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Suspense&lt;/th&gt;
&lt;th&gt;Activity&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Handles async loading&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Controls visibility&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Preserves state&lt;/td&gt;
&lt;td&gt;⚠️ Partial&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lifecycle remains&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;They solve &lt;strong&gt;different problems&lt;/strong&gt; and work well together.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 Mental Model
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Suspense delays rendering.&lt;br&gt;&lt;br&gt;
Activity hides rendering.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🚀 Why This Matters
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;Activity&amp;gt;&lt;/code&gt; enables:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Faster UI transitions&lt;/li&gt;
&lt;li&gt;Better UX&lt;/li&gt;
&lt;li&gt;Fewer unnecessary remounts&lt;/li&gt;
&lt;li&gt;More control over component lifecycles&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s a small API with &lt;strong&gt;big architectural implications&lt;/strong&gt;.&lt;/p&gt;




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

&lt;p&gt;React 19’s &lt;code&gt;&amp;lt;Activity&amp;gt;&lt;/code&gt; component is a step toward &lt;strong&gt;intentional UI lifecycles&lt;/strong&gt;—where visibility and existence are no longer the same thing.&lt;/p&gt;

&lt;p&gt;If you’ve ever wished for:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Hide this component, but don’t reset it”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;Activity&amp;gt;&lt;/code&gt; is your answer.&lt;/p&gt;




&lt;p&gt;💬 Have thoughts or use cases in mind?&lt;br&gt;&lt;br&gt;
Drop them in the comments—let’s discuss React 19 together.&lt;/p&gt;

</description>
      <category>react</category>
      <category>javascript</category>
      <category>frontend</category>
      <category>react19</category>
    </item>
    <item>
      <title>Rethinking React Architecture at Scale: From Hooks to Remote Contexts With Code base</title>
      <dc:creator>Shanthi's Dev Diary</dc:creator>
      <pubDate>Tue, 06 Jan 2026 19:34:09 +0000</pubDate>
      <link>https://dev.to/shantih_palani/rethinking-react-architecture-at-scale-from-hooks-to-remote-contexts-3a8j</link>
      <guid>https://dev.to/shantih_palani/rethinking-react-architecture-at-scale-from-hooks-to-remote-contexts-3a8j</guid>
      <description>&lt;p&gt;React hooks, the Context API, and Suspense have completely changed how we build modern React applications. For &lt;strong&gt;small to medium-sized apps&lt;/strong&gt;, these tools work exceptionally well.&lt;/p&gt;

&lt;p&gt;But once React applications scale into &lt;strong&gt;micro-frontend architectures&lt;/strong&gt;—with multiple teams, independent deployments, and runtime-loaded bundles—many familiar patterns start to break down.&lt;/p&gt;

&lt;p&gt;This post explores &lt;strong&gt;why React state management becomes difficult at scale&lt;/strong&gt; and introduces &lt;strong&gt;remote contexts&lt;/strong&gt;, an architectural approach for sharing state across distributed React applications.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Reality of Large-Scale React Applications
&lt;/h2&gt;

&lt;p&gt;Modern React systems often consist of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Multiple micro-frontends&lt;/li&gt;
&lt;li&gt;Independent build and deployment pipelines&lt;/li&gt;
&lt;li&gt;Runtime-loaded bundles (Module Federation, dynamic imports)&lt;/li&gt;
&lt;li&gt;Teams owning isolated business domains&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At this point, your frontend is no longer a single application—it’s a &lt;strong&gt;distributed system&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And distributed systems demand different architectural thinking.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why React Context and Hooks Struggle in Micro-Frontends
&lt;/h2&gt;

&lt;h3&gt;
  
  
  React Context Stops at Bundle Boundaries
&lt;/h3&gt;

&lt;p&gt;React Context only works within a single React tree.&lt;br&gt;&lt;br&gt;
When providers and consumers live in different bundles, context simply doesn’t cross that boundary.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prop Drilling Becomes Impossible
&lt;/h3&gt;

&lt;p&gt;When applications are compiled and deployed independently, passing props across boundaries is no longer viable.&lt;/p&gt;

&lt;h3&gt;
  
  
  Global State Becomes Too Global
&lt;/h3&gt;

&lt;p&gt;To compensate, teams often introduce:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Large Redux stores&lt;/li&gt;
&lt;li&gt;Shared event buses&lt;/li&gt;
&lt;li&gt;Singleton services&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These approaches &lt;em&gt;work&lt;/em&gt;, but they introduce new problems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tight coupling between teams&lt;/li&gt;
&lt;li&gt;Hard-to-debug state flows&lt;/li&gt;
&lt;li&gt;Performance bottlenecks&lt;/li&gt;
&lt;li&gt;Fear-driven deployments&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Real Problem Isn’t State—It’s Communication
&lt;/h2&gt;

&lt;p&gt;At scale, the challenge isn’t &lt;em&gt;how to store state&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;It’s &lt;strong&gt;how applications communicate&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Most React state management tools assume:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The same team owns both the state and its consumers.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In micro-frontend architectures:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ownership is distributed&lt;/li&gt;
&lt;li&gt;Consumers are unknown at build time&lt;/li&gt;
&lt;li&gt;Load order is unpredictable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This requires a shift—from &lt;strong&gt;shared state&lt;/strong&gt; to &lt;strong&gt;shared contracts&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Are Remote Contexts?
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;remote context&lt;/strong&gt; extends the idea of React Context beyond a single bundle.&lt;/p&gt;

&lt;p&gt;Key characteristics:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lives outside a single React tree&lt;/li&gt;
&lt;li&gt;Uses a publish/subscribe model&lt;/li&gt;
&lt;li&gt;Supports late subscribers&lt;/li&gt;
&lt;li&gt;Preserves the React hook-based developer experience&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To a React developer, it still &lt;em&gt;feels&lt;/em&gt; like &lt;code&gt;useContext&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Architecturally, it behaves like &lt;strong&gt;distributed state management&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Cross-Bundle Messaging in React Architectures
&lt;/h2&gt;

&lt;p&gt;Remote contexts rely on a lightweight messaging layer to communicate across micro-frontends.&lt;/p&gt;

&lt;p&gt;This layer can be implemented using:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Module Federation shared modules&lt;/li&gt;
&lt;li&gt;&lt;code&gt;BroadcastChannel&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;postMessage&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Custom event transports&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The transport mechanism can change.&lt;br&gt;&lt;br&gt;
The architectural pattern stays the same.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Remote Contexts Work Well with React
&lt;/h2&gt;

&lt;p&gt;React already provides a solution for consuming external state safely:&lt;br&gt;&lt;br&gt;
&lt;code&gt;useSyncExternalStore&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Remote contexts use this API to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Remain concurrent-safe&lt;/li&gt;
&lt;li&gt;Avoid tearing&lt;/li&gt;
&lt;li&gt;Ensure predictable re-renders&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;React stays local.&lt;br&gt;&lt;br&gt;
State communication becomes distributed.&lt;/p&gt;




&lt;h2&gt;
  
  
  Example: Distributed React Dashboards
&lt;/h2&gt;

&lt;p&gt;Consider a dashboard where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One team owns authentication&lt;/li&gt;
&lt;li&gt;Another team owns analytics widgets&lt;/li&gt;
&lt;li&gt;A third team manages feature flags&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each micro-frontend:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deploys independently&lt;/li&gt;
&lt;li&gt;Publishes updates to remote contexts&lt;/li&gt;
&lt;li&gt;Consumes only the data it needs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No shared Redux store.&lt;br&gt;&lt;br&gt;
No direct imports.&lt;br&gt;&lt;br&gt;
No hidden dependencies.&lt;/p&gt;




&lt;h2&gt;
  
  
  Real-World Challenges (and Why They’re Solvable)
&lt;/h2&gt;

&lt;p&gt;Distributed state introduces real concerns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Race conditions&lt;/strong&gt; → solved with snapshot replay&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Type safety&lt;/strong&gt; → enforced through shared TypeScript contracts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Versioning&lt;/strong&gt; → handled with schema evolution&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Debugging&lt;/strong&gt; → improved through observable context flow&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These problems already exist in large systems.&lt;br&gt;&lt;br&gt;
Remote contexts make them &lt;strong&gt;explicit and manageable&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Migrating from Redux and Traditional State Management
&lt;/h2&gt;

&lt;p&gt;Remote contexts are not a replacement for local state or Redux.&lt;/p&gt;

&lt;p&gt;A practical migration strategy looks like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keep local state local&lt;/li&gt;
&lt;li&gt;Expose only cross-application state as remote contexts&lt;/li&gt;
&lt;li&gt;Gradually reduce reliance on shared global stores&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This allows teams to adopt the pattern incrementally—without rewrites.&lt;/p&gt;




&lt;h2&gt;
  
  
  When Should You Use Remote Contexts?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Good fit when:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You have multiple micro-frontends&lt;/li&gt;
&lt;li&gt;Teams deploy independently&lt;/li&gt;
&lt;li&gt;State must be shared across bundles&lt;/li&gt;
&lt;li&gt;Global stores cause performance or coordination issues&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Not needed when:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Building small or single-team applications&lt;/li&gt;
&lt;li&gt;Managing purely local UI state&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Architecture should match scale—not trends.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts: React Architecture Must Evolve with Scale
&lt;/h2&gt;

&lt;p&gt;React itself scales well.&lt;/p&gt;

&lt;p&gt;What doesn’t scale is applying &lt;strong&gt;single-app state management patterns to distributed frontend systems&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Remote contexts allow teams to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Move independently&lt;/li&gt;
&lt;li&gt;Share state intentionally&lt;/li&gt;
&lt;li&gt;Preserve the React developer experience&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As frontend systems grow, &lt;strong&gt;architecture—not libraries—becomes the differentiator&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Working code : &lt;a href="https://github.com/shanthipalani/monorepo-react-microfrontend/tree/remote-context-performant" rel="noopener noreferrer"&gt;https://github.com/shanthipalani/monorepo-react-microfrontend/tree/remote-context-performant&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>microfrontends</category>
      <category>architecture</category>
      <category>statemanagement</category>
    </item>
    <item>
      <title>structuredClone() — The Deep Copy Hero JavaScript Deserved 🦸‍♀️</title>
      <dc:creator>Shanthi's Dev Diary</dc:creator>
      <pubDate>Wed, 31 Dec 2025 14:29:31 +0000</pubDate>
      <link>https://dev.to/shantih_palani/structuredclone-the-deep-copy-hero-javascript-deserved-2add</link>
      <guid>https://dev.to/shantih_palani/structuredclone-the-deep-copy-hero-javascript-deserved-2add</guid>
      <description>&lt;p&gt;Let’s be honest.&lt;br&gt;&lt;br&gt;
Every JavaScript developer has &lt;strong&gt;broken production at least once&lt;/strong&gt; because of &lt;em&gt;copying objects the wrong way&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;You thought you cloned it.&lt;br&gt;&lt;br&gt;
JavaScript smiled.&lt;br&gt;&lt;br&gt;
Then changed the original too.&lt;/p&gt;

&lt;p&gt;Enter &lt;strong&gt;&lt;code&gt;structuredClone()&lt;/code&gt;&lt;/strong&gt; — the native deep-cloning superhero that finally says:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Relax. I got this.”&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  The Problem: “Why did my original object change?! 😭”
&lt;/h2&gt;

&lt;p&gt;Classic situation:&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="kd"&gt;const&lt;/span&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="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="s2"&gt;Shanthi&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;skills&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;JavaScript&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;React&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;copy&lt;/span&gt; &lt;span class="o"&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;copy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;skills&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;TypeScript&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&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;skills&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// ["JavaScript", "React", "TypeScript"] 😱&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You didn’t mean to update the original…&lt;br&gt;&lt;br&gt;
JavaScript just assumed you were feeling adventurous.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Old (Painful) Way 😬
&lt;/h2&gt;

&lt;p&gt;We all tried this at some point:&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="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It looks clever.&lt;br&gt;&lt;br&gt;
It feels clever.&lt;br&gt;&lt;br&gt;
But it betrays you silently.&lt;/p&gt;


&lt;h2&gt;
  
  
  What it breaks:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;❌ &lt;code&gt;Date&lt;/code&gt; becomes a string
&lt;/li&gt;
&lt;li&gt;❌ &lt;code&gt;Map&lt;/code&gt;, &lt;code&gt;Set&lt;/code&gt; vanish into thin air
&lt;/li&gt;
&lt;li&gt;❌ &lt;code&gt;undefined&lt;/code&gt;, &lt;code&gt;NaN&lt;/code&gt;, &lt;code&gt;Infinity&lt;/code&gt; disappear
&lt;/li&gt;
&lt;li&gt;❌ Circular references? App crash 💥
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Basically, it copies your data and &lt;strong&gt;forgets its personality&lt;/strong&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  Meet &lt;code&gt;structuredClone()&lt;/code&gt; 🧠✨
&lt;/h2&gt;

&lt;p&gt;JavaScript finally said:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Okay fine, here’s a proper deep clone.”&lt;br&gt;
&lt;/p&gt;


&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cloned&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;structuredClone&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;original&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That’s it.&lt;br&gt;&lt;br&gt;
No imports.&lt;br&gt;&lt;br&gt;
No libraries.&lt;br&gt;&lt;br&gt;
No emotional damage.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Makes &lt;code&gt;structuredClone&lt;/code&gt; So Cool?
&lt;/h2&gt;

&lt;p&gt;✅ It actually understands JavaScript data.&lt;/p&gt;

&lt;h3&gt;
  
  
  It supports:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Objects &amp;amp; Arrays
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Date&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Map&lt;/code&gt;, &lt;code&gt;Set&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;RegExp&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;BigInt&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;TypedArrays
&lt;/li&gt;
&lt;li&gt;Circular references (&lt;strong&gt;YES 🔥&lt;/strong&gt;)
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Basically, real-world data. Not just JSON-shaped dreams.&lt;/p&gt;




&lt;h2&gt;
  
  
  Example: Deep Clone That Actually Works
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&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="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="s2"&gt;Shanthi&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;meta&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;joined&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;clone&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;structuredClone&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;clone&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;meta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;joined&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setFullYear&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2030&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&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;meta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;joined&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getFullYear&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="c1"&gt;// Still 2024 😌&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No side effects.&lt;br&gt;&lt;br&gt;
No surprises.&lt;br&gt;&lt;br&gt;
No apology messages to your team.&lt;/p&gt;




&lt;h2&gt;
  
  
  Circular References? Bring It On 💪
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;obj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;
&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;self&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;obj&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;cloned&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;structuredClone&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cloned&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;self&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;cloned&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Old methods would:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;❌ Cry
&lt;/li&gt;
&lt;li&gt;❌ Throw errors
&lt;/li&gt;
&lt;li&gt;❌ Give up on life
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;structuredClone&lt;/code&gt; just nods politely and continues.&lt;/p&gt;




&lt;h2&gt;
  
  
  Map &amp;amp; Set — Finally Respected 🫶
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&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="na"&gt;map&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Map&lt;/span&gt;&lt;span class="p"&gt;([[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;a&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]]),&lt;/span&gt;
  &lt;span class="na"&gt;set&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Set&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&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;clone&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;structuredClone&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;clone&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;map&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;b&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&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;map&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;has&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;b&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// false 🎉&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your original data remains &lt;strong&gt;unbothered&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  What It Won’t Clone (And That’s Fair)
&lt;/h2&gt;

&lt;p&gt;Some things simply refuse to be cloned:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;❌ Functions (they have commitment issues)
&lt;/li&gt;
&lt;li&gt;❌ DOM nodes (use &lt;code&gt;cloneNode&lt;/code&gt;)
&lt;/li&gt;
&lt;li&gt;❌ Symbols
&lt;/li&gt;
&lt;li&gt;❌ &lt;code&gt;WeakMap&lt;/code&gt;, &lt;code&gt;WeakSet&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Try cloning these and JavaScript will politely throw a &lt;strong&gt;&lt;code&gt;DataCloneError&lt;/code&gt;&lt;/strong&gt; instead of silently ruining your data.&lt;br&gt;&lt;br&gt;
Honestly? We appreciate the honesty.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;code&gt;structuredClone&lt;/code&gt; vs Spread Operator 🥊
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;original&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;shallow&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;original&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;deep&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;structuredClone&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;original&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;shallow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;original&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 2 ❌&lt;/span&gt;
&lt;span class="nx"&gt;deep&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;original&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// still 2 ✅&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Spread operator:&lt;/strong&gt;  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“I’ll copy the top layer and hope for the best.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;structuredClone&lt;/code&gt;:&lt;/strong&gt;  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“I’ll copy everything. Thoroughly.”&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Performance: Should I Worry?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Faster than &lt;code&gt;JSON.parse(JSON.stringify())&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Optimized by modern JS engines
&lt;/li&gt;
&lt;li&gt;Safe for state cloning and message passing
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;⚠️ Just don’t clone massive objects in tight loops unless you enjoy performance reviews.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where You’ll Actually Use This
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;React state updates (immutability without headaches)
&lt;/li&gt;
&lt;li&gt;Redux / Zustand / any state manager
&lt;/li&gt;
&lt;li&gt;Web Workers
&lt;/li&gt;
&lt;li&gt;Undo / redo features
&lt;/li&gt;
&lt;li&gt;Caching snapshots
&lt;/li&gt;
&lt;li&gt;“Why did this mutate?” bug prevention
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Browser &amp;amp; Runtime Support 🌍
&lt;/h2&gt;

&lt;p&gt;Good news:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Modern browsers ✅
&lt;/li&gt;
&lt;li&gt;Node.js 17+ ✅
&lt;/li&gt;
&lt;li&gt;Deno, Bun ✅
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No polyfills. No drama.&lt;/p&gt;




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

&lt;p&gt;&lt;code&gt;structuredClone()&lt;/code&gt; is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Native
&lt;/li&gt;
&lt;li&gt;✅ Safe
&lt;/li&gt;
&lt;li&gt;✅ Deep
&lt;/li&gt;
&lt;li&gt;✅ Honest about errors
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you’re still using &lt;code&gt;JSON.parse(JSON.stringify())&lt;/code&gt;, it’s okay.&lt;br&gt;&lt;br&gt;
We all grow. 😄&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Modern JavaScript has given us a proper deep clone.&lt;br&gt;&lt;br&gt;
Let’s actually use it.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;💬 &lt;em&gt;Have you been betrayed by shallow copies before?&lt;br&gt;&lt;br&gt;
Share your cloning horror stories in the comments!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>react</category>
      <category>node</category>
    </item>
    <item>
      <title>Shallow Copy vs Deep Copy in JavaScript — Quick and Clear explanation</title>
      <dc:creator>Shanthi's Dev Diary</dc:creator>
      <pubDate>Tue, 09 Dec 2025 21:11:07 +0000</pubDate>
      <link>https://dev.to/shantih_palani/shallow-copy-vs-deep-copy-in-javascript-quick-clear-slightly-funny-4d98</link>
      <guid>https://dev.to/shantih_palani/shallow-copy-vs-deep-copy-in-javascript-quick-clear-slightly-funny-4d98</guid>
      <description>&lt;p&gt;Copying objects in JavaScript looks easy… until the original object changes when you didn’t touch it.&lt;br&gt;&lt;br&gt;
Congratulations — you’ve encountered &lt;em&gt;shallow copy chaos&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Let’s fix that in the simplest, funniest, most precise way possible.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧍‍♂️ What Is a Shallow Copy?
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;shallow copy&lt;/strong&gt; only copies the top-level values.&lt;br&gt;&lt;br&gt;
Nested objects? Arrays?&lt;br&gt;&lt;br&gt;
JavaScript just hands you the same reference like a lazy coworker.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&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="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="s2"&gt;Shanthi&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;address&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;city&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Chennai&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;copy&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;user&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="nx"&gt;copy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;city&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Coimbatore&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&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;address&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;city&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; 
&lt;span class="c1"&gt;// "Coimbatore" — betrayal detected 💔&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Why?
&lt;/h3&gt;

&lt;p&gt;Because only the top-level value (&lt;code&gt;name&lt;/code&gt;) was cloned.&lt;br&gt;&lt;br&gt;
The nested object (&lt;code&gt;address&lt;/code&gt;) was &lt;strong&gt;shared&lt;/strong&gt;, so modifying it changes the original.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 What Is a Deep Copy?
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;deep copy&lt;/strong&gt; clones &lt;em&gt;every level&lt;/em&gt; of the object.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No shared references
&lt;/li&gt;
&lt;li&gt;No accidental mutations
&lt;/li&gt;
&lt;li&gt;No “WHY DID THIS CHANGE??” debugging nightmares
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Example
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&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="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="s2"&gt;Shanthi&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;address&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;city&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Chennai&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;deep&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;structuredClone&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;deep&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;city&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Coimbatore&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&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;address&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;city&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// "Chennai" — original untouched ✨&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🛠 Copying Methods
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🔹 Shallow Copy Methods
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;{ ...obj }&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Object.assign({}, obj)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;array.slice()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Array.from()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;⚠️ &lt;strong&gt;Note:&lt;/strong&gt; All shallow copy methods copy nested objects &lt;strong&gt;by reference&lt;/strong&gt;, not by value.&lt;/p&gt;




&lt;h3&gt;
  
  
  🔹 Deep Copy Methods
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;structuredClone(obj)&lt;/code&gt; ← &lt;strong&gt;Best + modern&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Custom recursive deep clone&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;JSON.parse(JSON.stringify(obj))&lt;/code&gt;
⚠️ &lt;strong&gt;Breaks for:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Date&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Functions&lt;/li&gt;
&lt;li&gt;&lt;code&gt;undefined&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RegExp&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Circular references&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;h2&gt;
  
  
  🎯 When Should You Use Which?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ✔️ Use &lt;strong&gt;Shallow Copy&lt;/strong&gt; when:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Only top-level values change
&lt;/li&gt;
&lt;li&gt;The object is simple
&lt;/li&gt;
&lt;li&gt;You just need a quick non-nested clone&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ✔️ Use &lt;strong&gt;Deep Copy&lt;/strong&gt; when:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Your data is nested
&lt;/li&gt;
&lt;li&gt;You need immutability (React, Redux, etc.)
&lt;/li&gt;
&lt;li&gt;You want predictable, safe updates&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧘 TL;DR Table
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Shallow Copy&lt;/th&gt;
&lt;th&gt;Deep Copy&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Copies nested values&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Safe for complex data&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Surprise bugs&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best method&lt;/td&gt;
&lt;td&gt;Spread / &lt;code&gt;Object.assign&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;code&gt;structuredClone()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  🏁 Summary
&lt;/h2&gt;

&lt;p&gt;Shallow and deep copying may sound similar, but they behave completely differently in JavaScript.&lt;br&gt;&lt;br&gt;
A &lt;strong&gt;shallow copy&lt;/strong&gt; only duplicates the first level, leaving nested objects &lt;em&gt;linked&lt;/em&gt; and ready to cause sneaky bugs.&lt;br&gt;&lt;br&gt;
A &lt;strong&gt;deep copy&lt;/strong&gt;, however, clones every level, giving you safe, predictable, mutation-free data — especially important in React, Redux, and any place where immutability matters.&lt;/p&gt;

&lt;p&gt;When in doubt:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;strong&gt;shallow copy&lt;/strong&gt; for simple, flat objects.
&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;deep copy&lt;/strong&gt; for anything nested or important.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your future debugging sessions will thank you. 🚀&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>web</category>
      <category>react</category>
    </item>
    <item>
      <title>🚀 Client-Side vs Server-Side CORS: Understanding the Real Difference</title>
      <dc:creator>Shanthi's Dev Diary</dc:creator>
      <pubDate>Thu, 04 Dec 2025 20:49:34 +0000</pubDate>
      <link>https://dev.to/shantih_palani/client-side-vs-server-side-cors-understanding-the-real-difference-52l9</link>
      <guid>https://dev.to/shantih_palani/client-side-vs-server-side-cors-understanding-the-real-difference-52l9</guid>
      <description>&lt;p&gt;If you’ve ever screamed at your monitor because of a &lt;em&gt;mysterious&lt;/em&gt; CORS error…&lt;br&gt;&lt;br&gt;
Congratulations — you are officially a web developer. 🎉&lt;/p&gt;

&lt;p&gt;CORS is like that strict bouncer outside the club who won’t let you in even though you &lt;em&gt;swear&lt;/em&gt; you're on the list.&lt;/p&gt;

&lt;p&gt;This blog will finally explain the difference between &lt;strong&gt;Client-Side CORS and Server-Side CORS&lt;/strong&gt;, without making your brain melt like a broken build.&lt;/p&gt;


&lt;h2&gt;
  
  
  🧐 What Is CORS, Really?
&lt;/h2&gt;

&lt;p&gt;CORS stands for &lt;strong&gt;Cross-Origin Resource Sharing&lt;/strong&gt; — which sounds fancy, but really means:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Hey browser, can this website talk to that other website? Or is it a stranger danger situation?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The browser is extremely paranoid.&lt;br&gt;&lt;br&gt;
If &lt;strong&gt;domain A&lt;/strong&gt; calls &lt;strong&gt;domain B&lt;/strong&gt;, the browser goes:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Hold up. Who sent you? Show me your passport, Aadhar card, PAN card, and two 2x2 photos.”&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  🤓 Client-Side vs Server-Side CORS: The Plot Twist
&lt;/h2&gt;

&lt;p&gt;People keep saying &lt;em&gt;“client-side CORS”&lt;/em&gt; and &lt;em&gt;“server-side CORS,”&lt;/em&gt; but here’s the truth:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Only the server decides CORS. The client is just a confused teenager asking for permission.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Still, both sides play a role — so let’s decode them.&lt;/p&gt;


&lt;h2&gt;
  
  
  🔵 Client-Side CORS (AKA: The Illusion of Control)
&lt;/h2&gt;

&lt;p&gt;Developers be like:&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="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/api&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="na"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cors&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And expect the browser to go:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Yes sir! CORS enabled! You’re a genius!”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But no.&lt;br&gt;&lt;br&gt;
The browser basically says:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Cute. But I enforce the rules. Sit down.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Client-side "CORS" is really about &lt;strong&gt;&lt;em&gt;how you send the request&lt;/em&gt;&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;mode: "cors"&lt;/code&gt; → “Please let me in!”
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;mode: "no-cors"&lt;/code&gt; → “Fine, I’ll leave. I didn’t want to see the response anyway.”
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;credentials: "include"&lt;/code&gt; → “Here are my cookies, please don’t judge.”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;⚠️ &lt;strong&gt;But the client CANNOT actually enable CORS.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It’s like trying to unlock a door by telling the door politely.&lt;br&gt;&lt;br&gt;
The server still holds the key.&lt;/p&gt;


&lt;h2&gt;
  
  
  🟣 Server-Side CORS (The Real Boss Here)
&lt;/h2&gt;

&lt;p&gt;This is where the &lt;em&gt;actual magic&lt;/em&gt; happens.&lt;/p&gt;

&lt;p&gt;If the server doesn’t approve your origin…&lt;br&gt;&lt;br&gt;
The browser will block you faster than a bad ex.&lt;/p&gt;

&lt;p&gt;Servers respond with headers like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;Access-Control-Allow-Origin: https://myapp.com
Access-Control-Allow-Methods: GET, POST, DELETE
Access-Control-Allow-Headers: Content-Type, Authorization
Access-Control-Allow-Credentials: true
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Only then does the browser say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Okay, fine. I guess you're allowed in.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Example (Express.js)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;cors&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;origin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://myapp.com&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;credentials&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="p"&gt;}));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Example (Next.js API Route)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setHeader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Access-Control-Allow-Origin&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://myapp.com&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setHeader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Access-Control-Allow-Credentials&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;true&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you forget even &lt;em&gt;one&lt;/em&gt; header?&lt;/p&gt;

&lt;p&gt;Boom.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;CORS error.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Your day is ruined. Your coffee goes cold. Your teammates hear a scream.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧪 Simple vs Preflight Requests (AKA: Browser Drama)
&lt;/h2&gt;

&lt;p&gt;The browser sends:&lt;/p&gt;

&lt;h3&gt;
  
  
  👉 Simple requests
&lt;/h3&gt;

&lt;p&gt;These are chill. The browser is like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“GET or POST with simple headers? Fine, go ahead.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  👉 Preflight requests
&lt;/h3&gt;

&lt;p&gt;These are drama.&lt;/p&gt;

&lt;p&gt;If you use:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;PUT&lt;/code&gt;, &lt;code&gt;PATCH&lt;/code&gt;, &lt;code&gt;DELETE&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Custom headers
&lt;/li&gt;
&lt;li&gt;JSON body
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The browser becomes your mom:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Wait. Before you go, WHERE are you going? Who’s going with you? When will you come back???”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It sends an &lt;strong&gt;OPTIONS&lt;/strong&gt; request first.&lt;br&gt;&lt;br&gt;
If the server doesn’t respond correctly?&lt;br&gt;&lt;br&gt;
Blocked. Again.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 Summary Table for Geniuses Who Scrolled Too Fast
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Thing&lt;/th&gt;
&lt;th&gt;Client Side&lt;/th&gt;
&lt;th&gt;Server Side&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Who’s in control?&lt;/td&gt;
&lt;td&gt;Lol. Not you.&lt;/td&gt;
&lt;td&gt;The real boss.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Can it allow a request?&lt;/td&gt;
&lt;td&gt;❌ Nope&lt;/td&gt;
&lt;td&gt;✅ Absolutely&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Can it trigger preflight?&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;⚠️ Must respond properly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Is it real CORS?&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;td&gt;✅ Yes, 100% legit&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




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

&lt;p&gt;CORS errors might feel like a personal attack from the universe, but the rule is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Client requests. Server approves. Browser judges.&lt;br&gt;&lt;br&gt;
Just like real life.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If everyone plays their part correctly, CORS becomes easy.&lt;br&gt;&lt;br&gt;
If not… well, enjoy the next 3 hours of debugging. 😅&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>cors</category>
      <category>javascript</category>
      <category>node</category>
    </item>
    <item>
      <title>React.memo vs useMemo</title>
      <dc:creator>Shanthi's Dev Diary</dc:creator>
      <pubDate>Sun, 23 Nov 2025 14:33:38 +0000</pubDate>
      <link>https://dev.to/shantih_palani/reactmemo-vs-usememo-3h3k</link>
      <guid>https://dev.to/shantih_palani/reactmemo-vs-usememo-3h3k</guid>
      <description>&lt;h1&gt;
  
  
  React.memo vs useMemo — Explained
&lt;/h1&gt;

&lt;p&gt;If you've ever stared at your React component tree wondering &lt;em&gt;"Why are you re-rendering? I didn’t even touch you!"&lt;/em&gt; — congratulations, you're officially a React developer.&lt;/p&gt;

&lt;p&gt;With React 19 rolling into town like a cool new intern, many devs still ask: &lt;strong&gt;“Do React.memo and useMemo still matter?”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Short answer: &lt;strong&gt;YES.&lt;/strong&gt; Long answer: You’re about to read it.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 The Real Difference
&lt;/h2&gt;

&lt;p&gt;Let’s clear the confusion once and for all:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;🔹 React.memo — The Component Bodyguard&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;React.memo wraps a &lt;strong&gt;component&lt;/strong&gt;, preventing it from re-rendering unless its props change.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Think of React.memo as&lt;/strong&gt;:&lt;br&gt;
A bouncer at the club door checking props IDs.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Greeting&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;memo&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;Greeting&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;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Rendered!&lt;/span&gt;&lt;span class="dl"&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;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Hello &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If &lt;code&gt;name&lt;/code&gt; doesn’t change → &lt;strong&gt;No re-render.&lt;/strong&gt;&lt;br&gt;
If &lt;code&gt;name&lt;/code&gt; changes → &lt;strong&gt;VIP access.&lt;/strong&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  &lt;strong&gt;🔹 useMemo — The Expensive Calculator&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;useMemo memoizes a &lt;strong&gt;value&lt;/strong&gt;, usually something expensive to compute.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Think of useMemo as&lt;/strong&gt;:&lt;br&gt;
A lazy accountant who refuses to redo work unless absolutely necessary.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;total&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useMemo&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;expensiveCalculation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If &lt;code&gt;items&lt;/code&gt; doesn’t change → useMemo says: &lt;em&gt;"Bro, I already did this."&lt;/em&gt;&lt;br&gt;
If it does → reluctantly recomputes.&lt;/p&gt;




&lt;h2&gt;
  
  
  🥊 React.memo vs useMemo — Head-to-Head
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;React.memo&lt;/th&gt;
&lt;th&gt;useMemo&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Purpose&lt;/td&gt;
&lt;td&gt;Prevent component re-render&lt;/td&gt;
&lt;td&gt;Cache expensive calculations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Works on&lt;/td&gt;
&lt;td&gt;Components&lt;/td&gt;
&lt;td&gt;Values (numbers, objects, arrays, results)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Checks dependencies&lt;/td&gt;
&lt;td&gt;Props&lt;/td&gt;
&lt;td&gt;Dependency array&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best for&lt;/td&gt;
&lt;td&gt;Heavy UI components&lt;/td&gt;
&lt;td&gt;Heavy computations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Worst use case&lt;/td&gt;
&lt;td&gt;Wrapping everything blindly&lt;/td&gt;
&lt;td&gt;Memoizing cheap functions&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🧩 When to Use What?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ✔ Use &lt;strong&gt;React.memo&lt;/strong&gt; if:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Component is heavy to re-render.&lt;/li&gt;
&lt;li&gt;Renders the same UI if props don’t change.&lt;/li&gt;
&lt;li&gt;Parent re-renders too often.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Don't use&lt;/strong&gt; React.memo if the props are always changing anyway (it does nothing then).&lt;/p&gt;

&lt;h3&gt;
  
  
  ✔ Use &lt;strong&gt;useMemo&lt;/strong&gt; if:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You’re running expensive logic inside render.&lt;/li&gt;
&lt;li&gt;You pass stable memoized values to child components.&lt;/li&gt;
&lt;li&gt;You want to avoid useless recalculations.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Don't use&lt;/strong&gt; useMemo for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cheap calculations.&lt;/li&gt;
&lt;li&gt;Every single variable (&lt;em&gt;this is not TypeScript, calm down&lt;/em&gt;).&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🎨 Diagram Time!
&lt;/h2&gt;

&lt;h3&gt;
  
  
  "What they actually do"
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;React.memo                     useMemo
--------------                --------------
Component? Stop here.         Value? Store here.
Props same? Skip render.      Dependencies same? Skip computing.
Props changed? Render!        Changed? Recompute!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If React.memo were a person → &lt;strong&gt;security guard&lt;/strong&gt;&lt;br&gt;
If useMemo were a person → &lt;strong&gt;lazy mathematician&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🧪 Real-Life Example (The Comedy Version)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&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="nx"&gt;items&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// useMemo: "Don't make me calculate again!"&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;total&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useMemo&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;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Computing total...&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&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;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;items&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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ExpensiveUI&lt;/span&gt; &lt;span class="na"&gt;total&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;total&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// React.memo: "You're not getting in unless your props change!"&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ExpensiveUI&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;memo&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;ExpensiveUI&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;total&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Rendering ExpensiveUI&lt;/span&gt;&lt;span class="dl"&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;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Total: &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;total&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this drama:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;useMemo&lt;/strong&gt; prevents recalculations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;React.memo&lt;/strong&gt; prevents component re-renders.&lt;/li&gt;
&lt;li&gt;Your CPU lives to fight another day.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🚀 So… Are They Still Useful in React 19?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;YES.&lt;/strong&gt;&lt;br&gt;
Even with improved React internals, concurrent features, and better scheduling —&lt;br&gt;
&lt;code&gt;React.memo&lt;/code&gt; and &lt;code&gt;useMemo&lt;/code&gt; remain &lt;strong&gt;performance best friends&lt;/strong&gt;, especially in large apps.&lt;/p&gt;

&lt;p&gt;React 19 doesn’t remove them.&lt;br&gt;
It doesn’t deprecate them.&lt;br&gt;
It doesn’t roast them on stage.&lt;/p&gt;

&lt;p&gt;They're still very much alive and helpful — when used wisely.&lt;/p&gt;




&lt;h2&gt;
  
  
  😂 The Funniest Explanation
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;React.memo:&lt;/strong&gt; “Bro, don’t re-render unless something ACTUALLY changed.”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;useMemo:&lt;/strong&gt; “Bro, stop calculating that again. I saved the answer already.”&lt;/p&gt;




&lt;h2&gt;
  
  
  🧁 Final Thoughts (Sweet &amp;amp; Short)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;React.memo&lt;/strong&gt; = Avoid useless re-renders.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;useMemo&lt;/strong&gt; = Avoid useless re-calculations.&lt;/li&gt;
&lt;li&gt;Don’t overuse them.&lt;/li&gt;
&lt;li&gt;Don’t underuse them.
Use them like salt: Just enough, or everything becomes weird.&lt;/li&gt;
&lt;/ul&gt;




</description>
      <category>react</category>
      <category>reactmemo</category>
      <category>react19</category>
    </item>
    <item>
      <title>Is React.memo Still Useful in React 19? A Practical Guide for 2025</title>
      <dc:creator>Shanthi's Dev Diary</dc:creator>
      <pubDate>Sun, 23 Nov 2025 14:18:06 +0000</pubDate>
      <link>https://dev.to/shantih_palani/is-reactmemo-still-useful-in-react-19-a-practical-guide-for-2025-4lj5</link>
      <guid>https://dev.to/shantih_palani/is-reactmemo-still-useful-in-react-19-a-practical-guide-for-2025-4lj5</guid>
      <description>&lt;p&gt;React 19 introduced several internal improvements, async rendering refinements, and smarter rendering heuristics. Because of this, many developers began asking a familiar question again:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;“Do we still need React.memo in React 19?”&lt;br&gt;
Short answer: Yes — but use it deliberately.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Let’s break this down in a simple, practical way.&lt;/p&gt;
&lt;h2&gt;
  
  
  ⭐ &lt;strong&gt;What React.memo Does (Quick Refresher)&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;React.memo is a higher-order component that prevents unnecessary re-renders when the component’s props haven’t changed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const UserCard = React.memo(function UserCard({ user }) {
  return &amp;lt;div&amp;gt;{user.name}&amp;lt;/div&amp;gt;
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When used correctly, this can reduce wasted renders and improve performance in large lists, dashboards, or heavy UI sections.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚡ &lt;strong&gt;What Changed in React 19?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;React 19 brought several rendering optimizations:&lt;/p&gt;

&lt;p&gt;✔ &lt;strong&gt;Smarter scheduling&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;React handles background rendering better and avoids blocking work.&lt;/p&gt;

&lt;p&gt;✔ &lt;strong&gt;More efficient reconciliation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Some internal improvements reduce excessive re-renders that used to happen in older versions.&lt;/p&gt;

&lt;p&gt;✔ &lt;strong&gt;Fewer unnecessary re-renders by default&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;React is better at skipping updates when values obviously haven't changed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BUT:&lt;/strong&gt;&lt;br&gt;
React still &lt;strong&gt;does not&lt;/strong&gt; do deep prop comparisons.&lt;/p&gt;

&lt;p&gt;React still &lt;strong&gt;cannot know if a child component is expensive&lt;/strong&gt; to render.&lt;/p&gt;

&lt;p&gt;React still &lt;strong&gt;re-renders on parent render&lt;/strong&gt; unless you prevent it.&lt;/p&gt;

&lt;p&gt;Meaning: &lt;strong&gt;The fundamental reason for using &lt;code&gt;React.memo&lt;/code&gt; still exists&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🎯 So… Is &lt;code&gt;React.memo&lt;/code&gt; Still Recommended in 2025?&lt;/strong&gt;&lt;br&gt;
Absolutely YES — but with intention.&lt;/p&gt;


&lt;h2&gt;
  
  
  ✔ &lt;strong&gt;When You SHOULD Use &lt;code&gt;React.memo&lt;/code&gt;&lt;/strong&gt;
&lt;/h2&gt;

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

&lt;p&gt;&lt;strong&gt;1️⃣ Components receive stable props&lt;/strong&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Large list items (UserRow, ProductCard)&lt;/li&gt;
&lt;li&gt;Table rows&lt;/li&gt;
&lt;li&gt;Reusable UI blocks with minimal prop changes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2️⃣ The component is expensive&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Heavy computation&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Large DOM&lt;/li&gt;
&lt;li&gt;Complex markup&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3️⃣ The component appears in a list&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;React lists are the biggest beneficiaries of &lt;code&gt;React.memo&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4️⃣ Parent component re-renders frequently&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If the parent updates often, memoizing the child prevents ripple renders.&lt;/p&gt;


&lt;h2&gt;
  
  
  ❌ When NOT to Use &lt;code&gt;React.memo&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Skip it when:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1️⃣ Component is cheap and simple&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Small button components, labels, icons, etc.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2️⃣ Props change almost every render&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If the component always needs to render, memo brings no benefit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3️⃣ You’re passing non-memoized objects every time&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;code&gt;&amp;lt;Component data={{ a: 1 }} /&amp;gt;  // new object each render → memo useless&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;You'll need useMemo or stable references for React.memo to work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4️⃣ Premature optimization&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Don’t wrap every component by default — it adds a comparison cost.&lt;/p&gt;


&lt;h2&gt;
  
  
  📌 What About Server Components (RSC)?
&lt;/h2&gt;

&lt;p&gt;Many developers wondered if &lt;code&gt;React.memo&lt;/code&gt; becomes irrelevant because of server-driven rendering.&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;No *&lt;/em&gt;— because &lt;code&gt;React.memo&lt;/code&gt; is for client components.&lt;/p&gt;

&lt;p&gt;React Server Components don’t re-render in the browser.&lt;br&gt;
Client Components do, and that’s where &lt;code&gt;React.memo&lt;/code&gt; still matters.&lt;/p&gt;


&lt;h2&gt;
  
  
  ✔ Real-World Example (React 19)
&lt;/h2&gt;

&lt;p&gt;Without memo:&lt;/p&gt;

&lt;p&gt;Every time the parent renders, all items re-render.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
function UserList({ users }) {
  return users.map(u =&amp;gt; &amp;lt;UserItem key={u.id} user={u} /&amp;gt;);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With memo:&lt;/p&gt;

&lt;p&gt;Each item re-renders only when its own props change.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const UserItem = React.memo(function UserItem({ user }) {
  return &amp;lt;div&amp;gt;{user.name}&amp;lt;/div&amp;gt;;
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In large lists:&lt;br&gt;
&lt;strong&gt;Before React 19 → critical&lt;br&gt;
After React 19 → still critical&lt;/strong&gt;&lt;/p&gt;




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

&lt;p&gt;&lt;code&gt;React.memo&lt;/code&gt; is STILL useful in React 19 — very much so.&lt;/p&gt;

&lt;p&gt;React’s new optimizations don't eliminate the need to prevent unnecessary re-renders. They simply make React faster by default. But:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React doesn’t magically skip renders.&lt;/li&gt;
&lt;li&gt;React doesn’t compare deep props.&lt;/li&gt;
&lt;li&gt;React doesn’t know your component’s render cost.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So you still need &lt;code&gt;React.memo&lt;/code&gt; when you want to explicitly optimize.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;📝 Conclusion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;React 19 improves rendering, but it doesn’t replace what &lt;code&gt;React.memo&lt;/code&gt; offers. &lt;code&gt;React.memo&lt;/code&gt; remains a powerful performance optimization tool — especially for lists, expensive components, and frequently re-rendered UIs. Use it intentionally, not everywhere, and it will continue to provide real performance wins in modern React applications.&lt;/p&gt;




&lt;p&gt;Read about &lt;strong&gt;React.memo vs useMemo&lt;/strong&gt; in this &lt;a href="https://dev.to/shantih_palani/reactmemo-vs-usememo-3h3k"&gt;blog &lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>performance</category>
      <category>react</category>
    </item>
    <item>
      <title>🛠️ Migrating from JavaScript to TypeScript: Strategies and Gotchas</title>
      <dc:creator>Shanthi's Dev Diary</dc:creator>
      <pubDate>Thu, 31 Jul 2025 06:42:45 +0000</pubDate>
      <link>https://dev.to/shantih_palani/migrating-from-javascript-to-typescript-strategies-and-gotchas-4e68</link>
      <guid>https://dev.to/shantih_palani/migrating-from-javascript-to-typescript-strategies-and-gotchas-4e68</guid>
      <description>&lt;p&gt;If you're thinking about migrating your JavaScript codebase to TypeScript, you're not alone — and you're definitely on the right track. TypeScript offers type safety, better tooling, and a more confident developer experience. But a migration isn't just a simple "rename-all-the-files" process. It's a journey — and like any journey, it’s smoother with a map. 🗺️&lt;/p&gt;

&lt;p&gt;In this post, I'll walk you through a practical migration strategy and highlight some common gotchas to avoid.&lt;/p&gt;

&lt;p&gt;✅ Why Migrate to TypeScript?&lt;/p&gt;

&lt;p&gt;🔍 Catch errors before they happen (at compile time)&lt;/p&gt;

&lt;p&gt;✨ Enjoy better IntelliSense and code navigation&lt;/p&gt;

&lt;p&gt;🛡️ Refactor with confidence&lt;/p&gt;

&lt;p&gt;📚 Your types are your documentation&lt;/p&gt;

&lt;p&gt;Let’s make your codebase future-proof.&lt;/p&gt;

&lt;h2&gt;
  
  
  🔄 Migration Strategies
&lt;/h2&gt;

&lt;h2&gt;
  
  
  1. Start with the TypeScript Compiler
&lt;/h2&gt;

&lt;p&gt;Install TypeScript and initialize the project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install --save-dev typescript
npx tsc --init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This creates a &lt;code&gt;tsconfig.json&lt;/code&gt; file — the heart of your TS setup.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Enable JavaScript Compatibility
&lt;/h2&gt;

&lt;p&gt;You can type-check your existing &lt;code&gt;.js&lt;/code&gt; files without converting them yet:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// tsconfig.json
{
  "compilerOptions": {
    "allowJs": true,
    "checkJs": true,
    "outDir": "dist"
  },
  "include": ["src"]
}

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. Rename Files Gradually
&lt;/h2&gt;

&lt;p&gt;Start renaming &lt;code&gt;.js&lt;/code&gt; → &lt;code&gt;.ts&lt;/code&gt; (or &lt;code&gt;.jsx&lt;/code&gt; → &lt;code&gt;.tsx&lt;/code&gt;) one file at a time.&lt;/p&gt;

&lt;p&gt;Start with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Utility functions&lt;/li&gt;
&lt;li&gt;Isolated modules&lt;/li&gt;
&lt;li&gt;Non-UI logic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Avoid renaming everything at once — it’s easier to debug issues incrementally.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Add Type Annotations Where Needed
&lt;/h2&gt;

&lt;p&gt;Start small. Focus on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Function arguments and return types&lt;/li&gt;
&lt;li&gt;Object shapes using interfaces or type aliases&lt;/li&gt;
&lt;li&gt;Constants and enums
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;type User = { name: string };

function greet(user: User): string {
  return `Hello, ${user.name}`;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  5. Leverage JSDoc in &lt;code&gt;.js&lt;/code&gt; Files
&lt;/h2&gt;

&lt;p&gt;Want TS support without converting a file yet? Add JSDoc:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/**
 * @param {string} name
 * @returns {string}
 */
function greet(name) {
  return `Hello, ${name}`;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is a great way to introduce typing without renaming.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Use &lt;code&gt;any&lt;/code&gt; and &lt;code&gt;@ts-ignore&lt;/code&gt; Sparingly
&lt;/h2&gt;

&lt;p&gt;Yes, they can unblock you. But track them down and clean them up later.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// @ts-ignore
someLegacyCode();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  7. Tighten the Compiler Gradually
&lt;/h2&gt;

&lt;p&gt;Once you're confident, turn on stricter settings in &lt;code&gt;tsconfig.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"strict": true,
"noImplicitAny": true,
"strictNullChecks": true
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Enable them one at a time to avoid overwhelming yourself.&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚠️ Gotchas to Watch For
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;🧩 Dynamic Code Is Hard to Type&lt;/strong&gt;&lt;br&gt;
Things like &lt;code&gt;eval&lt;/code&gt;, &lt;code&gt;Object.assign&lt;/code&gt;, or deeply dynamic object keys are hard to infer. Consider refactoring those.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;📦 Missing Types for Libraries&lt;/strong&gt;&lt;br&gt;
Use DefinitelyTyped when needed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install --save-dev @types/lodash

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

&lt;/div&gt;



&lt;p&gt;If no types exist, you can write your own &lt;code&gt;*.d.ts&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔀 Implicit &lt;code&gt;any&lt;/code&gt; Types&lt;/strong&gt;&lt;br&gt;
You’ll hit this a lot if noImplicitAny is enabled:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function log(message) {
  console.log(message);
}
//       ~~~~~~~~ Error: Implicit any

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

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;⚛️ JSX Requires &lt;code&gt;.tsx&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
Using React? Any file that includes JSX must use the &lt;code&gt;.tsx&lt;/code&gt; extension.&lt;/p&gt;

&lt;p&gt;Also, don’t forget to type your props:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;type ButtonProps = {
  label: string;
};

function Button({ label }: ButtonProps) {
  return &amp;lt;button&amp;gt;{label}&amp;lt;/button&amp;gt;;
}

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

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;🧪 Update Your Build + Test Tools&lt;/strong&gt;&lt;br&gt;
Make sure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Webpack or Vite is configured to handle &lt;code&gt;.ts&lt;/code&gt; files&lt;/li&gt;
&lt;li&gt;Babel has &lt;code&gt;@babel/preset-typescript&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Jest uses &lt;code&gt;ts-jest&lt;/code&gt; or &lt;code&gt;babel-jest&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;🧭 Your Migration Roadmap&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Phase&lt;/th&gt;
&lt;th&gt;What to Do&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🧪 Enable Type Checking&lt;/td&gt;
&lt;td&gt;Use &lt;code&gt;allowJs&lt;/code&gt; + &lt;code&gt;checkJs&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔀 Rename Incrementally&lt;/td&gt;
&lt;td&gt;Convert &lt;code&gt;.js&lt;/code&gt; → &lt;code&gt;.ts&lt;/code&gt; in small batches&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;✍️ Add Types Slowly&lt;/td&gt;
&lt;td&gt;Start with functions, constants, object shapes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;⚙️ Configure Tools&lt;/td&gt;
&lt;td&gt;Update build/test tooling&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🧼 Clean Up&lt;/td&gt;
&lt;td&gt;Remove &lt;code&gt;any&lt;/code&gt;, &lt;code&gt;@ts-ignore&lt;/code&gt;, etc.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;✨ Final Thoughts&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Migrating to TypeScript doesn’t have to be overwhelming. It’s not an all-or-nothing decision. Use a gradual, iterative approach — and before you know it, you'll have a fully typed, safer, and more enjoyable codebase.&lt;/p&gt;

&lt;p&gt;Your future self (and your team) will thank you. 🙌&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Thanks for reading! Have you tried migrating a JS project to TypeScript? Share your story or tips in the comments below.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>javascript</category>
      <category>ts</category>
      <category>migration</category>
    </item>
  </channel>
</rss>
