<?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: Devesh rajawat</title>
    <description>The latest articles on DEV Community by Devesh rajawat (@devesh_rajawat_485b22b333).</description>
    <link>https://dev.to/devesh_rajawat_485b22b333</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2637175%2Ff813798f-b575-4b1e-aa7c-1b797daa22d8.png</url>
      <title>DEV Community: Devesh rajawat</title>
      <link>https://dev.to/devesh_rajawat_485b22b333</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/devesh_rajawat_485b22b333"/>
    <language>en</language>
    <item>
      <title>🚀 The Hidden Power of BroadcastChannel API: Real-time Cross-Tab Communication</title>
      <dc:creator>Devesh rajawat</dc:creator>
      <pubDate>Fri, 31 Jan 2025 19:13:15 +0000</pubDate>
      <link>https://dev.to/devesh_rajawat_485b22b333/the-hidden-power-of-broadcastchannel-api-real-time-cross-tab-communication-59pg</link>
      <guid>https://dev.to/devesh_rajawat_485b22b333/the-hidden-power-of-broadcastchannel-api-real-time-cross-tab-communication-59pg</guid>
      <description>&lt;h2&gt;
  
  
  Introduction 🎙️
&lt;/h2&gt;

&lt;p&gt;Imagine you’re working on a &lt;strong&gt;web app that users often open in multiple tabs&lt;/strong&gt;. They make a change in one tab, but—oh no!—the other tabs don’t reflect it. You tell them, &lt;em&gt;"Just refresh!"&lt;/em&gt;, but let’s be real: that’s a terrible user experience. 😬&lt;/p&gt;

&lt;p&gt;This is where &lt;strong&gt;BroadcastChannel API&lt;/strong&gt; swoops in like a superhero. 🦸‍♂️ It allows different browser tabs (or iframes) of the same origin to communicate &lt;strong&gt;in real-time&lt;/strong&gt;, without needing a backend, WebSockets, or other complex solutions.&lt;/p&gt;

&lt;p&gt;In this article, we’ll dive deep into:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How &lt;strong&gt;BroadcastChannel API&lt;/strong&gt; works 🛠️&lt;/li&gt;
&lt;li&gt;Real-world &lt;strong&gt;use cases&lt;/strong&gt; 🌍&lt;/li&gt;
&lt;li&gt;Fun &lt;strong&gt;code examples&lt;/strong&gt; 💻&lt;/li&gt;
&lt;li&gt;Edge cases and best practices ✅&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By the end, you’ll be able to &lt;strong&gt;sync data instantly across multiple tabs&lt;/strong&gt; like a pro! 🚀&lt;/p&gt;




&lt;h2&gt;
  
  
  🌍 Why Do We Need BroadcastChannel API?
&lt;/h2&gt;

&lt;p&gt;Let’s look at the &lt;strong&gt;traditional ways of sharing data between tabs&lt;/strong&gt; and their limitations:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;localStorage Events 📦&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;You can listen to &lt;code&gt;storage&lt;/code&gt; events when another tab modifies &lt;code&gt;localStorage&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;❌ But it &lt;strong&gt;only fires in other tabs&lt;/strong&gt;, not the one making the change.&lt;/li&gt;
&lt;li&gt;❌ It’s &lt;strong&gt;not reliable for real-time updates&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;WebSockets 🔌&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;WebSockets allow bidirectional real-time communication.&lt;/li&gt;
&lt;li&gt;❌ Requires a &lt;strong&gt;server&lt;/strong&gt; (adds complexity and cost).&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;IndexedDB (With Polling) 🏪&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Some apps store shared state in IndexedDB and &lt;strong&gt;poll&lt;/strong&gt; for updates.&lt;/li&gt;
&lt;li&gt;❌ Polling is inefficient and wastes CPU resources. 🚨&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 &lt;strong&gt;BroadcastChannel API fixes these problems&lt;/strong&gt; by providing a &lt;strong&gt;simple, native way to send messages between browser contexts in real-time&lt;/strong&gt;. Let’s see it in action! 🎯&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 How BroadcastChannel API Works
&lt;/h2&gt;

