<?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: Nilupul Perera</title>
    <description>The latest articles on DEV Community by Nilupul Perera (@hasunnilupul).</description>
    <link>https://dev.to/hasunnilupul</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%2F753450%2Fada74e63-208b-4426-aa92-70d85f23a880.jpg</url>
      <title>DEV Community: Nilupul Perera</title>
      <link>https://dev.to/hasunnilupul</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hasunnilupul"/>
    <language>en</language>
    <item>
      <title>🤖 The Role of AI in Modern Frontend Development</title>
      <dc:creator>Nilupul Perera</dc:creator>
      <pubDate>Wed, 28 May 2025 05:00:00 +0000</pubDate>
      <link>https://dev.to/hasunnilupul/the-role-of-ai-in-modern-frontend-development-3clg</link>
      <guid>https://dev.to/hasunnilupul/the-role-of-ai-in-modern-frontend-development-3clg</guid>
      <description>&lt;p&gt;Frontend development is evolving fast. Like, &lt;em&gt;blink-and-you-miss-it&lt;/em&gt; fast. And now, AI is crashing the party — not as a guest, but as the new co-pilot. From generating components to optimizing UX, AI is reshaping how we design, build, and ship user interfaces.&lt;/p&gt;

&lt;p&gt;In this article, we'll break down:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How AI is transforming frontend workflows&lt;/li&gt;
&lt;li&gt;Real-world tools and examples&lt;/li&gt;
&lt;li&gt;What you should actually care about as a frontend dev&lt;/li&gt;
&lt;li&gt;Whether you should be hyped — or cautious&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  💡 What’s AI Actually Doing in Frontend Right Now?
&lt;/h2&gt;

&lt;p&gt;Let’s get real. AI isn’t writing perfect React apps from scratch (yet). But it &lt;em&gt;is&lt;/em&gt; crushing it in specific parts of the workflow:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;UI Code Generation&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Tools like &lt;a href="https://v0.dev" rel="noopener noreferrer"&gt;Vercel’s v0.dev&lt;/a&gt;, &lt;a href="https://codeium.com" rel="noopener noreferrer"&gt;Codeium&lt;/a&gt;, and even ChatGPT are generating full UI components from simple prompts.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"Build me a pricing card with Tailwind and a call-to-action button"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Boom — AI can spit out 80% of what you'd hand-code.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. &lt;strong&gt;Design-to-Code&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Figma + AI = magic. Tools like &lt;strong&gt;Figma plugins with GPT&lt;/strong&gt;, or Vercel’s v0, can interpret design layers and output clean, usable JSX.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. &lt;strong&gt;AI Pair Programming&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;GitHub Copilot and CodeWhisperer are now your daily standup buddies. You write a few lines, they complete it. Boring boilerplate? Gone.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. &lt;strong&gt;Personalized UX at Scale&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;AI can help dynamically tailor frontend content — think e-commerce homepages that adapt based on real-time preferences or behavior.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚙️ Real-World Tools in Action
&lt;/h2&gt;

&lt;p&gt;Let’s talk about what’s actually being used out there:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;What It Does&lt;/th&gt;
&lt;th&gt;Use Case&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GitHub Copilot&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AI-assisted code completion&lt;/td&gt;
&lt;td&gt;Speed up repetitive code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;v0.dev&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Prompt-to-UI generator&lt;/td&gt;
&lt;td&gt;Bootstrap UIs instantly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;LangChain.js&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Build AI-powered frontends&lt;/td&gt;
&lt;td&gt;Chatbots, dynamic search&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Vercel AI SDK&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Edge-optimized AI interaction&lt;/td&gt;
&lt;td&gt;Real-time AI in Next.js apps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Locofy.ai&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Converts Figma to React/HTML&lt;/td&gt;
&lt;td&gt;Design-to-code pipeline&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🧠 Code Example: AI Chatbot in React with OpenAI API
&lt;/h2&gt;

&lt;p&gt;Here’s a quick look at how to build a minimal AI chatbot UI in React:&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;useState&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;const&lt;/span&gt; &lt;span class="nx"&gt;Chat&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="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setInput&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="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setMessages&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sendMessage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&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="s1"&gt;/api/chat&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;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;body&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="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;input&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;data&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;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nf"&gt;setMessages&lt;/span&gt;&lt;span class="p"&gt;([...&lt;/span&gt;&lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;input&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;bot&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;reply&lt;/span&gt; &lt;span class="p"&gt;}]);&lt;/span&gt;
    &lt;span class="nf"&gt;setInput&lt;/span&gt;&lt;span class="p"&gt;(&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="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="nt"&gt;div&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;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;i&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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;i&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;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;bot&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;div&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;&lt;/span&gt;&lt;span class="nt"&gt;input&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;input&lt;/span&gt;&lt;span class="si"&gt;}&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;e&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setInput&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&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="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="nx"&gt;sendMessage&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Send&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="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;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;Chat&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pair that with a basic &lt;code&gt;/api/chat&lt;/code&gt; backend hitting OpenAI or any LLM, and you're live.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧬 Should You Be Worried?
&lt;/h2&gt;

&lt;p&gt;Short answer: &lt;strong&gt;No. Adapt.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AI isn’t here to steal your job — it’s here to &lt;strong&gt;make you 10x faster&lt;/strong&gt; at the boring stuff. You still need to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Architect scalable apps&lt;/li&gt;
&lt;li&gt;Optimize performance&lt;/li&gt;
&lt;li&gt;Handle state and edge cases&lt;/li&gt;
&lt;li&gt;Build great UX&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But now you can ship faster, focus more on logic, and let AI cover boilerplate.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚠️ The Gotchas
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Code quality ≠ guaranteed&lt;/strong&gt; — You still need to review what AI gives you.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security holes&lt;/strong&gt; — AI tools can generate risky patterns if you’re not careful.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Accessibility + UX&lt;/strong&gt; — AI might not understand real users like you do.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Think of AI as a fast intern. Smart, helpful — but needs supervision.&lt;/p&gt;




&lt;h2&gt;
  
  
  📈 What's Next?
&lt;/h2&gt;

&lt;p&gt;Expect more:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Framework-level AI integration&lt;/strong&gt; (React, Vue, SvelteKit)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Live coding assistants&lt;/strong&gt; inside your IDE&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LLM-driven personalization&lt;/strong&gt; that renders custom content on the edge&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A11y and testing bots&lt;/strong&gt; that review your code on commit&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AI isn’t replacing frontend devs. It’s augmenting us.&lt;/p&gt;




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

&lt;p&gt;Frontend is no longer just about CSS and components. It’s becoming increasingly about &lt;strong&gt;how fast you can prototype&lt;/strong&gt;, &lt;strong&gt;how personalized your UI can be&lt;/strong&gt;, and &lt;strong&gt;how well you integrate intelligence into the UX&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So if you haven’t already, it’s time to experiment. Build with AI. Learn its quirks. And use it to ship better, faster, smarter frontends.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;👀 Want to see code examples or a full GPT-powered React app? Drop a comment or connect with me. Let’s build the future of frontend together.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>frontend</category>
      <category>ai</category>
    </item>
    <item>
      <title>⚛️ React 19's `use()` Hook: A Practical Guide with Examples</title>
      <dc:creator>Nilupul Perera</dc:creator>
      <pubDate>Tue, 27 May 2025 04:22:00 +0000</pubDate>
      <link>https://dev.to/hasunnilupul/react-19s-use-hook-a-practical-guide-with-examples-beb</link>
      <guid>https://dev.to/hasunnilupul/react-19s-use-hook-a-practical-guide-with-examples-beb</guid>
      <description>&lt;p&gt;React 19 introduces a powerful new addition to the hooks API — the &lt;code&gt;use()&lt;/code&gt; hook. If you’ve been deep in server components or experimenting with async rendering in React, this is about to make your life a lot easier.&lt;/p&gt;

&lt;p&gt;In this article, we’ll explore:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What &lt;code&gt;use()&lt;/code&gt; is and when to use it&lt;/li&gt;
&lt;li&gt;Why it matters in React 19&lt;/li&gt;
&lt;li&gt;Real-world examples with async data fetching and server components&lt;/li&gt;
&lt;li&gt;How to migrate from traditional patterns&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧠 What Is the &lt;code&gt;use()&lt;/code&gt; Hook?
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;use()&lt;/code&gt; is a new &lt;strong&gt;hook that lets you read the value of a promise directly inside a component&lt;/strong&gt; — mostly designed for use with &lt;strong&gt;React Server Components (RSC)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Instead of using &lt;code&gt;useEffect&lt;/code&gt; and &lt;code&gt;useState&lt;/code&gt; to manage async flows, you can now handle async logic more declaratively:&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="c1"&gt;// Server Component Example&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;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;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getUserData&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;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&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="s1"&gt;https://api.example.com/user&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;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;UserProfile&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;user&lt;/span&gt; &lt;span class="o"&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;getUserData&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;div&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;user&lt;/span&gt;&lt;span class="p"&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;div&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;blockquote&gt;
&lt;p&gt;⚠️ Note: This works only in &lt;strong&gt;server components&lt;/strong&gt;, not client components (yet).&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🛠️ Why Use &lt;code&gt;use()&lt;/code&gt;?
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;use()&lt;/code&gt; hook brings these major improvements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Simpler async logic in server components&lt;/li&gt;
&lt;li&gt;🔄 Suspense-friendly by design&lt;/li&gt;
&lt;li&gt;🧼 Cleaner code — fewer loading states and side-effects&lt;/li&gt;
&lt;li&gt;🚀 Better DX with async/await natively inside components&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📦 Real-World Use Case: Fetching Products
&lt;/h2&gt;

&lt;p&gt;Let’s build a simple eCommerce component that fetches products on the server:&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="c1"&gt;// app/products/page.tsx (Server Component)&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;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;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getProducts&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;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&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="s1"&gt;https://fakestoreapi.com/products&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&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;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;ProductsPage&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;products&lt;/span&gt; &lt;span class="o"&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;getProducts&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="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;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Products&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;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;ul&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;products&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&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="kr"&gt;any&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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt; &lt;span class="na"&gt;key&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="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&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;product&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&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;li&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;/&lt;/span&gt;&lt;span class="nt"&gt;ul&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;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;Boom — no loading state, no messy lifecycle code. And React handles it in the streaming render pipeline.&lt;/p&gt;




&lt;h2&gt;
  
  
  🤔 How Does This Compare to useEffect?
&lt;/h2&gt;

&lt;p&gt;In traditional React (client components), you'd use &lt;code&gt;useEffect&lt;/code&gt; + &lt;code&gt;useState&lt;/code&gt; like this:&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;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;fetchData&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;setData&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;Now, in &lt;strong&gt;React Server Components&lt;/strong&gt;, you just:&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;data&lt;/span&gt; &lt;span class="o"&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;fetchData&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It’s declarative, synchronous-feeling, and lets you write async code like you would in a regular function.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔁 Composing Async Logic
&lt;/h2&gt;

&lt;p&gt;You can also &lt;strong&gt;compose multiple &lt;code&gt;use()&lt;/code&gt; calls&lt;/strong&gt; without breaking the render tree:&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;user&lt;/span&gt; &lt;span class="o"&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;getUser&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;posts&lt;/span&gt; &lt;span class="o"&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;getPosts&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;id&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It’s clean, readable, and behaves predictably thanks to Suspense under the hood.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧪 When Not to Use It
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;❌ Not usable in client components yet&lt;/li&gt;
&lt;li&gt;⚠️ Can lead to waterfall fetches if not used carefully&lt;/li&gt;
&lt;li&gt;🔍 Debugging async render flows might take getting used to&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;The &lt;code&gt;use()&lt;/code&gt; hook in React 19 marks a serious shift toward &lt;strong&gt;simpler, more intuitive async programming&lt;/strong&gt; in React — especially for server components.&lt;/p&gt;

&lt;p&gt;If you're building with Next.js 14+ or another React 19-compatible framework, now’s the time to refactor those old &lt;code&gt;useEffect&lt;/code&gt; spaghetti towers and try &lt;code&gt;use()&lt;/code&gt; instead.&lt;/p&gt;

&lt;p&gt;It’s cleaner, faster, and frankly — it’s the future of React.&lt;/p&gt;




&lt;p&gt;💬 Have you used the new &lt;code&gt;use()&lt;/code&gt; hook in your app? What’s your experience been like?&lt;/p&gt;

</description>
      <category>react</category>
      <category>webdev</category>
      <category>nextjs</category>
      <category>react19</category>
    </item>
    <item>
      <title>🚀 What Are Progressive Web Apps (PWAs)? A Complete Guide for Modern Web Devs</title>
      <dc:creator>Nilupul Perera</dc:creator>
      <pubDate>Mon, 26 May 2025 05:00:00 +0000</pubDate>
      <link>https://dev.to/hasunnilupul/what-are-progressive-web-apps-pwas-a-complete-guide-for-modern-web-devs-4191</link>
      <guid>https://dev.to/hasunnilupul/what-are-progressive-web-apps-pwas-a-complete-guide-for-modern-web-devs-4191</guid>
      <description>&lt;p&gt;Progressive Web Apps (PWAs) are reshaping how we build and deliver web experiences. They're not a buzzword anymore — they're a &lt;strong&gt;core part of the modern web stack&lt;/strong&gt;. From startups to big tech, everyone’s jumping on the PWA train.&lt;/p&gt;

&lt;p&gt;Let’s break down what PWAs are, how they work, why they matter, and how to build one that performs like a native app — but with the reach of the web.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 What is a Progressive Web App?
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;Progressive Web App&lt;/strong&gt; is a web application that uses &lt;strong&gt;modern web capabilities&lt;/strong&gt; to deliver an app-like experience. It can be installed on a user’s device, works offline, and loads fast — all while being served via HTTPS and built with standard web technologies (HTML, CSS, JS).&lt;/p&gt;

&lt;h3&gt;
  
  
  Core Characteristics:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✅ Responsive&lt;/li&gt;
&lt;li&gt;📲 Installable on home screen&lt;/li&gt;
&lt;li&gt;⚡ Works offline&lt;/li&gt;
&lt;li&gt;🛡️ Served over HTTPS&lt;/li&gt;
&lt;li&gt;🔔 Push notifications&lt;/li&gt;
&lt;li&gt;🔁 Background sync&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🛠️ Key Technologies That Power PWAs
&lt;/h2&gt;

&lt;p&gt;PWAs are made possible by combining several APIs and browser features:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Service Workers&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;They run in the background and enable:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Offline support&lt;/li&gt;
&lt;li&gt;Caching assets/data&lt;/li&gt;
&lt;li&gt;Intercepting network requests&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. &lt;strong&gt;Web App Manifest&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;A JSON file that defines how your app appears to the user (icon, name, start URL, display mode).&lt;/p&gt;

&lt;h3&gt;
  
  
  3. &lt;strong&gt;HTTPS&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;PWAs must be served securely. Browsers restrict service workers and advanced features to secure origins only.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. &lt;strong&gt;App Shell Architecture&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Splits static assets (the shell) from dynamic content — making repeat loads fast and reliable.&lt;/p&gt;




&lt;h2&gt;
  
  
  📈 Why PWAs Matter in 2025
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ⚡ Speed = Retention
&lt;/h3&gt;

&lt;p&gt;PWAs load in under 3 seconds on average, and users bounce less.&lt;/p&gt;

&lt;h3&gt;
  
  
  🌍 Reach
&lt;/h3&gt;

&lt;p&gt;They're cross-platform by nature. Android? iOS? Desktop? You’re covered.&lt;/p&gt;

&lt;h3&gt;
  
  
  💸 No App Store Gatekeeping
&lt;/h3&gt;

&lt;p&gt;Skip the app store submission process and still allow users to “install” the app.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔔 Re-engagement
&lt;/h3&gt;

&lt;p&gt;Push notifications and background sync offer a mobile-native engagement layer.&lt;/p&gt;

&lt;h3&gt;
  
  
  🧩 Smaller Bundle Sizes
&lt;/h3&gt;

&lt;p&gt;No bloated binaries like with native apps. Faster updates, smaller download footprint.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧪 Real-World Examples of PWAs
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Twitter Lite&lt;/strong&gt;: Reduced data usage by 70% and increased engagement.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Starbucks PWA&lt;/strong&gt;: Doubled daily active users on mobile.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pinterest PWA&lt;/strong&gt;: Increased time spent by 40%.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These apps prove that you can offer native-like experiences from a URL.&lt;/p&gt;




&lt;h2&gt;
  
  
  🏗️ How to Build a Basic PWA
&lt;/h2&gt;

&lt;p&gt;Here’s what your dev flow might look like:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Start with a basic React/Vue/Vanilla app&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Add a &lt;code&gt;manifest.json&lt;/code&gt; with name, icons, theme colors&lt;/li&gt;
&lt;li&gt;Register a &lt;strong&gt;service worker&lt;/strong&gt; to cache assets and handle offline&lt;/li&gt;
&lt;li&gt;Ensure the app is served over HTTPS&lt;/li&gt;
&lt;li&gt;Test with &lt;strong&gt;Lighthouse&lt;/strong&gt; (Chrome DevTools) for PWA readiness score&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Popular frameworks like &lt;strong&gt;Next.js&lt;/strong&gt;, &lt;strong&gt;Nuxt&lt;/strong&gt;, and &lt;strong&gt;SvelteKit&lt;/strong&gt; also offer built-in support or easy plugin options for PWA features.&lt;/p&gt;




&lt;h2&gt;
  
  
  📉 Gotchas and Limitations
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Not every browser supports full PWA features (especially on iOS)&lt;/li&gt;
&lt;li&gt;Service workers can be tricky to debug&lt;/li&gt;
&lt;li&gt;Offline UX must be designed intentionally&lt;/li&gt;
&lt;li&gt;Limited background processing compared to native&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;PWAs aren’t just a fallback solution. They're a &lt;strong&gt;legit contender to native apps&lt;/strong&gt; when done right. If you're building a modern frontend experience and care about speed, reach, and engagement — &lt;strong&gt;PWAs are 100% worth investing in&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  💬 Have you built a PWA before? Drop your stack and thoughts in the comments. Let’s share tips.
&lt;/h3&gt;

</description>
      <category>webdev</category>
      <category>frontend</category>
      <category>pwa</category>
    </item>
    <item>
      <title>📡 A Practical Guide to Using WebSockets in Real-Time Apps</title>
      <dc:creator>Nilupul Perera</dc:creator>
      <pubDate>Fri, 23 May 2025 05:00:00 +0000</pubDate>
      <link>https://dev.to/hasunnilupul/a-practical-guide-to-using-websockets-in-real-time-apps-127i</link>
      <guid>https://dev.to/hasunnilupul/a-practical-guide-to-using-websockets-in-real-time-apps-127i</guid>
      <description>&lt;p&gt;In a world where users expect everything to be real-time — chat apps, dashboards, notifications, live updates — WebSockets have become a foundational tool for modern frontend developers.&lt;/p&gt;

&lt;p&gt;If you're still relying solely on REST APIs and polling to handle dynamic data, it's time to level up. This guide will show you how to integrate WebSockets into your frontend apps in a clean, scalable, and practical way.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔄 What Are WebSockets?
&lt;/h2&gt;

&lt;p&gt;WebSockets are a communication protocol that enables &lt;strong&gt;full-duplex&lt;/strong&gt;, &lt;strong&gt;bidirectional communication&lt;/strong&gt; between a client and server over a persistent connection.&lt;/p&gt;

&lt;p&gt;Unlike REST or HTTP requests, WebSockets keep the connection open, allowing data to be pushed from the server &lt;strong&gt;without&lt;/strong&gt; the client needing to constantly ask for updates (a.k.a. polling).&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 When Should You Use WebSockets?
&lt;/h2&gt;

&lt;p&gt;Use WebSockets when you need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Real-time communication&lt;/strong&gt; (e.g., messaging, collaboration tools)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Live updates&lt;/strong&gt; (e.g., stock prices, sports scores, data dashboards)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Push notifications&lt;/strong&gt; without delay&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bidirectional interaction&lt;/strong&gt; (e.g., multiplayer games, live auctions)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Avoid WebSockets if your app doesn't need frequent or immediate updates — REST may be simpler and cheaper to manage.&lt;/p&gt;




&lt;h2&gt;
  
  
  🛠️ Setting Up a WebSocket Server
&lt;/h2&gt;

&lt;p&gt;For this example, we'll use &lt;strong&gt;Node.js with &lt;code&gt;ws&lt;/code&gt;&lt;/strong&gt;, a lightweight WebSocket library.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Install &lt;code&gt;ws&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;ws
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Create a basic WebSocket server
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// server.js&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;WebSocket&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ws&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;server&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;WebSocket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Server&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;8080&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;connection&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;socket&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;Client connected&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nx"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;message&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;message&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;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="c1"&gt;// Echo back&lt;/span&gt;
    &lt;span class="nx"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Server: &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="s2"&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;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;close&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="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;Client disconnected&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🌐 Connecting WebSockets in the Frontend
&lt;/h2&gt;

&lt;p&gt;Let’s connect from a React app:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// useWebSocket.js&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;useEffect&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useRef&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;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;useWebSocket&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&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;socketRef&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="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="nx"&gt;socketRef&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;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;WebSocket&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nx"&gt;socketRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onopen&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="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;Connected&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;socketRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&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="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;Message:&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="nx"&gt;socketRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onerror&lt;/span&gt; &lt;span class="o"&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="o"&gt;=&amp;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;WebSocket error:&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;socketRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onclose&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="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;Disconnected&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;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;socketRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&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;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;url&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;sendMessage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;msg&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;socketRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;readyState&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;WebSocket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;OPEN&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;socketRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;msg&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="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;sendMessage&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;
  
  
  🧠 Best Practices
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Reconnect Logic&lt;/strong&gt;: Add automatic reconnection for dropped connections.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use Context or State Management&lt;/strong&gt; to share socket data across your app.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Throttle updates&lt;/strong&gt; if you're handling high-frequency events (e.g., mouse tracking).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Secure Your Sockets&lt;/strong&gt;: Use &lt;code&gt;wss://&lt;/code&gt; in production.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fallbacks&lt;/strong&gt;: Consider fallback strategies for older browsers or poor network conditions.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ⚡ Real-World Use Case: Live Notifications
&lt;/h2&gt;

&lt;p&gt;Let’s say you want to show real-time notifications in your dashboard:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;On server: Broadcast a &lt;code&gt;"notification"&lt;/code&gt; event when something important happens.&lt;/li&gt;
&lt;li&gt;On client: Listen for that event and update the UI.&lt;/li&gt;
&lt;li&gt;Done — no polling, no delays.&lt;/li&gt;
&lt;/ol&gt;




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

&lt;p&gt;WebSockets offer a fast, efficient way to build truly interactive frontend apps. With the right architecture and tools, you can create experiences that feel instant and alive.&lt;/p&gt;

&lt;p&gt;Don't overcomplicate it. Start small. Use a hook. Add reconnection later. Focus on user experience first.&lt;/p&gt;

&lt;p&gt;If you're not experimenting with WebSockets yet, you're missing out on the real-time future of the web.&lt;/p&gt;




&lt;h3&gt;
  
  
  📎 Save this post and follow for more frontend dev insights.
&lt;/h3&gt;

</description>
      <category>webdev</category>
      <category>react</category>
      <category>frontend</category>
      <category>javascript</category>
    </item>
    <item>
      <title>⚙️ The Impact of Edge Functions on Frontend Performance</title>
      <dc:creator>Nilupul Perera</dc:creator>
      <pubDate>Wed, 21 May 2025 05:00:00 +0000</pubDate>
      <link>https://dev.to/hasunnilupul/the-impact-of-edge-functions-on-frontend-performance-1lde</link>
      <guid>https://dev.to/hasunnilupul/the-impact-of-edge-functions-on-frontend-performance-1lde</guid>
      <description>&lt;p&gt;In the world of frontend development, &lt;strong&gt;performance is king&lt;/strong&gt;. Whether you're building a sleek SaaS dashboard or a blazing-fast eCommerce storefront, your users expect snappy load times and seamless interactions — no excuses.&lt;/p&gt;

&lt;p&gt;Over the years, we've optimized everything from lazy loading to CDN caching. But there's a new tool that’s changing the game completely: &lt;strong&gt;Edge Functions&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Let’s break down why every frontend engineer should be paying attention.&lt;/p&gt;




&lt;h2&gt;
  
  
  🌍 What Exactly Are Edge Functions?
&lt;/h2&gt;

&lt;p&gt;At a high level, edge functions are serverless functions deployed &lt;strong&gt;closer to your users&lt;/strong&gt;, at edge locations across the globe. This is different from traditional serverless setups that live in a single cloud region.&lt;/p&gt;

&lt;p&gt;Think Vercel Edge Functions, Netlify Edge Middleware, or Cloudflare Workers — all of them let you run logic at the &lt;strong&gt;edge of the network&lt;/strong&gt;, before the request even reaches your origin server.&lt;/p&gt;

&lt;p&gt;Instead of relying on one centralized backend in the US or Europe, you can now &lt;strong&gt;process requests near the user&lt;/strong&gt;, reducing round trips and improving performance in ways that frontend tools alone can’t match.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 Why Frontend Developers Should Care
&lt;/h2&gt;

&lt;p&gt;We obsess over &lt;strong&gt;Core Web Vitals&lt;/strong&gt; like FCP (First Contentful Paint), LCP (Largest Contentful Paint), and CLS (Cumulative Layout Shift). These metrics directly impact both &lt;strong&gt;user experience&lt;/strong&gt; and &lt;strong&gt;search engine rankings&lt;/strong&gt;. Here's how edge functions can help:&lt;/p&gt;




&lt;h3&gt;
  
  
  ⚡ 1. Reduced Latency = Faster Pages
&lt;/h3&gt;

&lt;p&gt;When logic executes close to the user, the time it takes to respond — especially the &lt;strong&gt;Time to First Byte (TTFB)&lt;/strong&gt; — drops significantly.&lt;/p&gt;

&lt;p&gt;Imagine a user in Singapore hitting your API that's hosted in North Virginia. That round-trip is brutal. With edge functions, the request is handled in Singapore itself.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Result&lt;/strong&gt;: Lower TTFB, better FCP, and happier users.&lt;/p&gt;




&lt;h3&gt;
  
  
  🌐 2. Personalized Content Without Delays
&lt;/h3&gt;

&lt;p&gt;Edge functions let you inject personalization into your pages without slowing down the client-side load.&lt;/p&gt;

&lt;p&gt;Let’s say you want to show currency, language, or offers based on location. Instead of doing this on the client or backend, handle it at the edge. By the time the page loads, it’s already tailored to the user.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Result&lt;/strong&gt;: Fast, dynamic pages with no hydration jank.&lt;/p&gt;




&lt;h3&gt;
  
  
  🧱 3. Smarter Caching Logic
&lt;/h3&gt;

&lt;p&gt;Edge functions give you fine-grained control over caching. You can serve cached content to anonymous users and fresh content to logged-in ones — all handled before your app runs.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Result&lt;/strong&gt;: Balance performance with real-time updates.&lt;/p&gt;




&lt;h3&gt;
  
  
  🔌 4. Lightweight API Orchestration
&lt;/h3&gt;

&lt;p&gt;Use edge functions to act as an API gateway. Combine requests, handle routing logic, or inject headers — all on the fly.&lt;/p&gt;

&lt;p&gt;No need to hit your origin server for every little thing.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Result&lt;/strong&gt;: Lower latency and less load on your backend.&lt;/p&gt;




&lt;h3&gt;
  
  
  🔍 5. Core Web Vitals &amp;amp; SEO Wins
&lt;/h3&gt;

&lt;p&gt;Google cares about speed. The faster your LCP and FCP scores, the higher your chances of ranking well. If edge logic helps you render meaningful content faster, it’s a straight-up SEO boost.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Result&lt;/strong&gt;: Better UX &lt;strong&gt;and&lt;/strong&gt; better discoverability.&lt;/p&gt;




&lt;h2&gt;
  
  
  🛠️ Real-World Use Case (Vercel Example)
&lt;/h2&gt;

&lt;p&gt;Here’s an edge function that fetches geo-specific product data based on the visitor’s country:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// /pages/api/edge-products.ts&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;runtime&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;edge&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&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;region&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;x-vercel-ip-country&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="s1"&gt;US&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`https://api.myshop.com/products?region=&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="s2"&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;products&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;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Response&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;products&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;headers&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;Content-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;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This executes close to the user, personalizes data, and avoids a second trip from the client. It’s simple, powerful, and fast.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚠️ Edge Functions Aren’t a Free Lunch
&lt;/h2&gt;

&lt;p&gt;A few things to be aware of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cold Starts&lt;/strong&gt; still happen (though less often)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No full Node.js environment&lt;/strong&gt; (no native &lt;code&gt;fs&lt;/code&gt;, &lt;code&gt;path&lt;/code&gt;, etc.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Debugging&lt;/strong&gt; is a bit trickier than traditional serverless&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So yeah, plan wisely. But if you care about global scale and frontend performance — edge is worth it.&lt;/p&gt;




&lt;h2&gt;
  
  
  📈 Final Thoughts: The Edge Is the Future
&lt;/h2&gt;

&lt;p&gt;Edge functions are more than just a backend tool — they’re a &lt;strong&gt;frontend performance multiplier&lt;/strong&gt;. They let us rethink how we build, render, and serve content to users across the globe.&lt;/p&gt;

&lt;p&gt;If you’re serious about optimizing LCP, slashing TTFB, and building experiences that feel instant, edge functions are a must in your stack.&lt;/p&gt;




&lt;h3&gt;
  
  
  🔗 Want to Learn More?
&lt;/h3&gt;

&lt;p&gt;If you enjoyed this breakdown, follow me for more frontend deep dives, real-world React tips, and performance engineering strategies.&lt;/p&gt;

&lt;p&gt;Let’s keep pushing the web forward. ⚡&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>serverless</category>
      <category>frontend</category>
      <category>nextjs</category>
    </item>
    <item>
      <title>🚀 Web Performance Metrics: How to Improve FCP, LCP, and CLS</title>
      <dc:creator>Nilupul Perera</dc:creator>
      <pubDate>Mon, 19 May 2025 05:00:00 +0000</pubDate>
      <link>https://dev.to/hasunnilupul/web-performance-metrics-how-to-improve-fcp-lcp-and-cls-395e</link>
      <guid>https://dev.to/hasunnilupul/web-performance-metrics-how-to-improve-fcp-lcp-and-cls-395e</guid>
      <description>&lt;p&gt;You could have the most beautiful UI ever built… but if it takes 6 seconds to show up, no one cares. Web performance isn't just a tech concern — it's a user experience killer and a conversion buster.&lt;/p&gt;

&lt;p&gt;Let’s break down the three &lt;strong&gt;Core Web Vitals&lt;/strong&gt; that actually &lt;em&gt;matter&lt;/em&gt; — &lt;strong&gt;FCP (First Contentful Paint)&lt;/strong&gt;, &lt;strong&gt;LCP (Largest Contentful Paint)&lt;/strong&gt;, and &lt;strong&gt;CLS (Cumulative Layout Shift)&lt;/strong&gt; — and how to &lt;em&gt;actually&lt;/em&gt; improve them like a pro.&lt;/p&gt;




&lt;h3&gt;
  
  
  🕓 1. First Contentful Paint (FCP)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it measures:&lt;/strong&gt; Time from page load to when &lt;strong&gt;first visible content&lt;/strong&gt; renders.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; It tells users &lt;em&gt;something is happening&lt;/em&gt;. A fast FCP makes your app &lt;em&gt;feel&lt;/em&gt; snappy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to improve it:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Use a minimal critical CSS strategy.&lt;/li&gt;
&lt;li&gt;✅ Lazy-load fonts — use &lt;code&gt;font-display: swap&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;✅ Prioritize above-the-fold content.&lt;/li&gt;
&lt;li&gt;✅ Eliminate render-blocking resources (like giant stylesheets and unused JS).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;🔥 Pro tip:&lt;/strong&gt; Inline the CSS needed to render the first screen and defer the rest.&lt;/p&gt;




&lt;h3&gt;
  
  
  📸 2. Largest Contentful Paint (LCP)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it measures:&lt;/strong&gt; Render time of the &lt;strong&gt;largest visible element&lt;/strong&gt; (image, video, or text block) in the viewport.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; It reflects &lt;strong&gt;perceived load speed&lt;/strong&gt;. This is what users &lt;em&gt;actually&lt;/em&gt; see and wait for.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to improve it:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🖼️ Optimize and compress hero images (use &lt;code&gt;next-gen&lt;/code&gt; formats like WebP or AVIF).&lt;/li&gt;
&lt;li&gt;⚡ Serve static assets via a CDN.&lt;/li&gt;
&lt;li&gt;🎯 Preload critical assets (like hero images or large headings).&lt;/li&gt;
&lt;li&gt;⏬ Remove unnecessary third-party scripts — they’re often LCP killers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Target:&lt;/strong&gt; Keep LCP &amp;lt; &lt;strong&gt;2.5s&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  📦 3. Cumulative Layout Shift (CLS)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What it measures:&lt;/strong&gt; Visual stability. Ever clicked the wrong button because content jumped? Yeah, that’s CLS.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; Poor CLS kills user trust — and makes you look like an amateur.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to improve it:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🧷 Always set explicit &lt;code&gt;width&lt;/code&gt; and &lt;code&gt;height&lt;/code&gt; for images and media.&lt;/li&gt;
&lt;li&gt;🛑 Don’t inject content above existing content &lt;em&gt;without&lt;/em&gt; reserving space.&lt;/li&gt;
&lt;li&gt;🧼 Avoid font swaps that cause shifts (use &lt;code&gt;font-display: optional&lt;/code&gt; or preload fonts).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Target:&lt;/strong&gt; CLS score &amp;lt; &lt;strong&gt;0.1&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  🧪 Tools to Monitor and Fix
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lighthouse (in DevTools)&lt;/strong&gt; — Instant audits&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WebPageTest.org&lt;/strong&gt; — Deep analysis&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PageSpeed Insights&lt;/strong&gt; — Real-world + lab data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chrome User Experience Report (CrUX)&lt;/strong&gt; — Real user metrics&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  📈 Bonus: The Domino Effect of Optimization
&lt;/h3&gt;

&lt;p&gt;When you improve FCP and LCP, &lt;em&gt;SEO rankings&lt;/em&gt; and &lt;em&gt;user retention&lt;/em&gt; spike. Google rewards fast experiences. Users stick around longer. And your bounce rate? 👋&lt;/p&gt;




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

&lt;p&gt;Web performance isn’t just for backend folks or DevOps nerds. As a frontend dev, it’s &lt;strong&gt;your job&lt;/strong&gt; to deliver fast, stable, sexy apps.&lt;/p&gt;

&lt;p&gt;If your users are waiting, they’re leaving. If your UI jumps around, they’re annoyed. Mastering FCP, LCP, and CLS isn't optional — it's &lt;strong&gt;the standard&lt;/strong&gt; now.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>performance</category>
    </item>
    <item>
      <title>Exploring the Latest JavaScript Features in ESNext</title>
      <dc:creator>Nilupul Perera</dc:creator>
      <pubDate>Fri, 16 May 2025 05:00:00 +0000</pubDate>
      <link>https://dev.to/hasunnilupul/exploring-the-latest-javascript-features-in-esnext-2a8g</link>
      <guid>https://dev.to/hasunnilupul/exploring-the-latest-javascript-features-in-esnext-2a8g</guid>
      <description>&lt;p&gt;JavaScript is evolving faster than your npm dependencies can break. ESNext refers to the bleeding-edge features currently proposed or recently added to the ECMAScript spec — and if you're not keeping up, you're falling behind.&lt;/p&gt;

&lt;p&gt;In this article, we’ll break down some of the most &lt;strong&gt;exciting new features&lt;/strong&gt; landing in modern JavaScript that are already usable in most major runtimes or via transpilers like Babel or TypeScript.&lt;/p&gt;




&lt;h3&gt;
  
  
  🚀 1. &lt;code&gt;await&lt;/code&gt; Outside of Async Functions (Top-Level Await)
&lt;/h3&gt;

&lt;p&gt;Previously, &lt;code&gt;await&lt;/code&gt; could only live inside &lt;code&gt;async&lt;/code&gt; functions. That’s history now.&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;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&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/data&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&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;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Top-level await allows cleaner module code, especially for scripts with dynamic imports or data loading. It’s a game-changer for modular design.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ Works only in ES Modules (not CommonJS)&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  ✨ 2. &lt;code&gt;?.&lt;/code&gt; Optional Chaining
&lt;/h3&gt;

&lt;p&gt;Gone are the days of &lt;code&gt;foo &amp;amp;&amp;amp; foo.bar &amp;amp;&amp;amp; foo.bar.baz&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;userName&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;profile&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This reads clean, protects from &lt;code&gt;undefined&lt;/code&gt; errors, and doesn’t feel like you’re writing defensive code all day long.&lt;/p&gt;




&lt;h3&gt;
  
  
  💬 3. &lt;code&gt;??&lt;/code&gt; Nullish Coalescing Operator
&lt;/h3&gt;

&lt;p&gt;Forget &lt;code&gt;||&lt;/code&gt; for fallbacks—it’s not always safe.&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;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;input&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;default&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 only falls back if &lt;code&gt;input&lt;/code&gt; is &lt;code&gt;null&lt;/code&gt; or &lt;code&gt;undefined&lt;/code&gt;, &lt;strong&gt;not&lt;/strong&gt; if it’s &lt;code&gt;0&lt;/code&gt;, &lt;code&gt;''&lt;/code&gt;, or &lt;code&gt;false&lt;/code&gt;. More precise and less surprising.&lt;/p&gt;




&lt;h3&gt;
  
  
  📦 4. &lt;code&gt;import.meta&lt;/code&gt; and Dynamic Importing
&lt;/h3&gt;

&lt;p&gt;You now get access to meta-info about your module.&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="k"&gt;import&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;url&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Also, dynamic imports let you split bundles smartly:&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="nx"&gt;condition&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;heavyStuff&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./heavy-module.js&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This makes lazy loading and conditional loading native-level smooth.&lt;/p&gt;




&lt;h3&gt;
  
  
  🧪 5. Record &amp;amp; Tuple (Stage 2/3)
&lt;/h3&gt;

&lt;p&gt;Coming soon: &lt;strong&gt;immutable, deeply comparable&lt;/strong&gt; data structures.&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;record&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&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;Nilupul&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;30&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;tuple&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="err"&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="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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These aren't regular objects/arrays — they’re deeply frozen, and comparison is value-based.&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="err"&gt;#&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;x&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="o"&gt;===&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;x&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="c1"&gt;// true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚠️ Not widely supported &lt;em&gt;yet&lt;/em&gt;, but worth keeping on your radar.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  🧵 6. Pattern Matching (Stage 3)
&lt;/h3&gt;

&lt;p&gt;Forget switch-case spaghetti. Match with style.&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;match &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;when &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="s2"&gt;admin&lt;/span&gt;&lt;span class="dl"&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="nf"&gt;doAdminThing&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
  &lt;span class="nf"&gt;when &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="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&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="nf"&gt;doUserThing&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
  &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;handleDefault&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;It’s like destructuring and switch had a baby — and it’s glorious for cleaner, declarative control flows.&lt;/p&gt;




&lt;h3&gt;
  
  
  📏 7. Ergonomic Brand Checks for Private Fields
&lt;/h3&gt;

&lt;p&gt;Private fields now have a cleaner existence check:&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="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;secret&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="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;secret&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nx"&gt;obj&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="s2"&gt;Private field exists!&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Goodbye verbose workarounds, hello native ergonomics.&lt;/p&gt;




&lt;h3&gt;
  
  
  🔥 Final Thoughts
&lt;/h3&gt;

&lt;p&gt;JavaScript isn’t just “the language of the web” anymore — it’s morphing into a &lt;strong&gt;modern, expressive, and powerful tool&lt;/strong&gt; that stands tall with the big leagues.&lt;/p&gt;

&lt;p&gt;If you’re building apps today, you &lt;em&gt;need&lt;/em&gt; to be fluent in tomorrow’s syntax. Start experimenting now — these features aren’t just sugar; they change how we architect everything from UIs to APIs.&lt;/p&gt;

&lt;p&gt;Stay sharp. Stay modern.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Best Practices for Handling Side Effects in React</title>
      <dc:creator>Nilupul Perera</dc:creator>
      <pubDate>Wed, 14 May 2025 05:00:00 +0000</pubDate>
      <link>https://dev.to/hasunnilupul/best-practices-for-handling-side-effects-in-react-4fk4</link>
      <guid>https://dev.to/hasunnilupul/best-practices-for-handling-side-effects-in-react-4fk4</guid>
      <description>&lt;p&gt;When working with React, handling side effects &lt;strong&gt;correctly&lt;/strong&gt; can make or break your component’s performance, readability, and predictability. Side effects—like data fetching, subscriptions, or DOM manipulations—shouldn’t be sprinkled all over your codebase like confetti.&lt;/p&gt;

&lt;p&gt;Here’s a deep dive into the best practices every serious React dev should follow when dealing with side effects.&lt;/p&gt;




&lt;h3&gt;
  
  
  ⚠️ First, What &lt;em&gt;Are&lt;/em&gt; Side Effects in React?
&lt;/h3&gt;

&lt;p&gt;Side effects are operations that affect something outside the scope of the current function being executed. In React, they can include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fetching data from APIs&lt;/li&gt;
&lt;li&gt;Manually modifying the DOM&lt;/li&gt;
&lt;li&gt;Subscribing to WebSocket or event listeners&lt;/li&gt;
&lt;li&gt;Setting timeouts or intervals&lt;/li&gt;
&lt;li&gt;Logging or analytics tracking&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are not part of the component’s render output and must be handled &lt;em&gt;outside&lt;/em&gt; the render phase.&lt;/p&gt;




&lt;h3&gt;
  
  
  ✅ 1. Use &lt;code&gt;useEffect&lt;/code&gt; for Declarative Side Effects
&lt;/h3&gt;

&lt;p&gt;React's &lt;code&gt;useEffect&lt;/code&gt; hook is the official home for most side effects in functional components.&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;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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fetchData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&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/data&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&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;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nf"&gt;setData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="nf"&gt;fetchData&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;Best practice:&lt;/strong&gt;&lt;br&gt;
Use the dependency array correctly. It should contain &lt;strong&gt;everything&lt;/strong&gt; your effect depends on.&lt;/p&gt;


&lt;h3&gt;
  
  
  ✅ 2. Separate Concerns — Don't Cram Everything Into One Effect
&lt;/h3&gt;

&lt;p&gt;Avoid the “God effect” trap where one &lt;code&gt;useEffect&lt;/code&gt; tries to do it all. Split effects by purpose: data fetching, subscriptions, cleanup logic, etc.&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;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="c1"&gt;// Handles window resize&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleResize&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="nf"&gt;setWidth&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;innerWidth&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="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;resize&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;handleResize&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;removeEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;resize&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;handleResize&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="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="c1"&gt;// Fetch data separately&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  ✅ 3. Always Clean Up Subscriptions and Timeouts
&lt;/h3&gt;

&lt;p&gt;If you don’t clean up, you’ll leak memory and trigger bugs during unmounting or re-renders.&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;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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;timer&lt;/span&gt; &lt;span class="o"&gt;=&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="s2"&gt;Delayed log&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;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;clearTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;timer&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  ✅ 4. Avoid Side Effects During Rendering
&lt;/h3&gt;

&lt;p&gt;Never call &lt;code&gt;fetch()&lt;/code&gt;, &lt;code&gt;setTimeout()&lt;/code&gt;, or manipulate the DOM directly during render.&lt;/p&gt;

&lt;p&gt;🚫 Bad:&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;MyComponent&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="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/data&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// NOPE&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;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Hello&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;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ Good:&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;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;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/data&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  ✅ 5. Use Custom Hooks to Encapsulate Reusable Side Effects
&lt;/h3&gt;

&lt;p&gt;If you're repeating effect logic, it’s time to extract it into a custom hook.&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;function&lt;/span&gt; &lt;span class="nf"&gt;useWindowWidth&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;width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setWidth&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="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerWidth&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleResize&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="nf"&gt;setWidth&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;innerWidth&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="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;resize&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;handleResize&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;removeEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;resize&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;handleResize&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="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;width&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 use it like:&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;width&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useWindowWidth&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  ✅ 6. Be Mindful of Async Functions in &lt;code&gt;useEffect&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;You can't pass an async function directly to &lt;code&gt;useEffect&lt;/code&gt;. Instead, define an async function &lt;strong&gt;inside&lt;/strong&gt; it and call it.&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;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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;loadData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &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;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;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&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/data&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;json&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;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="nf"&gt;setData&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="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="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="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="p"&gt;};&lt;/span&gt;

  &lt;span class="nf"&gt;loadData&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  ✅ 7. Don’t Use Effects for State Derivation
&lt;/h3&gt;

&lt;p&gt;If your state can be &lt;strong&gt;derived&lt;/strong&gt; from props or other state, do it in the render—not with side effects.&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="c1"&gt;// ✅ Good&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;derivedState&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;someValue&lt;/span&gt; &lt;span class="o"&gt;&amp;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;// 🚫 Bad&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;setDerivedState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;someValue&lt;/span&gt; &lt;span class="o"&gt;&amp;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;someValue&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






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

&lt;p&gt;Side effects are where bugs love to hide. Clean, scoped, and well-structured effects make your code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Easier to debug&lt;/li&gt;
&lt;li&gt;Easier to test&lt;/li&gt;
&lt;li&gt;More predictable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And in the React world, &lt;strong&gt;predictability is power&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>react</category>
      <category>reactjsdevelopment</category>
    </item>
    <item>
      <title>Strategies for Handling Large-Scale Frontend Applications</title>
      <dc:creator>Nilupul Perera</dc:creator>
      <pubDate>Fri, 09 May 2025 10:00:00 +0000</pubDate>
      <link>https://dev.to/hasunnilupul/strategies-for-handling-large-scale-frontend-applications-5ffl</link>
      <guid>https://dev.to/hasunnilupul/strategies-for-handling-large-scale-frontend-applications-5ffl</guid>
      <description>&lt;p&gt;As frontend projects grow, maintaining scalability, performance, and team efficiency becomes increasingly difficult. Large-scale frontend applications, like those seen in enterprise or SaaS platforms, demand thoughtful architecture, robust tooling, and clear conventions.&lt;/p&gt;

&lt;p&gt;Here are &lt;strong&gt;battle-tested strategies&lt;/strong&gt; to ensure your large frontend codebase remains sustainable and efficient:&lt;/p&gt;




&lt;h3&gt;
  
  
  📐 1. Establish a Scalable Project Architecture
&lt;/h3&gt;

&lt;p&gt;A clear folder structure and separation of concerns can drastically improve maintainability.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;src/
├── components/
├── features/
├── pages/
├── hooks/
├── services/
├── utils/
├── state/
├── config/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Organize code by &lt;strong&gt;domain (feature-based)&lt;/strong&gt; rather than type. This encourages encapsulation and modularity.&lt;/p&gt;




&lt;h3&gt;
  
  
  🧩 2. Embrace Component Reusability
&lt;/h3&gt;

&lt;p&gt;Build atomic, &lt;strong&gt;reusable UI components&lt;/strong&gt;. Tools like &lt;strong&gt;Storybook&lt;/strong&gt; help document and visualize components in isolation.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;✅ Pro Tip: Create a design system or UI library early to promote consistency.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  🧠 3. Use Modern State Management Techniques
&lt;/h3&gt;

&lt;p&gt;Avoid overusing global state. Use &lt;strong&gt;local state&lt;/strong&gt; (e.g., via &lt;code&gt;useState&lt;/code&gt;, &lt;code&gt;useReducer&lt;/code&gt;) when possible, and &lt;strong&gt;React Context&lt;/strong&gt;, &lt;strong&gt;Zustand&lt;/strong&gt;, &lt;strong&gt;Jotai&lt;/strong&gt;, or &lt;strong&gt;Redux Toolkit&lt;/strong&gt; for cross-cutting concerns.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Consider splitting global state into slices by feature to prevent tight coupling.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  ⚙️ 4. Code Splitting &amp;amp; Lazy Loading
&lt;/h3&gt;

&lt;p&gt;Don’t ship your entire app upfront.&lt;/p&gt;

&lt;p&gt;Use:&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;Settings&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;lazy&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./pages/Settings&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 wrap in:&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;Loader&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;Settings&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;This reduces initial load time significantly.&lt;/p&gt;




&lt;h3&gt;
  
  
  📦 5. Modularize Features Using Micro-Frontends (When Needed)
&lt;/h3&gt;

&lt;p&gt;Micro-frontends are ideal when teams work on independent verticals or using different tech stacks.&lt;/p&gt;

&lt;p&gt;Use &lt;strong&gt;Module Federation&lt;/strong&gt; (Webpack 5) or tools like &lt;strong&gt;Single-SPA&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ Be cautious—micro-frontends add complexity. Only use them when necessary.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  🧪 6. Enforce Strong Testing Practices
&lt;/h3&gt;

&lt;p&gt;Maintain high confidence with tests at all levels:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Unit&lt;/strong&gt; (e.g., Jest)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integration&lt;/strong&gt; (e.g., React Testing Library)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;E2E&lt;/strong&gt; (e.g., Cypress)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Automate tests via CI/CD pipelines.&lt;/p&gt;




&lt;h3&gt;
  
  
  🛠️ 7. Automate with Dev Tools and Linters
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ESLint&lt;/strong&gt; and &lt;strong&gt;Prettier&lt;/strong&gt; for code consistency&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TypeScript&lt;/strong&gt; for static type safety&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Husky&lt;/strong&gt; and &lt;strong&gt;lint-staged&lt;/strong&gt; for enforcing rules before commits&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🌍 8. Internationalization (i18n)
&lt;/h3&gt;

&lt;p&gt;Use libraries like &lt;code&gt;react-i18next&lt;/code&gt; or &lt;code&gt;FormatJS&lt;/code&gt; to support multilingual experiences, especially if the app has a global audience.&lt;/p&gt;




&lt;h3&gt;
  
  
  🧱 9. Adopt Monorepos with Tools Like Turborepo or Nx
&lt;/h3&gt;

&lt;p&gt;Great for managing multiple packages (like shared components, utilities) in one codebase.&lt;/p&gt;

&lt;p&gt;It helps with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dependency versioning&lt;/li&gt;
&lt;li&gt;Code reuse&lt;/li&gt;
&lt;li&gt;Scalable builds with caching&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  📊 10. Monitor and Optimize Performance
&lt;/h3&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;React Profiler&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Chrome DevTools&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lighthouse&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Web Vitals&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Keep an eye on &lt;strong&gt;bundle size&lt;/strong&gt;, &lt;strong&gt;unused dependencies&lt;/strong&gt;, and &lt;strong&gt;expensive re-renders&lt;/strong&gt;.&lt;/p&gt;




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

&lt;p&gt;Scaling a frontend application isn’t just about adding more code—it’s about managing complexity, enabling developer efficiency, and ensuring long-term maintainability. Start with clean abstractions, modular architecture, and strong tooling, and you'll be well-equipped to build robust large-scale systems.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>react</category>
      <category>frontend</category>
    </item>
    <item>
      <title>The Evolution of React State Management</title>
      <dc:creator>Nilupul Perera</dc:creator>
      <pubDate>Thu, 08 May 2025 07:50:33 +0000</pubDate>
      <link>https://dev.to/hasunnilupul/the-evolution-of-react-state-management-3e9d</link>
      <guid>https://dev.to/hasunnilupul/the-evolution-of-react-state-management-3e9d</guid>
      <description>&lt;p&gt;When React was first released, managing state was relatively simple—mostly handled within components using &lt;code&gt;this.state&lt;/code&gt; and &lt;code&gt;setState&lt;/code&gt;. As applications scaled, so did the complexity of managing state. This has led to a rich ecosystem of tools and approaches to solve state management challenges effectively.&lt;/p&gt;

&lt;p&gt;Let’s walk through the evolution of React state management and when to use each approach.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;1. &lt;code&gt;useState&lt;/code&gt;: The Starting Point&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;React Hooks introduced in version 16.8 changed everything.&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;count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setCount&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="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use &lt;code&gt;useState&lt;/code&gt; when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You have &lt;strong&gt;local component state&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;The state logic is &lt;strong&gt;simple&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;No need to share the state across components.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;2. &lt;code&gt;useReducer&lt;/code&gt;: For Complex Logic&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;For state with &lt;strong&gt;complex transitions&lt;/strong&gt; (like toggling, incrementing, or managing arrays), &lt;code&gt;useReducer&lt;/code&gt; can be more predictable.&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;reducer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;action&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;switch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;action&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="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;increment&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;{&lt;/span&gt; &lt;span class="na"&gt;count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="nl"&gt;default&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;state&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="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useReducer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;reducer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;count&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use &lt;code&gt;useReducer&lt;/code&gt; when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The state logic is &lt;strong&gt;complex or nested&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;You want to &lt;strong&gt;mimic Redux-style reducers&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;3. Context API: For Global Sharing&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;React’s Context API helps &lt;strong&gt;pass state deeply&lt;/strong&gt; without prop drilling.&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;ThemeContext&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;createContext&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;App&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ThemeContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Provider&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"dark"&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;Header&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;ThemeContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Provider&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;Use Context when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You want to &lt;strong&gt;share simple global data&lt;/strong&gt; (like theme or language).&lt;/li&gt;
&lt;li&gt;It’s &lt;strong&gt;read-heavy&lt;/strong&gt;, not write-heavy.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt; Don’t overuse Context for high-frequency updates—it can cause unnecessary re-renders.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;4. Redux: The Enterprise Choice&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Redux introduced a &lt;strong&gt;unidirectional data flow&lt;/strong&gt;, perfect for large-scale apps.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;You need a &lt;strong&gt;single source of truth&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;You want &lt;strong&gt;middleware support&lt;/strong&gt; (e.g., for logging or side effects).&lt;/li&gt;
&lt;li&gt;You’re building &lt;strong&gt;enterprise-level applications&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With Redux Toolkit, the setup is now easier than ever:&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;counterSlice&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createSlice&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;counter&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;initialState&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="na"&gt;reducers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;state&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;state&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  &lt;strong&gt;5. Recoil, Zustand, Jotai: The New Wave&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Modern state libraries offer lightweight alternatives:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zustand&lt;/strong&gt;: Minimal API, intuitive global state.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Jotai&lt;/strong&gt;: Atom-based primitives with first-class TypeScript support.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recoil&lt;/strong&gt;: Atom + selector architecture for fine-grained updates.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Zustand example:&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;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;create&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;zustand&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;useStore&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="kd"&gt;set&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="na"&gt;count&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="na"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;state&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="na"&gt;count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;})),&lt;/span&gt;
&lt;span class="p"&gt;}));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;You want a &lt;strong&gt;simpler and scalable global store&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Redux feels like overkill for your project.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;6. Server/URL-Based State: Don't Forget&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Not all state belongs in React:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Server State&lt;/strong&gt;: Use tools like React Query or SWR for data fetching.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;URL State&lt;/strong&gt;: Routing libraries like React Router manage state via URLs.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Conclusion: Choose the Right Tool&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;React's ecosystem provides &lt;strong&gt;a toolkit, not a one-size-fits-all&lt;/strong&gt;. Here’s a quick decision tree:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Local and simple? → &lt;code&gt;useState&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Complex transitions? → &lt;code&gt;useReducer&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Share globally? → Context / Zustand / Redux&lt;/li&gt;
&lt;li&gt;Async data? → React Query&lt;/li&gt;
&lt;li&gt;Heavy logic with debugging needs? → Redux Toolkit&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As React apps grow, choosing the right state management strategy is critical to &lt;strong&gt;maintainability, performance, and scalability&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>react</category>
      <category>redux</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Modern Authentication Methods OAuth, JWT, and Beyond</title>
      <dc:creator>Nilupul Perera</dc:creator>
      <pubDate>Mon, 05 May 2025 05:00:00 +0000</pubDate>
      <link>https://dev.to/hasunnilupul/modern-authentication-methods-oauth-jwt-and-beyond-29fo</link>
      <guid>https://dev.to/hasunnilupul/modern-authentication-methods-oauth-jwt-and-beyond-29fo</guid>
      <description>&lt;p&gt;Authentication is at the heart of every secure web application. As frontend developers, understanding modern authentication flows and how to implement them securely is crucial. This article explores the most widely used authentication methods today: &lt;strong&gt;OAuth 2.0&lt;/strong&gt;, &lt;strong&gt;JWT (JSON Web Tokens)&lt;/strong&gt;, and &lt;strong&gt;OpenID Connect&lt;/strong&gt;, and introduces some &lt;strong&gt;emerging approaches&lt;/strong&gt;.&lt;/p&gt;