&lt;p&gt;Using &lt;strong&gt;BroadcastChannel API&lt;/strong&gt; is as simple as:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Creating a channel&lt;/strong&gt; 🔊&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Posting a message&lt;/strong&gt; 📩&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Listening for messages&lt;/strong&gt; 👂&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;1️⃣ Create a Broadcast Channel&lt;/strong&gt;
&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;channel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;BroadcastChannel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;my-channel&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;h3&gt;
  
  
  &lt;strong&gt;2️⃣ Send a Message&lt;/strong&gt;
&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;channel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;postMessage&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;NOTIFY&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hello from another tab!&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;h3&gt;
  
  
  &lt;strong&gt;3️⃣ Receive Messages&lt;/strong&gt;
&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;channel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onmessage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&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;Received:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔄 Now, any tab listening to &lt;code&gt;my-channel&lt;/code&gt; will &lt;strong&gt;instantly receive updates&lt;/strong&gt;! ✨&lt;/p&gt;




&lt;h2&gt;
  
  
  🛠️ Real-World Use Cases for BroadcastChannel API
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1️⃣ &lt;strong&gt;Cross-Tab Authentication Sync 🔑&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Ever noticed how when you log out of Gmail in one tab, &lt;strong&gt;all Gmail tabs log out too&lt;/strong&gt;? That’s exactly what we can do with BroadcastChannel API!&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;authChannel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;BroadcastChannel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;auth-sync&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// On logout:&lt;/span&gt;
&lt;span class="nx"&gt;authChannel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;postMessage&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;LOGOUT&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Listen for logout messages&lt;/span&gt;
&lt;span class="nx"&gt;authChannel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onmessage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&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="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&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;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;LOGOUT&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="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reload&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Redirect to login page&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🛠 &lt;strong&gt;Now, logging out in one tab will instantly log out all tabs!&lt;/strong&gt; 🔥&lt;/p&gt;




&lt;h3&gt;
  
  
  2️⃣ &lt;strong&gt;Real-Time Theme Sync 🎨&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Imagine a user &lt;strong&gt;switches to dark mode&lt;/strong&gt; in one tab, and all open tabs should immediately update.&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;themeChannel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;BroadcastChannel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;theme-sync&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// When user changes theme:&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;newTheme&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dark&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;themeChannel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;postMessage&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;THEME_CHANGE&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;newTheme&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Listen for theme changes&lt;/span&gt;
&lt;span class="nx"&gt;themeChannel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onmessage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&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="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&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;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;THEME_CHANGE&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="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;className&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;event&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;theme&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🎨 &lt;strong&gt;Now, all tabs stay visually in sync!&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  3️⃣ &lt;strong&gt;Keeping a Shopping Cart in Sync 🛒&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;A user adds an item to their cart in one tab, and the other tabs update automatically.&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;cartChannel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;BroadcastChannel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;cart-sync&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// When user adds an item to the cart:&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;newItem&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&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;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Laptop&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="nx"&gt;cartChannel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;postMessage&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ADD_ITEM&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;item&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;newItem&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Listen for cart updates&lt;/span&gt;
&lt;span class="nx"&gt;cartChannel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onmessage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&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="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&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;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ADD_ITEM&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;addToCart&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&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;item&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Update UI&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🛒 &lt;strong&gt;Smooth shopping experience across tabs!&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  ⛔ Limitations &amp;amp; Gotchas
&lt;/h2&gt;

&lt;p&gt;While &lt;strong&gt;BroadcastChannel API is awesome&lt;/strong&gt;, here are some things to keep in mind:&lt;/p&gt;

&lt;p&gt;❌ &lt;strong&gt;Works Only Within the Same Origin&lt;/strong&gt; 🏠&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tabs must be on the &lt;strong&gt;same protocol, host, and port&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;❌ &lt;strong&gt;No Message History 📜&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;New tabs &lt;strong&gt;won’t receive old messages&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;❌ &lt;strong&gt;Not Available in Private Browsing (Some Browsers)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Safari restricts it in private mode&lt;/strong&gt;. 😭&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ &lt;strong&gt;Workaround&lt;/strong&gt;: Use &lt;code&gt;localStorage&lt;/code&gt; as a fallback!&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;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;BroadcastChannel&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Fallback to localStorage-based messaging&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🏆 Best Practices for Using BroadcastChannel API
&lt;/h2&gt;