&lt;h4&gt;
  
  
  🔐 Why Authentication Matters
&lt;/h4&gt;

&lt;p&gt;Authentication determines &lt;strong&gt;who the user is&lt;/strong&gt;, and authorization determines &lt;strong&gt;what they can access&lt;/strong&gt;. An insecure authentication mechanism can expose your app to session hijacking, data leaks, and impersonation attacks.&lt;/p&gt;

&lt;p&gt;Modern SPAs (Single Page Applications) demand decoupled and secure authentication techniques that work well across multiple clients, including web, mobile, and APIs.&lt;/p&gt;




&lt;h3&gt;
  
  
  🚪 1. OAuth 2.0 — The Industry Standard
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;OAuth 2.0&lt;/strong&gt; is an authorization framework, not an authentication protocol by itself. It allows third-party apps to access user data &lt;strong&gt;without sharing credentials&lt;/strong&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  How It Works:
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;User is redirected to the authorization server.&lt;/li&gt;
&lt;li&gt;They grant access to the app.&lt;/li&gt;
&lt;li&gt;The app receives an authorization code/token.&lt;/li&gt;
&lt;li&gt;It exchanges it for an access token to access resources.&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Common Use Case:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;"Login with Google" or "Login with GitHub" buttons.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Example:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Redirect user to OAuth authorization endpoint&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="nx"&gt;href&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`https://accounts.google.com/o/oauth2/v2/auth?
  client_id=YOUR_CLIENT_ID
  &amp;amp;redirect_uri=http://localhost:3000/callback
  &amp;amp;response_type=code
  &amp;amp;scope=email profile`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  🧾 2. JWT (JSON Web Tokens)
&lt;/h3&gt;

&lt;p&gt;JWTs are a compact, URL-safe way to represent claims between two parties.&lt;/p&gt;

&lt;h4&gt;
  
  
  Structure:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;header.payload.signature
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Use Cases:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;User session handling in SPAs&lt;/li&gt;
&lt;li&gt;Stateless authentication with APIs&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Example (React + Express):
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;React (Login):&lt;/strong&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="nx"&gt;localStorage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;token&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;response&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;token&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;Express (Verify Token):&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;jwt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;jsonwebtoken&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;authorization&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt; &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="nx"&gt;jwt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;verify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;token&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;JWT_SECRET&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚠️ JWTs are &lt;strong&gt;not encrypted&lt;/strong&gt;, only &lt;strong&gt;encoded&lt;/strong&gt;. Don't store sensitive data in them!&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  🧠 3. OpenID Connect (OIDC)
&lt;/h3&gt;

&lt;p&gt;OpenID Connect is a layer built on top of OAuth 2.0. It adds &lt;strong&gt;authentication&lt;/strong&gt; to OAuth's authorization.&lt;/p&gt;

&lt;p&gt;It returns an &lt;strong&gt;ID token&lt;/strong&gt;, which contains user identity information (usually a JWT).&lt;/p&gt;

&lt;h4&gt;
  
  
  Use Case:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;"Sign in with Google" that gives you both the user's identity and access token for APIs.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🧬 4. Beyond: WebAuthn and Passkeys