&lt;p&gt;✅ &lt;strong&gt;Use a Unique Channel Name&lt;/strong&gt; 🔖&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keep names &lt;strong&gt;specific&lt;/strong&gt; (e.g., &lt;code&gt;cart-sync&lt;/code&gt;, &lt;code&gt;auth-sync&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ &lt;strong&gt;Close Channels When Not Needed&lt;/strong&gt; 🔒&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prevent memory leaks using:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;  &lt;span class="nx"&gt;channel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close&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;Debounce Frequent Updates&lt;/strong&gt; 🏎️&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If syncing rapidly changing data, use debouncing to avoid performance issues.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;The &lt;strong&gt;BroadcastChannel API&lt;/strong&gt; is a hidden gem 💎 in JavaScript that enables &lt;strong&gt;instant, real-time communication between browser tabs&lt;/strong&gt;. It's &lt;strong&gt;lightweight, requires no backend&lt;/strong&gt;, and is &lt;strong&gt;perfect for cross-tab synchronization&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;✅ Sync data in &lt;strong&gt;real-time across tabs&lt;/strong&gt; 🔄✅ No need for WebSockets or backend services 💰✅ Use for &lt;strong&gt;auth sync, theme updates, shopping carts, and more&lt;/strong&gt; 🛠️&lt;/p&gt;

&lt;p&gt;🔹 &lt;strong&gt;Now go forth and build awesome things with BroadcastChannel API!&lt;/strong&gt; 💡🚀&lt;/p&gt;

&lt;p&gt;📣 &lt;strong&gt;Have you used this API before? What’s your experience?&lt;/strong&gt; Let me know in the comments! 🎤&lt;/p&gt;




</description>
    </item>
    <item>
      <title>RTPP (Resilient Transport Protocol for Peer-to-Peer Communications)</title>
      <dc:creator>Devesh rajawat</dc:creator>
      <pubDate>Sun, 26 Jan 2025 17:13:19 +0000</pubDate>
      <link>https://dev.to/devesh_rajawat_485b22b333/rtpp-resilient-transport-protocol-for-peer-to-peer-communications-13ge</link>
      <guid>https://dev.to/devesh_rajawat_485b22b333/rtpp-resilient-transport-protocol-for-peer-to-peer-communications-13ge</guid>
      <description>&lt;h2&gt;
  
  
  Problem:
&lt;/h2&gt;

&lt;p&gt;Peer-to-peer (P2P) communication is widely used for file sharing, streaming, and decentralized applications. However, current protocols like TCP and UDP have limitations when it comes to real-time, reliable, and low-latency communication in dynamic and unstable networks. Some issues include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;High Latency&lt;/strong&gt;: In P2P, packets can take different paths with varying delays, making applications like video calling, gaming, or live streaming prone to lag.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Packet Loss&lt;/strong&gt;: In P2P, networks can be unstable, leading to packet loss. Current protocols like TCP handle loss but can be slow to recover in real-time communications.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No Adaptive Congestion Control&lt;/strong&gt;: With the decentralized nature of P2P, traffic congestion can be unpredictable. Current protocols like TCP are too rigid in how they handle congestion, potentially slowing down real-time data transmission.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Solution:
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;RTPP (Resilient Transport Protocol for Peer-to-Peer Communications)&lt;/strong&gt; is designed specifically for low-latency, adaptive, and resilient communication between peers, optimizing performance in unreliable or fluctuating networks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Features of RTPP:
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Adaptive Congestion Control
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;RTPP continuously monitors network conditions across multiple peers. Instead of relying on a central server, it dynamically adjusts data transmission rates based on available bandwidth and network congestion for each peer.&lt;/li&gt;
&lt;li&gt;For example, if one peer’s connection is congested, RTPP can throttle the data from that peer while ensuring the remaining peers maintain their data flow.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Multi-Path Resilience
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;RTPP uses multiple paths (e.g., Wi-Fi, mobile data, wired) between peers to deliver data. If one path experiences high latency or drops, it can quickly switch to another available path without disrupting the overall connection.&lt;/li&gt;
&lt;li&gt;This feature ensures resilience, especially in environments where a single connection might not be stable.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. FEC (Forward Error Correction) for Low-Latency Recovery
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Instead of waiting for retransmissions like TCP, RTPP uses FEC for fast error recovery. It sends redundant data (like parity information) so that missing packets can be reconstructed on the receiving side, reducing latency and maintaining flow.&lt;/li&gt;
&lt;li&gt;This is ideal for applications like video streaming or VoIP, where waiting for packet retransmission would introduce unacceptable delays.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Adaptive Compression
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;RTPP adapts to the available bandwidth by adjusting the level of data compression. If network congestion is detected, it can increase compression to send less data while maintaining quality.&lt;/li&gt;
&lt;li&gt;This would be particularly useful for mobile networks or areas with fluctuating internet speeds.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. Low Overhead for Real-Time Communication
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Unlike TCP, which uses handshakes and acknowledgments that introduce delays, RTPP minimizes protocol overhead, focusing on real-time data flow and resilience, making it optimal for applications like online gaming, video conferencing, and live broadcasting.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6. Decentralized Peer Discovery
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;RTPP doesn't rely on centralized servers for peer discovery. Instead, peers can automatically discover and connect to each other based on decentralized methods, such as blockchain or DHT (Distributed Hash Tables), reducing bottlenecks and improving scalability in decentralized applications.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Applications of RTPP:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Decentralized Video Conferencing&lt;/strong&gt;: In a video call, RTPP ensures that the communication between peers is smooth, even if one or more participants experience network instability or congestion.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-Time Multiplayer Gaming&lt;/strong&gt;: For real-time gaming, RTPP can guarantee low-latency communication between players, even in a P2P network, while adapting to changes in connection quality.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Live Streaming&lt;/strong&gt;: RTPP ensures that a live stream reaches viewers with minimal buffering and latency, adapting to changes in network conditions on both the sender and receiver side.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Decentralized File Sharing&lt;/strong&gt;: RTPP can make file transfers between peers faster and more reliable, even on unreliable networks.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How it Differs from Existing Protocols:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;TCP&lt;/strong&gt;: Reliable but slow in adapting to real-time needs (e.g., streaming or gaming) due to its focus on ordered, error-free delivery.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;UDP&lt;/strong&gt;: Fast but unreliable and lacks built-in features for congestion control and error correction.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;QUIC&lt;/strong&gt;: Focuses on reducing latency in the HTTP/2 context but doesn't optimize specifically for P2P, low-latency communication, or adaptive congestion across a variety of network types.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;RTPP would be an ideal protocol for modern decentralized applications that require real-time, resilient, and adaptive communication between peers. It would solve many challenges around congestion, packet loss, and latency, creating a smoother experience for users in dynamic and fluctuating network environments.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>http</category>
      <category>tcp</category>
      <category>ftp</category>
    </item>
    <item>
      <title>Deep Dive in Asynchrony: Microtasks, Macrotasks, and the Event Loop</title>
      <dc:creator>Devesh rajawat</dc:creator>
      <pubDate>Tue, 31 Dec 2024 10:12:46 +0000</pubDate>
      <link>https://dev.to/devesh_rajawat_485b22b333/deep-dive-in-asynchrony-microtasks-macrotasks-and-the-event-loop-21mm</link>
      <guid>https://dev.to/devesh_rajawat_485b22b333/deep-dive-in-asynchrony-microtasks-macrotasks-and-the-event-loop-21mm</guid>
      <description>&lt;p&gt;JavaScript’s asynchronous nature can feel like magic until you dive into the mechanics. The secret sauce lies in its &lt;strong&gt;event loop&lt;/strong&gt;, which orchestrates two key players: &lt;strong&gt;microtasks&lt;/strong&gt; and &lt;strong&gt;macrotasks&lt;/strong&gt;. But what are they, how do they work, and why do they matter? Let’s unravel the mystery with a deep dive, examples, and tips to master this concept.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;The Event Loop and Task Queues&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The JavaScript engine executes code in a single thread. To handle asynchronous operations, it relies on the &lt;strong&gt;event loop&lt;/strong&gt;, which coordinates between the &lt;strong&gt;call stack&lt;/strong&gt; and task queues. These task queues are split into two categories: &lt;strong&gt;microtasks&lt;/strong&gt; and &lt;strong&gt;macrotasks&lt;/strong&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Microtasks&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Microtasks are high-priority tasks that must be executed as soon as the currently executing JavaScript code finishes and the call stack is empty. They ensure quick follow-up actions and consistent states. Common examples include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Promises&lt;/strong&gt; (&lt;code&gt;.then&lt;/code&gt;, &lt;code&gt;async/await&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MutationObserver&lt;/strong&gt; callbacks&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Macrotasks&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Macrotasks are lower-priority tasks that the event loop handles only after all microtasks have been executed. They handle larger, deferred operations and external events. Common examples include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Timers&lt;/strong&gt; (&lt;code&gt;setTimeout&lt;/code&gt;, &lt;code&gt;setInterval&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MessageChannel&lt;/strong&gt; callbacks&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;I/O operations&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There’s also &lt;strong&gt;requestAnimationFrame&lt;/strong&gt;, which isn’t part of either queue. It synchronizes with the browser’s rendering cycle, making it ideal for smooth animations.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;How It Works&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Here’s how the event loop processes tasks:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Executes synchronous code first.&lt;/li&gt;
&lt;li&gt;Clears the &lt;strong&gt;microtask queue&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Executes one task from the &lt;strong&gt;macrotask queue&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Repeats steps 2 and 3 until all tasks are handled.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This prioritization ensures that high-priority tasks like promises are resolved before less urgent operations like timers.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;An Example in Action&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Below is a practical code snippet to illustrate the interaction between synchronous code, microtasks, macrotasks, and &lt;code&gt;requestAnimationFrame&lt;/code&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="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;Synchronous code starts&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Macrotask: setTimeout&lt;/span&gt;
&lt;span class="nf"&gt;setTimeout&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;Macrotask: setTimeout&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="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Macrotask: setInterval&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;intervalId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&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="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;Macrotask: setInterval&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nf"&gt;clearInterval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;intervalId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Microtask: Promise&lt;/span&gt;
&lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="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;Microtask: Promise then 1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="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;Microtask: Promise then 2&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="c1"&gt;// Microtask: MutationObserver&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;observer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;MutationObserver&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;Microtask: MutationObserver&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;targetNode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;div&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;observer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;observe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;targetNode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;attributes&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="nx"&gt;targetNode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;data-test&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;true&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Macrotask: MessageChannel&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;channel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;MessageChannel&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;channel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;port1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onmessage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="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;Macrotask: MessageChannel&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="nx"&gt;channel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;port2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;postMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Test&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// requestAnimationFrame&lt;/span&gt;
&lt;span class="nf"&gt;requestAnimationFrame&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;Outside task queues: requestAnimationFrame&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="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;Synchronous code ends&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;h3&gt;
  
  
  &lt;strong&gt;Expected Output&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The output sequence helps clarify the prioritization:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Synchronous Code&lt;/strong&gt;: “Synchronous code starts”, “Synchronous code ends”&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Microtasks&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;“Microtask: Promise then 1”&lt;/li&gt;
&lt;li&gt;“Microtask: Promise then 2”&lt;/li&gt;
&lt;li&gt;“Microtask: MutationObserver”&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Macrotasks&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;“Macrotask: setTimeout”&lt;/li&gt;
&lt;li&gt;“Macrotask: MessageChannel”&lt;/li&gt;
&lt;li&gt;“Macrotask: setInterval”&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;requestAnimationFrame&lt;/strong&gt;: “Outside task queues: requestAnimationFrame”&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Deep Dive: Microtasks vs. Macrotasks&lt;/strong&gt;
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Microtasks: Key Characteristics&lt;/strong&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Execute immediately after the synchronous code completes.&lt;/li&gt;
&lt;li&gt;Ideal for small, high-priority updates like resolving promises or reacting to DOM mutations.&lt;/li&gt;
&lt;li&gt;Examples: Promises, &lt;code&gt;MutationObserver&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Macrotasks: Key Characteristics&lt;/strong&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Run only after all microtasks are cleared.&lt;/li&gt;
&lt;li&gt;Used for larger, lower-priority operations or external event handling.&lt;/li&gt;
&lt;li&gt;Examples: Timers, &lt;code&gt;MessageChannel&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;requestAnimationFrame: The Odd One Out&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Though not part of the task queues, &lt;code&gt;requestAnimationFrame&lt;/code&gt; plays a unique role in asynchrony. It schedules code to run before the next browser repaint, ensuring minimal frame drops and smoother animations.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Conclusion&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The interplay between microtasks, macrotasks, and the event loop is at the heart of JavaScript’s asynchrony. By understanding and leveraging these concepts, you can write more efficient, maintainable, and performant code. Remember: microtasks first, macrotasks second, and &lt;code&gt;requestAnimationFrame&lt;/code&gt; for visual polish. Happy coding!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>programming</category>
      <category>react</category>
      <category>deepdive</category>
    </item>
  </channel>
</rss>