&lt;/h3&gt;

&lt;p&gt;The future of authentication is passwordless. &lt;strong&gt;WebAuthn&lt;/strong&gt; and &lt;strong&gt;Passkeys&lt;/strong&gt; aim to replace traditional credentials with biometrics or device-based authentication.&lt;/p&gt;

&lt;h4&gt;
  
  
  Example:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Face ID login on websites.&lt;/li&gt;
&lt;li&gt;FIDO2 hardware keys.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These methods offer &lt;strong&gt;stronger phishing protection&lt;/strong&gt; and better UX.&lt;/p&gt;




&lt;h3&gt;
  
  
  🛡️ Best Practices for Secure Authentication
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Always use &lt;strong&gt;HTTPS&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Store tokens in &lt;strong&gt;httpOnly&lt;/strong&gt; cookies or use refresh token rotation&lt;/li&gt;
&lt;li&gt;Set token expiration policies&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;PKCE&lt;/strong&gt; for public clients (SPAs)&lt;/li&gt;
&lt;li&gt;Never store tokens in &lt;code&gt;localStorage&lt;/code&gt; without additional safeguards&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  ⚖️ Choosing the Right Method
&lt;/h3&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;Best For&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;OAuth 2.0&lt;/td&gt;
&lt;td&gt;Third-party logins, API access&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JWT&lt;/td&gt;
&lt;td&gt;Stateless auth, scalable backend systems&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OIDC&lt;/td&gt;
&lt;td&gt;Identity + Authorization&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WebAuthn&lt;/td&gt;
&lt;td&gt;Passwordless, high-security applications&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  ✅ Conclusion
&lt;/h3&gt;

&lt;p&gt;Modern authentication has evolved far beyond simple username/password forms. Understanding tools like OAuth, JWT, and OpenID Connect, along with new methods like WebAuthn, allows you to build secure and user-friendly authentication flows.&lt;/p&gt;

&lt;p&gt;The next time you're architecting an authentication system, choose a method that balances &lt;strong&gt;security&lt;/strong&gt;, &lt;strong&gt;user experience&lt;/strong&gt;, and &lt;strong&gt;scalability&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>oauth</category>
      <category>programming</category>
    </item>
    <item>
      <title>🧠 The Power of Web Workers for Frontend Performance</title>
      <dc:creator>Nilupul Perera</dc:creator>
      <pubDate>Fri, 02 May 2025 05:00:00 +0000</pubDate>
      <link>https://dev.to/hasunnilupul/the-power-of-web-workers-for-frontend-performance-1h6i</link>
      <guid>https://dev.to/hasunnilupul/the-power-of-web-workers-for-frontend-performance-1h6i</guid>
      <description>&lt;p&gt;As modern web applications become more complex, performance bottlenecks in the main thread can severely impact user experience. One powerful, underutilized tool to mitigate this is the &lt;strong&gt;Web Worker API&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Web Workers allow you to offload expensive JavaScript operations to a background thread, keeping the UI thread free for user interactions. Let's break it down:&lt;/p&gt;




&lt;h3&gt;
  
  
  🔍 What Are Web Workers?
&lt;/h3&gt;

&lt;p&gt;Web Workers are JavaScript scripts that run in the background, independent of other scripts, without blocking the main thread.&lt;/p&gt;

&lt;p&gt;This makes them ideal for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Heavy computations (e.g., parsing large JSON files)&lt;/li&gt;
&lt;li&gt;Data processing (e.g., image manipulation)&lt;/li&gt;
&lt;li&gt;Real-time tasks (e.g., WebSocket handling, polling)&lt;/li&gt;
&lt;li&gt;Working with IndexedDB or other async APIs&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🧪 When Should You Use Them?
&lt;/h3&gt;

&lt;p&gt;Use Web Workers when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your app has noticeable UI jank due to CPU-heavy operations.&lt;/li&gt;
&lt;li&gt;You need to keep animations, scrolling, or inputs smooth.&lt;/li&gt;
&lt;li&gt;You're dealing with data processing, such as analytics or parsing.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;❗ Avoid using them for tasks that rely on DOM access — Web Workers don’t have access to the DOM.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  ✍️ Example: Creating a Basic Web Worker
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. &lt;code&gt;worker.js&lt;/code&gt;&lt;/strong&gt; (background thread logic):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// worker.js&lt;/span&gt;
&lt;span class="nb"&gt;self&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="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&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;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;heavyComputation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&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="nb"&gt;self&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="nx"&gt;result&lt;/span&gt;&lt;span class="p"&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;heavyComputation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Simulate CPU-intensive task&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&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;iterations&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&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;sum&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sqrt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&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="nx"&gt;sum&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;2. Main thread file (e.g., &lt;code&gt;app.js&lt;/code&gt;)&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;worker&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;Worker&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;worker.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;worker&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;iterations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1000000&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;worker&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="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&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;Result from worker:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;e&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;h3&gt;
  
  
  ⚛️ Web Workers in React
&lt;/h3&gt;

&lt;p&gt;React doesn't directly integrate with Web Workers, but you can create hooks or context wrappers to communicate with them:&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="c1"&gt;// useWorker.ts&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useRef&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;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;useWorker&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;workerScript&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&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;workerRef&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useRef&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Worker&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&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="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="nx"&gt;workerRef&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;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Worker&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;workerScript&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;workerRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nf"&gt;terminate&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;workerScript&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;postMessage&lt;/span&gt; &lt;span class="o"&gt;=&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="kr"&gt;any&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;workerRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&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="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;postMessage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;worker&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;workerRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&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;Use this hook like:&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;postMessage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;worker&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useWorker&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/worker.js&lt;/span&gt;&lt;span class="dl"&gt;'&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="nx"&gt;worker&lt;/span&gt;&lt;span class="o"&gt;!&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;e&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;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;Worker result:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;e&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="nf"&gt;postMessage&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;iterations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1000000&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  🚀 Best Practices
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;a href="https://github.com/GoogleChromeLabs/comlink" rel="noopener noreferrer"&gt;Comlink&lt;/a&gt; to simplify worker communication.&lt;/li&gt;
&lt;li&gt;Bundle workers using tools like &lt;code&gt;worker-loader&lt;/code&gt; (Webpack) or Vite's native support.&lt;/li&gt;
&lt;li&gt;Minimize communication overhead between the main thread and workers.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🧩 Advanced Use Cases
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Image manipulation&lt;/strong&gt; (e.g., filters, transformations)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI/ML models&lt;/strong&gt; in the browser&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Data compression/decompression&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cryptography and hashing&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🌟 Conclusion
&lt;/h3&gt;

&lt;p&gt;Web Workers are a powerful tool to improve frontend performance by delegating heavy tasks off the main thread. When used appropriately, they result in snappier, more responsive user experiences.&lt;/p&gt;

&lt;p&gt;They may not be needed for every project, but knowing how and when to use them is a great addition to your frontend performance toolbox.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>react</category>
      <category>performance</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
