<?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: Joodi</title>
    <description>The latest articles on DEV Community by Joodi (@joodi).</description>
    <link>https://dev.to/joodi</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%2F1320259%2F2954b0e0-8317-4bda-bad6-846087f55a96.jpg</url>
      <title>DEV Community: Joodi</title>
      <link>https://dev.to/joodi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/joodi"/>
    <language>en</language>
    <item>
      <title>VS Code vs. Cursor vs. Trae: Navigating the AI IDE Landscape in 2025</title>
      <dc:creator>Joodi</dc:creator>
      <pubDate>Fri, 18 Apr 2025 19:36:42 +0000</pubDate>
      <link>https://dev.to/joodi/vs-code-vs-cursor-vs-trae-navigating-the-ai-ide-landscape-in-2025-4e2k</link>
      <guid>https://dev.to/joodi/vs-code-vs-cursor-vs-trae-navigating-the-ai-ide-landscape-in-2025-4e2k</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fslbckz06fa0p6mki071y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fslbckz06fa0p6mki071y.png" alt="Image description" width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;In 2025, the landscape of Integrated Development Environments (IDEs) is rapidly evolving with the integration of Artificial Intelligence (AI). While &lt;strong&gt;Visual Studio Code (VS Code)&lt;/strong&gt; has long been a staple for developers, newcomers like &lt;strong&gt;Cursor&lt;/strong&gt; and &lt;strong&gt;Trae&lt;/strong&gt; are challenging its dominance by offering AI-first experiences. This article delves into how these IDEs compare, especially from a front-end developer's perspective.&lt;/p&gt;

&lt;h2&gt;
  
  
  Visual Studio Code: The Established Powerhouse
&lt;/h2&gt;

&lt;p&gt;VS Code remains a widely adopted, open-source editor known for its extensive extension ecosystem and robust performance.&lt;/p&gt;

&lt;h3&gt;
  
  
  AI Integration
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Copilot&lt;/strong&gt;: Now offers a free tier, providing AI code suggestions and completions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Toolkit Extension&lt;/strong&gt;: Supports OpenAI's o1 model, enhancing prompt engineering and model exploration.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Strengths
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Stability and Performance&lt;/strong&gt;: Handles large projects efficiently.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Customization&lt;/strong&gt;: Vast array of extensions and themes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Limitations
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AI Features&lt;/strong&gt;: Depend on third-party extensions; not as seamlessly integrated as in newer AI-first IDEs.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Cursor: The AI-First Innovator
&lt;/h2&gt;

&lt;p&gt;Built on the foundation of VS Code, Cursor enhances the development experience with deep AI integration.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Integrated AI Assistant&lt;/strong&gt;: Utilizes models like Claude 3.5 Sonnet for context-aware code generation and multi-file refactoring.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Autocomplete Enhancements&lt;/strong&gt;: Offers advanced suggestions, including entire diffs, improving coding efficiency.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Strengths
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Seamless AI Integration&lt;/strong&gt;: AI features are built-in, providing a cohesive experience.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Productivity Boost&lt;/strong&gt;: Streamlines repetitive tasks and code generation.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Limitations
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Performance&lt;/strong&gt;: May experience lag with very large files.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost&lt;/strong&gt;: Pro features require a subscription.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Trae: The Free AI-Powered Challenger
&lt;/h2&gt;

&lt;p&gt;Developed by ByteDance, Trae offers a minimalist, AI-driven coding environment at no cost.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Real-Time AI Assistance&lt;/strong&gt;: Provides intelligent code generation and suggestions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-Platform Support&lt;/strong&gt;: Available on macOS and Windows.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Strengths
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cost-Effective&lt;/strong&gt;: Offers comprehensive AI features for free.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;User-Friendly&lt;/strong&gt;: Simplified interface suitable for quick development tasks.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Limitations
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Maturity&lt;/strong&gt;: Still developing its feature set; may lack some advanced capabilities.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data Privacy&lt;/strong&gt;: Concerns have been raised about its data collection practices.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Comparative Overview
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;VS Code&lt;/th&gt;
&lt;th&gt;Cursor&lt;/th&gt;
&lt;th&gt;Trae&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;AI Integration&lt;/td&gt;
&lt;td&gt;Extension-based (e.g., Copilot)&lt;/td&gt;
&lt;td&gt;Built-in with advanced models&lt;/td&gt;
&lt;td&gt;Built-in, free AI assistance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Performance&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;High (some lag with large files)&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost&lt;/td&gt;
&lt;td&gt;Free (extensions may cost)&lt;/td&gt;
&lt;td&gt;Free tier; Pro features are paid&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Customization&lt;/td&gt;
&lt;td&gt;Extensive&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Platform Support&lt;/td&gt;
&lt;td&gt;Windows, macOS, Linux&lt;/td&gt;
&lt;td&gt;Windows, macOS, Linux&lt;/td&gt;
&lt;td&gt;Windows, macOS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data Privacy&lt;/td&gt;
&lt;td&gt;Established practices&lt;/td&gt;
&lt;td&gt;Transparent&lt;/td&gt;
&lt;td&gt;Some concerns reported&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

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

&lt;p&gt;While VS Code continues to be a reliable and versatile editor, the emergence of AI-first IDEs like Cursor and Trae indicates a shift towards more integrated AI development environments. Cursor offers a robust, AI-enhanced experience suitable for complex projects, albeit at a cost. Trae provides an accessible, free alternative with promising features, though it may not yet match the depth of its competitors. Developers should consider their specific needs, project complexity, and comfort with AI integration when choosing the appropriate IDE.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>vscode</category>
      <category>cursor</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Comparing Cursor and Trae: AI IDEs for Front-End Developers</title>
      <dc:creator>Joodi</dc:creator>
      <pubDate>Fri, 18 Apr 2025 19:11:58 +0000</pubDate>
      <link>https://dev.to/joodi/comparing-cursor-and-trae-ai-ides-for-front-end-developers-1i0n</link>
      <guid>https://dev.to/joodi/comparing-cursor-and-trae-ai-ides-for-front-end-developers-1i0n</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnr7o310zryvibuvpfliu.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnr7o310zryvibuvpfliu.jpg" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;In 2025, AI-powered IDEs are rapidly changing how front-end developers work. Two of the most promising tools in this space are &lt;strong&gt;Cursor&lt;/strong&gt; and &lt;strong&gt;Trae&lt;/strong&gt;. Each brings unique strengths, from AI-assisted coding to streamlined development experiences. In this article, we’ll compare them in detail to help you decide which is the right choice for you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cursor: The AI-Powered IDE Built on VS Code
&lt;/h2&gt;

&lt;h3&gt;
  
  
  General Info
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Base&lt;/strong&gt;: Built on Visual Studio Code&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Models&lt;/strong&gt;: Supports Claude 3.5 Sonnet, GPT-4o, and others&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pricing&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Hobby: Free&lt;/li&gt;
&lt;li&gt;Pro: 20 USD/month&lt;/li&gt;
&lt;li&gt;Business: 40 USD/user/month&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Platforms&lt;/strong&gt;: macOS, Windows, Linux&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Key Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;AI chat that understands your project structure&lt;/li&gt;
&lt;li&gt;Context-aware code generation and editing&lt;/li&gt;
&lt;li&gt;AI-powered multi-file refactors and pull request reviews&lt;/li&gt;
&lt;li&gt;Built-in version control interface&lt;/li&gt;
&lt;li&gt;Seamless GitHub integration&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Pros
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Mature, stable, and widely supported&lt;/li&gt;
&lt;li&gt;Deep AI integration&lt;/li&gt;
&lt;li&gt;Ideal for complex projects&lt;/li&gt;
&lt;li&gt;Review window for selective application of AI changes&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Cons
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Pro plan required for most AI features&lt;/li&gt;
&lt;li&gt;May be overkill for small or personal projects&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Trae: ByteDance’s Lightweight AI IDE
&lt;/h2&gt;

&lt;h3&gt;
  
  
  General Info
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Created by&lt;/strong&gt;: ByteDance (TikTok’s parent company)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Models&lt;/strong&gt;: Claude 3.5&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pricing&lt;/strong&gt;: Free&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Platforms&lt;/strong&gt;: Initially macOS only; Windows support added in 2025&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Key Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Code generation and editing with Claude AI&lt;/li&gt;
&lt;li&gt;Lightweight and minimal interface&lt;/li&gt;
&lt;li&gt;Real-time web previews&lt;/li&gt;
&lt;li&gt;Automatic environment setup for projects&lt;/li&gt;
&lt;li&gt;Convert image mockups to code&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Pros
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;100% free to use&lt;/li&gt;
&lt;li&gt;Quick and easy for bootstrapping projects&lt;/li&gt;
&lt;li&gt;Impressive AI features for a free tool&lt;/li&gt;
&lt;li&gt;Image-to-code feature is innovative&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Cons
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Not as stable or full-featured as Cursor&lt;/li&gt;
&lt;li&gt;Still maturing as a daily-driver IDE&lt;/li&gt;
&lt;li&gt;Less ecosystem support&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Performance
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Cursor&lt;/th&gt;
&lt;th&gt;Trae&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;AI Accuracy&lt;/td&gt;
&lt;td&gt;Excellent&lt;/td&gt;
&lt;td&gt;Good&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Speed&lt;/td&gt;
&lt;td&gt;Fast&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stability&lt;/td&gt;
&lt;td&gt;Very Stable&lt;/td&gt;
&lt;td&gt;Still Improving&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Refactor Support&lt;/td&gt;
&lt;td&gt;Advanced (multi-file)&lt;/td&gt;
&lt;td&gt;Basic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pricing&lt;/td&gt;
&lt;td&gt;Paid (Free tier limited)&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OS Compatibility&lt;/td&gt;
&lt;td&gt;All platforms&lt;/td&gt;
&lt;td&gt;macOS, Windows&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Verdict: Which One Is Better for Front-End Devs?
&lt;/h2&gt;

&lt;p&gt;If you’re a front-end developer working with large codebases and you need precise, context-aware AI tools, &lt;strong&gt;Cursor&lt;/strong&gt; is the better option. Its feature set is polished and built for professional teams.&lt;/p&gt;

&lt;p&gt;On the other hand, if you’re experimenting, learning, or just need a quick AI-powered environment for smaller tasks, &lt;strong&gt;Trae&lt;/strong&gt; offers some amazing capabilities at no cost.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://blog.enginelabs.ai/cursor-ai-an-in-depth-review" rel="noopener noreferrer"&gt;Cursor AI Review — Engine Labs (2025)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.builder.io/blog/cursor-vs-trae" rel="noopener noreferrer"&gt;Trae vs Cursor Comparison — Builder.io&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.hellobala.co/blog/trae-review" rel="noopener noreferrer"&gt;Trae AI IDE Review — HelloBala&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>cursor</category>
      <category>frontend</category>
      <category>ai</category>
      <category>vscode</category>
    </item>
    <item>
      <title>13 Best Tailwind UI Plus Alternatives for 2025</title>
      <dc:creator>Joodi</dc:creator>
      <pubDate>Fri, 18 Apr 2025 09:57:00 +0000</pubDate>
      <link>https://dev.to/joodi/12-best-tailwind-ui-plus-alternatives-for-2025-575o</link>
      <guid>https://dev.to/joodi/12-best-tailwind-ui-plus-alternatives-for-2025-575o</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5l6qeg23dqpleyfqd23p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5l6qeg23dqpleyfqd23p.png" alt="Image description" width="700" height="467"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tired of paying for UI components on every new project? You're not the only one. In 2025, with the boom in side hustles and lean startups, it's smart to look for solid alternatives that don’t stretch your budget.&lt;/p&gt;

&lt;p&gt;After diving deep into the ecosystem, here’s a curated list of open-source and free Tailwind UI component libraries that are actually worth your time. Some are full systems, others are quick plug-and-play — but all are developer-friendly and flexible.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. DaisyUI
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Website&lt;/strong&gt;: &lt;a href="https://daisyui.com" rel="noopener noreferrer"&gt;daisyui.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F43fvk8ku2p7dfp5erfxg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F43fvk8ku2p7dfp5erfxg.png" alt="Image description" width="700" height="316"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A Tailwind plugin that adds beautiful, pre-built components and themes to your project without extra hassle.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;60+ ready-made components&lt;/li&gt;
&lt;li&gt;Built-in theme support (dark, light, custom)&lt;/li&gt;
&lt;li&gt;Easy to customize&lt;/li&gt;
&lt;li&gt;Install via &lt;code&gt;npm i daisyui&lt;/code&gt;
📌 &lt;strong&gt;Best for&lt;/strong&gt;: Prototyping quickly with a themed design system&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. HyperUI
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Website&lt;/strong&gt;: &lt;a href="https://hyperui.dev" rel="noopener noreferrer"&gt;hyperui.dev&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2zz5jxoizi2ciyq9z2xx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2zz5jxoizi2ciyq9z2xx.png" alt="Image description" width="700" height="335"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Copy-paste ready HTML snippets built with Tailwind. Zero config, updated regularly.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;100+ clean UI sections&lt;/li&gt;
&lt;li&gt;No JavaScript required&lt;/li&gt;
&lt;li&gt;Maintained actively by the community
📌 &lt;strong&gt;Best for&lt;/strong&gt;: Quick mockups, MVPs, client demos&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3. FloatUI
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Website&lt;/strong&gt;: &lt;a href="https://floatui.com" rel="noopener noreferrer"&gt;floatui.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fakotyvxpe3bk72fnjabr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fakotyvxpe3bk72fnjabr.png" alt="Image description" width="700" height="312"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Slick and modern components perfect for SaaS products, marketing sites, and dashboards.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Supports React, Vue, Svelte, HTML&lt;/li&gt;
&lt;li&gt;Minimal, clean design&lt;/li&gt;
&lt;li&gt;Free and Pro versions available
📌 &lt;strong&gt;Best for&lt;/strong&gt;: Clean layouts for SaaS or landing pages&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  4. Preline UI
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Website&lt;/strong&gt;: &lt;a href="https://preline.co" rel="noopener noreferrer"&gt;preline.co&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqeapphyljzx9xa2ucnbr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqeapphyljzx9xa2ucnbr.png" alt="Image description" width="700" height="323"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fully open-source library that nails accessibility and structure without bloat.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;640+ components&lt;/li&gt;
&lt;li&gt;Works with React, Vue, and plain HTML&lt;/li&gt;
&lt;li&gt;WAI-ARIA compliant&lt;/li&gt;
&lt;li&gt;MIT licensed
📌 &lt;strong&gt;Best for&lt;/strong&gt;: Teams that care about accessibility&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  5. TW Elements
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Website&lt;/strong&gt;: &lt;a href="https://tw-elements.com" rel="noopener noreferrer"&gt;tw-elements.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc0vf3js0an6z41cgekgw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc0vf3js0an6z41cgekgw.png" alt="Image description" width="700" height="332"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Combines Bootstrap’s interactivity with Tailwind’s style. Ideal if you're coming from Bootstrap.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;500+ interactive components&lt;/li&gt;
&lt;li&gt;Compatible with React, Vue, Laravel, Angular&lt;/li&gt;
&lt;li&gt;Mix of Bootstrap JS + Tailwind CSS
📌 &lt;strong&gt;Best for&lt;/strong&gt;: Transitioning Bootstrap users&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  6. Mamba UI
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Website&lt;/strong&gt;: &lt;a href="https://mambaui.com" rel="noopener noreferrer"&gt;mambaui.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsqgq9n2u4xh67v81d1hv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsqgq9n2u4xh67v81d1hv.png" alt="Image description" width="700" height="313"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Clean, polished Tailwind components with an elegant touch — no clutter.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;150+ components&lt;/li&gt;
&lt;li&gt;No JS dependencies&lt;/li&gt;
&lt;li&gt;Free &amp;amp; open source
📌 &lt;strong&gt;Best for&lt;/strong&gt;: Developers who love minimal but refined UI&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  7. TailGrids
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Website&lt;/strong&gt;: &lt;a href="https://tailgrids.com" rel="noopener noreferrer"&gt;tailgrids.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F225dl5bollh8qyp8ianc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F225dl5bollh8qyp8ianc.png" alt="Image description" width="700" height="331"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feature-rich component kit for startups and SaaS products.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;600+ UI blocks and templates&lt;/li&gt;
&lt;li&gt;Supports React, Vue, HTML, Figma&lt;/li&gt;
&lt;li&gt;Modern and developer-friendly&lt;/li&gt;
&lt;li&gt;Freemium model
📌 &lt;strong&gt;Best for&lt;/strong&gt;: Production-ready UIs built fast&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  8. Headless UI
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Website&lt;/strong&gt;: &lt;a href="https://headlessui.dev" rel="noopener noreferrer"&gt;headlessui.dev&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No styles — just pure logic. Built by the creators of Tailwind.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Handles UI behavior (dropdowns, modals, etc.)&lt;/li&gt;
&lt;li&gt;No CSS included&lt;/li&gt;
&lt;li&gt;Built for React and Vue
📌 &lt;strong&gt;Best for&lt;/strong&gt;: Full design control with accessibility baked in&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  9. Material Tailwind
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Website&lt;/strong&gt;: &lt;a href="https://material-tailwind.com" rel="noopener noreferrer"&gt;material-tailwind.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9yrwwn45wi2kl77xfxh5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9yrwwn45wi2kl77xfxh5.png" alt="Image description" width="700" height="314"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Material Design aesthetics meet Tailwind’s utility classes.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;50+ styled components&lt;/li&gt;
&lt;li&gt;Built using React + HTML&lt;/li&gt;
&lt;li&gt;Includes animations
📌 &lt;strong&gt;Best for&lt;/strong&gt;: Teams using Google’s Material guidelines&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  10. Wind UI
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Website&lt;/strong&gt;: &lt;a href="https://wind-ui.com" rel="noopener noreferrer"&gt;wind-ui.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8h4fx3y2xuccolre52hz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8h4fx3y2xuccolre52hz.png" alt="Image description" width="700" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Minimal, straightforward HTML components. Zero JS.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;40+ responsive components&lt;/li&gt;
&lt;li&gt;Open-source and simple to use
📌 &lt;strong&gt;Best for&lt;/strong&gt;: Lightweight setups and learning Tailwind&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  11. Flowbite
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Website&lt;/strong&gt;: &lt;a href="https://flowbite.com" rel="noopener noreferrer"&gt;flowbite.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjgmqe6bjfyxklf2e9r42.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjgmqe6bjfyxklf2e9r42.png" alt="Image description" width="700" height="307"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Highly flexible system with a design kit and dark mode support.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;600+ components&lt;/li&gt;
&lt;li&gt;Compatible with Laravel, Next.js, etc.&lt;/li&gt;
&lt;li&gt;Offers animations, templates, and Figma kit
📌 &lt;strong&gt;Best for&lt;/strong&gt;: Design/dev teams needing consistency&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  12. Meraki UI
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Website&lt;/strong&gt;: &lt;a href="https://merakiui.com" rel="noopener noreferrer"&gt;merakiui.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxjrseyu9npxohd67m8hv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxjrseyu9npxohd67m8hv.png" alt="Image description" width="700" height="330"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Just copy and paste — no installations needed.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;200+ Tailwind components&lt;/li&gt;
&lt;li&gt;Ready-to-go HTML&lt;/li&gt;
&lt;li&gt;Responsive and MIT licensed
📌 &lt;strong&gt;Best for&lt;/strong&gt;: Beginners and quick projects&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  13. Ripple UI
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Website&lt;/strong&gt;: &lt;a href="https://ripple-ui.com" rel="noopener noreferrer"&gt;ripple-ui.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fha1ha6g74nk8u3e91lg2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fha1ha6g74nk8u3e91lg2.png" alt="Image description" width="700" height="334"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A fresh, minimal component library with a strong focus on accessibility.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;35+ components&lt;/li&gt;
&lt;li&gt;Performance-first&lt;/li&gt;
&lt;li&gt;MIT licensed
📌 &lt;strong&gt;Best for&lt;/strong&gt;: Lightweight and distraction-free UI&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;Tailwind UI is awesome — no doubt. But the world of frontend is wide open, and there are plenty of tools out there that offer design freedom without the premium price tag.&lt;/p&gt;

&lt;p&gt;Some tools come as full design systems with Figma files, others are simple HTML blocks. That’s the magic of Tailwind’s ecosystem: it’s modular, community-driven, and full of choice.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/lets-code-future/12-best-tailwind-ui-plus-alternatives-for-2025-free-open-source-picks-ee97c3400591" rel="noopener noreferrer"&gt;Source&lt;/a&gt;&lt;/p&gt;

</description>
      <category>tailwindcss</category>
      <category>javascript</category>
      <category>react</category>
      <category>nextjs</category>
    </item>
    <item>
      <title>Understanding Core React Hooks with Simple Analogies</title>
      <dc:creator>Joodi</dc:creator>
      <pubDate>Thu, 17 Apr 2025 14:11:12 +0000</pubDate>
      <link>https://dev.to/joodi/understanding-core-react-hooks-with-simple-analogies-49l0</link>
      <guid>https://dev.to/joodi/understanding-core-react-hooks-with-simple-analogies-49l0</guid>
      <description>&lt;h3&gt;
  
  
  What You'll Learn in This Guide
&lt;/h3&gt;

&lt;p&gt;In this article, we'll break down the most important React Hooks using relatable, real-world analogies. Here's what we’re covering:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;useState&lt;/code&gt; — Understand how to manage component state like tracking mood swings.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;useEffect&lt;/code&gt; — Learn how to handle side effects with precision, just like setting a smart reminder.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;useRef&lt;/code&gt; — Discover how to store values or references without triggering rerenders.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;useMemo&lt;/code&gt; &amp;amp; &lt;code&gt;useCallback&lt;/code&gt; — See how to optimize performance by caching values and functions.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Custom Hooks&lt;/code&gt; — Learn how to create reusable logic to simplify your components.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzagdeccjgaxsye5k4nxs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzagdeccjgaxsye5k4nxs.png" alt="Image description" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;code&gt;useState&lt;/code&gt; — Like a Mood Tracker in Your Brain
&lt;/h2&gt;

&lt;p&gt;Ever found yourself switching moods faster than your playlist? One minute you're relaxed, the next you're stressed, then suddenly you're starving.&lt;/p&gt;

&lt;p&gt;That’s basically &lt;code&gt;useState&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;mood&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setMood&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="s2"&gt;relaxed&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;You're saving your current "mood" (aka state) and updating it whenever something changes. And just like how your best friend notices your vibe shift instantly, React does the same and rerenders accordingly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reality Check:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Still holding on to &lt;code&gt;this.state&lt;/code&gt; like it’s your first coding project? Let it go. &lt;code&gt;useState&lt;/code&gt; is simpler, cleaner, and far less awkward than binding methods like it's still 2015.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;code&gt;useEffect&lt;/code&gt; — The "Hey, Something Changed" Hook
&lt;/h2&gt;

&lt;p&gt;Imagine setting a reminder that says, "If it rains, grab your umbrella." That’s how &lt;code&gt;useEffect&lt;/code&gt; works — it only kicks in when specific things change.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="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;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;Don't forget the umbrella!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;weather&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Think of it as that friend who only texts you when something interesting happens. Not always around, but super efficient.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reality Check:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Don’t treat &lt;code&gt;useEffect&lt;/code&gt; like a junk drawer. Just because you &lt;em&gt;can&lt;/em&gt; throw everything into it, doesn’t mean you &lt;em&gt;should&lt;/em&gt;. Keep it clean — future you will thank you.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;code&gt;useRef&lt;/code&gt; — The Hidden Compartment
&lt;/h2&gt;

&lt;p&gt;Need a quiet little corner to stash something where React won’t poke around? That’s what &lt;code&gt;useRef&lt;/code&gt; is for.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;inputRef&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It’s like your app’s glove box — perfect for DOM elements, timers, or anything you want to store without triggering rerenders.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real Talk:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you don’t need React to react (pun intended), skip &lt;code&gt;useState&lt;/code&gt; and use &lt;code&gt;useRef&lt;/code&gt;. It’s your silent helper.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;code&gt;useMemo&lt;/code&gt; &amp;amp; &lt;code&gt;useCallback&lt;/code&gt; — Brain Caching for Your Code
&lt;/h2&gt;

&lt;p&gt;Say your app’s doing some heavy calculations on every render. Let’s not waste CPU cycles.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useMemo&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;expensiveCalculation&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="p"&gt;[]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;useMemo&lt;/code&gt; stores values. &lt;code&gt;useCallback&lt;/code&gt; stores functions. Think of them like mental bookmarks for your brain — ready when you need them, not recalculated every time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But Heads Up:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Don't go wrapping everything in &lt;code&gt;useMemo&lt;/code&gt; like it's bubble wrap. Use it when it &lt;em&gt;actually&lt;/em&gt; makes a difference — not just to look smart in code reviews.&lt;/p&gt;




&lt;h2&gt;
  
  
  Custom Hooks — Your Code’s Personal Assistant
&lt;/h2&gt;

&lt;p&gt;Tired of copy-pasting the same logic across components? Build a custom hook and reuse it like a pro.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;useOnlineStatus&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;isOnline&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setIsOnline&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;navigator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onLine&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;handleStatus&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;setIsOnline&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;navigator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onLine&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;online&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;handleStatus&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;offline&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;handleStatus&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="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;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;online&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;handleStatus&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;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;offline&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;handleStatus&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[]);&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;isOnline&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 you've got a plug-and-play solution. No more clutter. Just clean, modular logic.&lt;/p&gt;




&lt;h2&gt;
  
  
  Still Nervous About Hooks?
&lt;/h2&gt;

&lt;p&gt;Don’t be. Hooks might seem weird at first — so did async/await, and now you love those.&lt;/p&gt;

&lt;p&gt;Yes, they take getting used to. But once they click, your components will be cleaner, more powerful, and future-ready.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts (A Gentle Roast)
&lt;/h2&gt;

&lt;p&gt;If you're still clinging to class components in 2025, you're basically the tech version of using dial-up. Nostalgic, but let's move on.&lt;/p&gt;

&lt;p&gt;React Hooks made code leaner, smarter, and more modular. If you haven’t jumped in yet — now’s the time. Try. Fail. Learn. Repeat.&lt;/p&gt;

&lt;p&gt;And hey — got your own wild analogy for &lt;code&gt;useEffect&lt;/code&gt;? Or a horror story involving &lt;code&gt;useRef&lt;/code&gt;? Drop it in the comments.&lt;/p&gt;

&lt;p&gt;👊 Keep coding. Keep learning. And whatever you do — don’t treat &lt;code&gt;useEffect&lt;/code&gt; like a closet with no shelves.&lt;/p&gt;

</description>
      <category>react</category>
      <category>javascript</category>
      <category>nextjs</category>
    </item>
    <item>
      <title>React vs Next: Which One Makes You a Better Developer? 🚀</title>
      <dc:creator>Joodi</dc:creator>
      <pubDate>Tue, 15 Apr 2025 20:29:23 +0000</pubDate>
      <link>https://dev.to/joodi/react-vs-next-which-one-makes-you-a-better-developer-2pbe</link>
      <guid>https://dev.to/joodi/react-vs-next-which-one-makes-you-a-better-developer-2pbe</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffju29eqhpts79r7uh0fz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffju29eqhpts79r7uh0fz.png" alt="Image description" width="800" height="402"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you're stepping into the front-end development world, you've probably heard a lot about &lt;strong&gt;React&lt;/strong&gt; and &lt;strong&gt;Next&lt;/strong&gt;. These two are among the most popular tools for building modern user interfaces, but each has its own purpose, strengths, and ideal use cases.&lt;/p&gt;

&lt;p&gt;In this guide, we’ll explore the differences between React and Next.js — not with dry technical jargon, but in a way that feels like a conversation. You’ll learn what React does, how Next builds on top of it, and more importantly, &lt;strong&gt;when to choose each&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔹 What is React?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;React&lt;/strong&gt; is a JavaScript library developed by Meta (formerly Facebook). It's used to build user interfaces by breaking them down into reusable &lt;strong&gt;components&lt;/strong&gt;. These components manage their own logic, style, and structure, making your code more modular and maintainable.&lt;/p&gt;

&lt;p&gt;Famous apps like Instagram, Netflix, and Airbnb use React. But what makes React so special?&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Key Advantages of React:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;High performance&lt;/strong&gt; with Virtual DOM&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Component-based&lt;/strong&gt; structure for better code reuse&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One-way data flow&lt;/strong&gt; for easier debugging&lt;/li&gt;
&lt;li&gt;Huge ecosystem and community&lt;/li&gt;
&lt;li&gt;Tons of learning resources and job opportunities&lt;/li&gt;
&lt;li&gt;Plays well with SEO (with help from tools like Next.js)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔹 What is Next.js?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Next.js&lt;/strong&gt; is a framework built on top of React, developed by &lt;strong&gt;Vercel&lt;/strong&gt;. It makes it easier to build fast, optimized, production-ready web apps.&lt;/p&gt;

&lt;p&gt;While React is powerful on its own, it lacks some out-of-the-box features needed for SEO, routing, and server-side rendering. Next.js fills those gaps with features like:&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Key Features of Next.js:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Server-side Rendering (SSR)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Static Site Generation (SSG)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Incremental Static Regeneration (ISR)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Built-in Routing&lt;/strong&gt; (no need for React Router)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Image optimization&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Built-in API routes&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Next.js is ideal when SEO, speed, and structure matter. Projects like Netflix Jobs and Hashnode’s blog are great examples of what you can build with it.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚔️ React vs Next: Key Differences
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;React&lt;/th&gt;
&lt;th&gt;Next.js&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Rendering&lt;/td&gt;
&lt;td&gt;Client-side (CSR)&lt;/td&gt;
&lt;td&gt;CSR + SSR + SSG + ISR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Routing&lt;/td&gt;
&lt;td&gt;Manual (React Router)&lt;/td&gt;
&lt;td&gt;Automatic (file-based)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SEO&lt;/td&gt;
&lt;td&gt;Weak on its own&lt;/td&gt;
&lt;td&gt;Strong with SSR/SSG&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Performance&lt;/td&gt;
&lt;td&gt;Fast with Virtual DOM&lt;/td&gt;
&lt;td&gt;Faster on initial load&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backend APIs&lt;/td&gt;
&lt;td&gt;Not included&lt;/td&gt;
&lt;td&gt;Built-in API routes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🤔 When Should You Use React Alone?
&lt;/h2&gt;

&lt;p&gt;React is still a great choice, especially when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You're building &lt;strong&gt;highly interactive apps&lt;/strong&gt; like dashboards or tools.&lt;/li&gt;
&lt;li&gt;You want &lt;strong&gt;freedom&lt;/strong&gt; to choose your architecture and tools.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SEO isn’t critical&lt;/strong&gt;, like in internal apps or admin panels.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It gives you full control and works best when paired with your own setup.&lt;/p&gt;




&lt;h2&gt;
  
  
  💡 When Should You Use Next.js?
&lt;/h2&gt;

&lt;p&gt;Go for Next.js when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You need &lt;strong&gt;SEO optimization&lt;/strong&gt; and fast load times.&lt;/li&gt;
&lt;li&gt;You're building &lt;strong&gt;blogs, e-commerce sites, or landing pages&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;You want a &lt;strong&gt;structured and scalable project&lt;/strong&gt; from the start.&lt;/li&gt;
&lt;li&gt;You need &lt;strong&gt;server-side APIs&lt;/strong&gt; without setting up a backend.&lt;/li&gt;
&lt;li&gt;Your site has &lt;strong&gt;mostly static or semi-static content&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Next brings smart defaults and advanced performance features, so you can focus more on your app logic.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 Learn React or Next First?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Start with React.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Next.js is built on React, so you can't skip it. First, learn about components, props, state, and hooks.&lt;/p&gt;

&lt;p&gt;Then, &lt;strong&gt;move on to Next.js&lt;/strong&gt; to unlock server-side rendering, static generation, routing, and more.&lt;/p&gt;

&lt;h3&gt;
  
  
  ❓ Can I Start with Next Directly?
&lt;/h3&gt;

&lt;p&gt;Not really. Since Next is built &lt;strong&gt;on top of React&lt;/strong&gt;, you need a solid understanding of React fundamentals to avoid confusion.&lt;/p&gt;

&lt;h3&gt;
  
  
  📘 Recommended Learning Path:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;JavaScript&lt;/li&gt;
&lt;li&gt;React (components, hooks, state management)&lt;/li&gt;
&lt;li&gt;Real-world React projects&lt;/li&gt;
&lt;li&gt;Next.js (SSR, SSG, routing, API routes)&lt;/li&gt;
&lt;/ol&gt;




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

&lt;p&gt;Choosing between React and Next.js isn't about picking a winner — it's about picking &lt;strong&gt;the right tool for the job&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;React&lt;/strong&gt; is your &lt;strong&gt;foundation&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Next&lt;/strong&gt; is your &lt;strong&gt;power-up&lt;/strong&gt; for production-ready apps.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tools change, but your mindset matters most. Learn to &lt;strong&gt;choose wisely based on the project’s needs&lt;/strong&gt;, and that’s what makes you a smarter, future-ready developer. 💼💥&lt;/p&gt;

</description>
      <category>react</category>
      <category>nextjs</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Lazy Loading in React</title>
      <dc:creator>Joodi</dc:creator>
      <pubDate>Tue, 15 Apr 2025 13:50:54 +0000</pubDate>
      <link>https://dev.to/joodi/lazy-loading-in-react-4gdg</link>
      <guid>https://dev.to/joodi/lazy-loading-in-react-4gdg</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fisbo4j83vppg1pzmr57v.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fisbo4j83vppg1pzmr57v.jpg" alt="Image description" width="686" height="386"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Lazy Loading in React: Improving Performance with Dynamic Imports
&lt;/h1&gt;

&lt;p&gt;Lazy loading in React allows you to optimize the performance of your application by splitting the code into smaller chunks. Instead of loading the entire application upfront, lazy loading loads only the code that's needed for a particular part of the app when it's actually required. This can significantly improve the initial loading time of your application.&lt;/p&gt;

&lt;p&gt;React provides two main features to implement lazy loading: &lt;code&gt;React.lazy()&lt;/code&gt; for dynamic imports and &lt;code&gt;React.Suspense&lt;/code&gt; to handle loading states.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚡ What is Lazy Loading in React?
&lt;/h2&gt;

&lt;p&gt;Lazy loading helps break your application into smaller pieces (chunks) so that the code is only loaded when it’s required. React provides the ability to dynamically import components only when they’re about to be rendered.  &lt;/p&gt;

&lt;h3&gt;
  
  
  Why is it Important?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Improved Initial Load Time:&lt;/strong&gt; By loading only the code that is needed, you reduce the initial load time of your application.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Better User Experience:&lt;/strong&gt; It provides a faster initial render and a smoother experience, especially in large applications.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧩 How Does Lazy Loading Work in React?
&lt;/h2&gt;

&lt;p&gt;React uses &lt;code&gt;React.lazy()&lt;/code&gt; to dynamically import components. This function allows you to load a component only when it is needed. However, React does not automatically handle the loading state; that's where &lt;code&gt;React.Suspense&lt;/code&gt; comes in. &lt;code&gt;Suspense&lt;/code&gt; lets you specify a fallback UI that will be shown while the component is loading.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step-by-Step Example
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. Create a Component to Lazy Load
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Products.js&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="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="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;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;This is a lazy-loaded component!&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="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;Products&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  2. Use &lt;code&gt;React.lazy()&lt;/code&gt; to Dynamically Import the Component
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Products&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="s2"&gt;./components/products/Products&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;h4&gt;
  
  
  3. Wrap the Lazy-Loaded Component with &lt;code&gt;Suspense&lt;/code&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;ReactDOM&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react-dom/client&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./index.css&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./App&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;PageNotFound&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./components/PagenotFound/PageNotFound&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createBrowserRouter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;createRoutesFromElements&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Route&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;RouterProvider&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react-router-dom&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Home&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./components/Home/Home&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;Products&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="s2"&gt;./components/products/Products&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;router&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createBrowserRouter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nf"&gt;createRoutesFromElements&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;Route&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"/"&lt;/span&gt; &lt;span class="na"&gt;element&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;App&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;Route&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"/"&lt;/span&gt; &lt;span class="na"&gt;element&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;Home&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;Route&lt;/span&gt;
        &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"products"&lt;/span&gt;
        &lt;span class="na"&gt;element&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;React&lt;/span&gt;&lt;span class="p"&gt;.&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="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Loading...&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="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Products&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;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Suspense&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="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;Route&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"*"&lt;/span&gt; &lt;span class="na"&gt;element&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;PageNotFound&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;Route&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;root&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ReactDOM&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createRoot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;root&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="nx"&gt;root&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;RouterProvider&lt;/span&gt; &lt;span class="na"&gt;router&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;router&lt;/span&gt;&lt;span class="si"&gt;}&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;In this example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;Products&lt;/code&gt; component is dynamically imported using &lt;code&gt;React.lazy()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;Suspense&lt;/code&gt; component is used to display a fallback UI (&lt;code&gt;&amp;lt;div&amp;gt;Loading...&amp;lt;/div&amp;gt;&lt;/code&gt;) while the &lt;code&gt;Products&lt;/code&gt; component is being loaded.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  4. Navigate to the Route to See Lazy Loading in Action
&lt;/h4&gt;

&lt;p&gt;Once the user navigates to the &lt;code&gt;/products&lt;/code&gt; route, the &lt;code&gt;Products&lt;/code&gt; component will be fetched and rendered only when required. This reduces the initial payload size and improves the performance.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚠️ Important Notes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;fallback&lt;/code&gt; prop in Suspense:&lt;/strong&gt; The &lt;code&gt;fallback&lt;/code&gt; prop is mandatory in the &lt;code&gt;Suspense&lt;/code&gt; component. It specifies the UI to show while the lazy-loaded component is being fetched. You can customize it according to your needs, such as displaying a loading spinner or a skeleton screen.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multiple Lazy-Loaded Components:&lt;/strong&gt; You can use &lt;code&gt;React.lazy()&lt;/code&gt; and &lt;code&gt;Suspense&lt;/code&gt; in various parts of your app to implement lazy loading for multiple components.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;Lazy loading is a simple yet powerful technique that can drastically improve your React app's performance. With &lt;code&gt;React.lazy()&lt;/code&gt; and &lt;code&gt;React.Suspense&lt;/code&gt;, you can efficiently manage when components are loaded, which helps reduce the initial loading time and enhances the overall user experience.&lt;/p&gt;

&lt;p&gt;Start using lazy loading today and see the difference in performance for yourself!&lt;/p&gt;

</description>
      <category>react</category>
      <category>nextjs</category>
      <category>javascript</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Mastering useActionState in React</title>
      <dc:creator>Joodi</dc:creator>
      <pubDate>Tue, 15 Apr 2025 13:47:55 +0000</pubDate>
      <link>https://dev.to/joodi/mastering-useactionstate-in-react-2im</link>
      <guid>https://dev.to/joodi/mastering-useactionstate-in-react-2im</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frnlrhj8q1vkyj1shzmun.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frnlrhj8q1vkyj1shzmun.png" alt="Image description" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you're diving into modern React — especially with React Server Components — there's one powerful but underrated hook you should know about: &lt;code&gt;useActionState&lt;/code&gt;.&lt;br&gt;&lt;br&gt;
This hook is available in React’s experimental and Canary builds, and it brings a smarter way to manage form-related state directly tied to form submissions.&lt;/p&gt;

&lt;p&gt;In this article, we’ll break down what &lt;code&gt;useActionState&lt;/code&gt; does, why it’s useful, and walk through real-life examples so you can confidently integrate it into your apps.&lt;/p&gt;


&lt;h2&gt;
  
  
  🔍 What is &lt;code&gt;useActionState&lt;/code&gt;?
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;useActionState&lt;/code&gt; is a React hook designed to handle state updates that occur as a result of a form submission.&lt;br&gt;&lt;br&gt;
Think of it as a more declarative way to handle the result of an action — like submitting data to a server or validating a field.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Syntax:&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="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;formAction&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useActionState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;initialState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;permalink&lt;/span&gt;&lt;span class="p"&gt;?);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;fn&lt;/code&gt;: A function triggered on form submission. It receives the previous state and form data.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;initialState&lt;/code&gt;: The default value before any submission happens.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;permalink&lt;/code&gt; &lt;em&gt;(optional)&lt;/em&gt;: A persistent URL used for state preservation (great for server components).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It returns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;state&lt;/code&gt;: The current form state.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;formAction&lt;/code&gt;: A handler you pass into the &lt;code&gt;&amp;lt;form&amp;gt;&lt;/code&gt; as the &lt;code&gt;action&lt;/code&gt; prop.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧪 Example 1: Simple Counter Form
&lt;/h2&gt;

&lt;p&gt;Let’s say we want a button that increments a counter each time it’s clicked (submitted). Here’s how we can do it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useActionState&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;increment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prevState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;formData&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;prevState&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;CounterForm&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;count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;formAction&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useActionState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;increment&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="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;form&lt;/span&gt; &lt;span class="na"&gt;action&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;formAction&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;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Counter: &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"submit"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Increment&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;form&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;Every time the form is submitted, the &lt;code&gt;increment&lt;/code&gt; function runs and updates the counter.&lt;/p&gt;




&lt;h2&gt;
  
  
  ❗ Example 2: Showing Error Messages in Forms
&lt;/h2&gt;

&lt;p&gt;You can use &lt;code&gt;useActionState&lt;/code&gt; to display error messages when a submission fails — super handy in forms with backend validation.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useActionState&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;addToCart&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;./actions.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;AddToCartForm&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;itemID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;itemTitle&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;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;formAction&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useActionState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;addToCart&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;form&lt;/span&gt; &lt;span class="na"&gt;action&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;formAction&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;h2&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;itemTitle&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;h2&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;input&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"hidden"&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"itemID"&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;itemID&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;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"submit"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Add to Cart&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"error"&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;message&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;form&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// actions.js (server function)&lt;/span&gt;
&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;use server&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;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;addToCart&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prevState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;formData&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;itemID&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;formData&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;itemID&lt;/span&gt;&lt;span class="dl"&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;itemID&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Added to cart&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;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Couldn't add to cart: the item is sold out.&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 pattern helps you handle and display server-side errors without extra boilerplate.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔁 Example 3: Maintain Form State Across Pages
&lt;/h2&gt;

&lt;p&gt;Using the optional &lt;code&gt;permalink&lt;/code&gt; argument, &lt;code&gt;useActionState&lt;/code&gt; can preserve form state even if the user navigates away and returns later.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useActionState&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;submitFeedback&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;./actions.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;FeedbackForm&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;feedback&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;formAction&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useActionState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;submitFeedback&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/feedback&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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;form&lt;/span&gt; &lt;span class="na"&gt;action&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;formAction&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;textarea&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"feedback"&lt;/span&gt; &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Your feedback"&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;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"submit"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Submit&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;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;feedback&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;form&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;This ensures your form state survives across navigations — a great UX boost, especially in multi-step flows or persistent layouts.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚠️ When Not to Use &lt;code&gt;useActionState&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Although this hook is powerful, it’s not the right fit for every use case:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;List Keys:&lt;/strong&gt; Don’t use it for React list keys — use stable, unique IDs from your data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;User-Controlled IDs:&lt;/strong&gt; If you’re getting IDs or state from a database or API, you don't need &lt;code&gt;useActionState&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Highly Dynamic UIs:&lt;/strong&gt; If you need to update state on every render (like for animations or transient states), consider &lt;code&gt;useRef&lt;/code&gt; or local &lt;code&gt;useState&lt;/code&gt; instead.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;&lt;code&gt;useActionState&lt;/code&gt; is a game-changer for handling forms in React, especially in apps using Server Components.&lt;br&gt;&lt;br&gt;
It gives you better control over form results, lets you manage error messages seamlessly, and supports persistent form state across routes.&lt;/p&gt;

&lt;p&gt;If you’re already exploring React’s latest features, adding this hook to your toolkit is a no-brainer.&lt;/p&gt;

&lt;p&gt;Happy coding!&lt;/p&gt;

</description>
      <category>react</category>
      <category>javascript</category>
      <category>typescript</category>
      <category>react19</category>
    </item>
    <item>
      <title>useId() Hook in React</title>
      <dc:creator>Joodi</dc:creator>
      <pubDate>Tue, 15 Apr 2025 13:41:12 +0000</pubDate>
      <link>https://dev.to/joodi/useid-hook-in-react-l6m</link>
      <guid>https://dev.to/joodi/useid-hook-in-react-l6m</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flrb3wiyjr0hpfvhz5p6x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flrb3wiyjr0hpfvhz5p6x.png" alt="Image description" width="686" height="386"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you've been building with React for a while, you're likely familiar with hooks like &lt;code&gt;useState&lt;/code&gt;, &lt;code&gt;useEffect&lt;/code&gt;, or &lt;code&gt;useRef&lt;/code&gt;. But there's one lesser-known hook that quietly does a lot of heavy lifting — kind of like the right Ctrl key on your keyboard that no one really uses: &lt;code&gt;useId()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;In this post, we’ll explore what &lt;code&gt;useId()&lt;/code&gt; actually does, when to use it, and how it can help improve both the structure and accessibility of your components.&lt;/p&gt;




&lt;h2&gt;
  
  
  🤔 What Exactly Is &lt;code&gt;useId()&lt;/code&gt;?
&lt;/h2&gt;

&lt;p&gt;Introduced in React 18, &lt;code&gt;useId()&lt;/code&gt; is a built-in hook that generates unique, consistent IDs for your components.&lt;/p&gt;

&lt;p&gt;It’s particularly useful for things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Linking &lt;code&gt;&amp;lt;label&amp;gt;&lt;/code&gt;s to &lt;code&gt;&amp;lt;input&amp;gt;&lt;/code&gt;s&lt;/li&gt;
&lt;li&gt;ARIA attributes for accessibility&lt;/li&gt;
&lt;li&gt;Avoiding duplicate IDs in dynamic UI structures&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Unlike manually generating IDs using &lt;code&gt;Math.random()&lt;/code&gt; or &lt;code&gt;Date.now()&lt;/code&gt;, &lt;code&gt;useId()&lt;/code&gt; ensures that IDs are stable between renders and unique across the entire app — both on the client and the server.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 Why Should You Care?
&lt;/h2&gt;

&lt;p&gt;Before React 18, developers often had to create their own solutions to generate unique IDs. Now, with &lt;code&gt;useId()&lt;/code&gt;, things are way simpler — and safer.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Benefits of &lt;code&gt;useId()&lt;/code&gt;:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Avoids Duplicate IDs:&lt;/strong&gt; Hardcoding IDs can easily lead to duplication. &lt;code&gt;useId()&lt;/code&gt; ensures uniqueness automatically.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SSR + CSR Consistency:&lt;/strong&gt; Guarantees that your IDs stay the same whether the component is rendered on the server or client.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Boosts Accessibility:&lt;/strong&gt; Perfect for ARIA labels and linking elements together in an a11y-friendly way.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🛠 How to Use &lt;code&gt;useId()&lt;/code&gt; in React
&lt;/h2&gt;

&lt;p&gt;Let’s see a basic example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useId&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;CustomInput&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;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useId&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;label&lt;/span&gt; &lt;span class="nx"&gt;htmlFor&lt;/span&gt;&lt;span class="o"&gt;=&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;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Enter&lt;/span&gt; &lt;span class="nx"&gt;your&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/label&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&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;span class="nx"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;placeholder&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;John Doe&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Here, &lt;code&gt;useId()&lt;/code&gt; generates a consistent ID that links the &lt;code&gt;&amp;lt;label&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;input&amp;gt;&lt;/code&gt; together.&lt;/p&gt;




&lt;h3&gt;
  
  
  🔁 Need More Than One ID?
&lt;/h3&gt;

&lt;p&gt;Sometimes you’ll need multiple unique IDs in a single component — no problem:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useId&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;CustomForm&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;nameId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useId&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;emailId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useId&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;form&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;label&lt;/span&gt; &lt;span class="nx"&gt;htmlFor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;nameId&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;Name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/label&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;nameId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;placeholder&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;John Doe&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;label&lt;/span&gt; &lt;span class="nx"&gt;htmlFor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;emailId&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;Email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/label&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;emailId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;email&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;placeholder&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;john@example.com&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/form&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Each call to useId() returns a new unique ID — super helpful when building reusable forms or dynamic UIs.&lt;/p&gt;




&lt;h3&gt;
  
  
  ♿ Improving Accessibility with &lt;code&gt;useId()&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Accessibility (a11y) is a core part of modern web development. With &lt;code&gt;useId()&lt;/code&gt;, you can easily manage ARIA attributes and relationships.&lt;/p&gt;

&lt;p&gt;Here, the heading is clearly linked to the alert container, improving the screen reader experience.&lt;/p&gt;




&lt;h3&gt;
  
  
  🚫 When Not to Use &lt;code&gt;useId()&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Although &lt;code&gt;useId()&lt;/code&gt; is powerful, it’s not always the right tool. Here are some cases where it’s better to skip it:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;List Keys&lt;/strong&gt;: Don’t use &lt;code&gt;useId()&lt;/code&gt; for keys in lists — instead, rely on unique data from your items.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;User-Generated IDs&lt;/strong&gt;: If the ID comes from a database or API, you don’t need useId().&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Per-Render Needs&lt;/strong&gt;: If the ID changes every render (e.g., for animations), go with useRef() or state instead.&lt;/p&gt;




&lt;p&gt;✅ Final Thoughts&lt;br&gt;
useId() is a simple but powerful addition to the React Hooks family. It helps keep your components accessible, avoids bugs with duplicate IDs, and works seamlessly with SSR.&lt;/p&gt;

&lt;p&gt;Start using it where appropriate — especially in forms and accessibility-related scenarios — and you’ll write cleaner, more resilient components.&lt;/p&gt;

&lt;p&gt;Happy coding! &lt;/p&gt;

</description>
      <category>react</category>
      <category>nextjs</category>
      <category>frontend</category>
      <category>react19</category>
    </item>
    <item>
      <title>Best Authentication Libraries for Next.js in 2025 🔐</title>
      <dc:creator>Joodi</dc:creator>
      <pubDate>Mon, 14 Apr 2025 20:06:56 +0000</pubDate>
      <link>https://dev.to/joodi/best-authentication-libraries-for-nextjs-in-2025-5eca</link>
      <guid>https://dev.to/joodi/best-authentication-libraries-for-nextjs-in-2025-5eca</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F86gohtj2euf8tw35be64.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F86gohtj2euf8tw35be64.png" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
Adding authentication to your Next.js app is easier than ever — but picking the right tool depends on your project needs.&lt;/p&gt;

&lt;p&gt;Here’s a hand-picked list of the top authentication libraries for Next.js, what they do best, and when to use them 👇&lt;/p&gt;




&lt;h3&gt;
  
  
  1. &lt;strong&gt;NextAuth.js&lt;/strong&gt; 🌟
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4m8y0y20ui3oll5jzikg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4m8y0y20ui3oll5jzikg.png" alt="Image description" width="800" height="418"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Why Use It:&lt;/strong&gt; Built &lt;em&gt;specifically&lt;/em&gt; for Next.js, NextAuth.js is flexible, secure, and developer-friendly.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Best For:&lt;/strong&gt; Full control, SSR support, and seamless integration with Next.js.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Supports OAuth, magic links, email/password, and more.&lt;/li&gt;
&lt;li&gt;Easy to integrate with databases or go database-less.&lt;/li&gt;
&lt;li&gt;Type-safe with great TypeScript support.&lt;/li&gt;
&lt;li&gt;Built-in CSRF protection, JWT, and cookie handling.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  2. &lt;strong&gt;Kinde&lt;/strong&gt; 🚀
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flwkpx8ro5uatuu3tg57m.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flwkpx8ro5uatuu3tg57m.jpg" alt="Image description" width="280" height="280"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Why Use It:&lt;/strong&gt; A modern auth platform made for startups, with user management and feature flags built-in.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Best For:&lt;/strong&gt; SaaS startups needing rapid auth integration and growth tools.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hosted login UI and social providers.&lt;/li&gt;
&lt;li&gt;Team management and RBAC out of the box.&lt;/li&gt;
&lt;li&gt;Built-in audit logs, feature flags, and organizations.&lt;/li&gt;
&lt;li&gt;Next.js SDK for easy setup.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  3. &lt;strong&gt;Clerk&lt;/strong&gt; 👥
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fww3fjyb1o73fg8safe44.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fww3fjyb1o73fg8safe44.png" alt="Image description" width="800" height="232"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why Use It:&lt;/strong&gt; Offers beautifully designed pre-built auth UIs, making user management effortless.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Best For:&lt;/strong&gt; Teams who want fast setup and great UX with less backend handling.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Drop-in React components for sign in, sign up, and user profile.&lt;/li&gt;
&lt;li&gt;Social login, magic links, and MFA.&lt;/li&gt;
&lt;li&gt;Session revocation, audit logs, and built-in analytics.&lt;/li&gt;
&lt;li&gt;Works perfectly with App Router.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  4. &lt;strong&gt;Lucia Auth&lt;/strong&gt; 🧩
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw60mvhrvrpzzljlzhzfz.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw60mvhrvrpzzljlzhzfz.jpg" alt="Image description" width="800" height="420"&gt;&lt;/a&gt; &lt;br&gt;
&lt;strong&gt;Why Use It:&lt;/strong&gt; A lightweight library that gives you full control over the auth flow — minimal, fast, and flexible.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Best For:&lt;/strong&gt; Developers who want custom workflows and don’t mind managing more manually.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Simple session and token management.&lt;/li&gt;
&lt;li&gt;Works with any adapter (PostgreSQL, SQLite, etc.).&lt;/li&gt;
&lt;li&gt;Full TypeScript support and built-in password handling.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  5. &lt;strong&gt;Auth0&lt;/strong&gt; 🛡
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fznipnijg5xkhis9fjeyp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fznipnijg5xkhis9fjeyp.png" alt="Image description" width="800" height="364"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Why Use It:&lt;/strong&gt; Enterprise-grade authentication with tons of integrations and rock-solid security.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Best For:&lt;/strong&gt; Large-scale apps that need enterprise compliance, scalability, and SSO.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hosted login and MFA support.&lt;/li&gt;
&lt;li&gt;Works well with Next.js middleware and Edge Functions.&lt;/li&gt;
&lt;li&gt;Great docs and ecosystem for teams.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  6. &lt;strong&gt;Supabase Auth&lt;/strong&gt; 🧪
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fok0wirx0pvb0i9vr375o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fok0wirx0pvb0i9vr375o.png" alt="Image description" width="313" height="161"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Why Use It:&lt;/strong&gt; If you’re already using Supabase as a backend, the built-in auth is a no-brainer.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Best For:&lt;/strong&gt; Full-stack apps powered by Supabase with a simple but powerful auth layer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Social login, OTP, magic links, and email/password.&lt;/li&gt;
&lt;li&gt;Managed sessions, RLS support, and serverless functions.&lt;/li&gt;
&lt;li&gt;Deep integration with PostgreSQL and real-time features.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  7. &lt;strong&gt;Firebase Authentication&lt;/strong&gt; 🔥
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8p3qbju4xoz70j85hypb.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8p3qbju4xoz70j85hypb.jpg" alt="Image description" width="800" height="444"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Why Use It:&lt;/strong&gt; One of the most beginner-friendly auth systems with mobile and web support.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Best For:&lt;/strong&gt; Small apps, MVPs, or when using Firebase as the backend.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Easy social login and anonymous auth.&lt;/li&gt;
&lt;li&gt;Syncs across web and native apps.&lt;/li&gt;
&lt;li&gt;Tight integration with Firestore and other Firebase tools.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ✅ So, Which One Should You Choose?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Use Case&lt;/th&gt;
&lt;th&gt;Best Option&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Maximum flexibility and SSR&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;NextAuth.js&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Beautiful UI and quick setup&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Clerk&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lightweight &amp;amp; minimal control&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Lucia Auth&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Enterprise-grade security&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Auth0&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Startup-focused with growth tools&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Kinde&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;If using Supabase backend&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Supabase Auth&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;For MVPs or Firebase stack&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Firebase Auth&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;p&gt;💡 Want to take your Next.js app even further?&lt;br&gt;&lt;br&gt;
Check out: &lt;a href="https://dev.to/joodi/20-essential-monitoring-tools-for-nextjs-in-2025-4dk5"&gt;Top 20 Performance Monitoring Tools for Next.js&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Made with ❤️ for modern front-end developers.&lt;/p&gt;

&lt;p&gt;I hope this was helpful, and I’d be happy to connect and follow each other!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.linkedin.com/in/MiladJoodi" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>nextjs</category>
      <category>react</category>
      <category>authentication</category>
      <category>frontend</category>
    </item>
    <item>
      <title>20 Essential Monitoring Tools for Next.js in 2025 📊</title>
      <dc:creator>Joodi</dc:creator>
      <pubDate>Mon, 14 Apr 2025 18:29:24 +0000</pubDate>
      <link>https://dev.to/joodi/20-essential-monitoring-tools-for-nextjs-in-2025-4dk5</link>
      <guid>https://dev.to/joodi/20-essential-monitoring-tools-for-nextjs-in-2025-4dk5</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcyw9u2cs83r9pelthb7v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcyw9u2cs83r9pelthb7v.png" alt="Image description" width="800" height="345"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Monitoring tools help you track performance, detect errors, and ensure a smooth user experience for your Next.js apps. Here’s a complete and updated list of top tools in 2025:&lt;/p&gt;




&lt;h3&gt;
  
  
  1. Sentry
&lt;/h3&gt;

&lt;p&gt;🔧 Real-time error tracking and performance monitoring.&lt;br&gt;&lt;br&gt;
🧩 Supports distributed tracing and source map integration.&lt;br&gt;&lt;br&gt;
🎥 Session replay for user-based debugging.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. New Relic
&lt;/h3&gt;

&lt;p&gt;🌐 Full-stack observability for SSR, API, and client-side tracking.&lt;br&gt;&lt;br&gt;
⚙️ Deep Next.js integration with &lt;code&gt;@newrelic/next&lt;/code&gt;.&lt;br&gt;&lt;br&gt;
📊 Actionable insights and dashboards.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. SigNoz
&lt;/h3&gt;

&lt;p&gt;🔍 OpenTelemetry-based performance tracking.&lt;br&gt;&lt;br&gt;
📈 Visuals like flamegraphs and Gantt charts for performance bottlenecks.&lt;br&gt;&lt;br&gt;
📂 Pre-configured dashboards for traces and metrics.&lt;/p&gt;




&lt;h3&gt;
  
  
  4. Datadog
&lt;/h3&gt;

&lt;p&gt;⏱️ Real-time monitoring of applications and infrastructure.&lt;br&gt;&lt;br&gt;
🧪 Synthetic testing and step-by-step transaction tracking.&lt;br&gt;&lt;br&gt;
📦 Combines APM, logs, and RUM in one place.&lt;/p&gt;




&lt;h3&gt;
  
  
  5. Middleware
&lt;/h3&gt;

&lt;p&gt;🧠 Real User Monitoring (RUM) + synthetic testing.&lt;br&gt;&lt;br&gt;
📺 Visual performance dashboards.&lt;br&gt;&lt;br&gt;
✅ Designed for modern full-stack apps.&lt;/p&gt;




&lt;h3&gt;
  
  
  6. Dotcom-Monitor
&lt;/h3&gt;

&lt;p&gt;🌍 Global uptime and performance monitoring.&lt;br&gt;&lt;br&gt;
🧪 Real browser testing and smart alerting.&lt;br&gt;&lt;br&gt;
📥 Detailed and customizable reporting.&lt;/p&gt;




&lt;h3&gt;
  
  
  7. Sematext
&lt;/h3&gt;

&lt;p&gt;🌤 Cloud-based monitoring platform for apps, servers, and user interactions.&lt;br&gt;&lt;br&gt;
📣 Alerts and performance anomaly detection.&lt;br&gt;&lt;br&gt;
📊 Metrics, logs, and traces in one UI.&lt;/p&gt;




&lt;h3&gt;
  
  
  8. Dynatrace
&lt;/h3&gt;

&lt;p&gt;🤖 AI-powered monitoring for apps, infra, and user sessions.&lt;br&gt;&lt;br&gt;
📉 Business-impact prioritization of issues.&lt;br&gt;&lt;br&gt;
🧩 End-to-end observability including custom metrics.&lt;/p&gt;




&lt;h3&gt;
  
  
  9. LogRocket
&lt;/h3&gt;

&lt;p&gt;🎥 Session replay to reproduce bugs visually.&lt;br&gt;&lt;br&gt;
🛠️ Tracks console errors, slow interactions, and UI glitches.&lt;br&gt;&lt;br&gt;
📈 Performance data combined with user behavior.&lt;/p&gt;




&lt;h3&gt;
  
  
  10. AppSignal
&lt;/h3&gt;

&lt;p&gt;🧪 Error tracking, performance monitoring, and custom metrics.&lt;br&gt;&lt;br&gt;
📉 Lightweight and optimized for Next.js and serverless apps.&lt;br&gt;&lt;br&gt;
📦 Built-in anomaly detection and easy setup.&lt;/p&gt;




&lt;h3&gt;
  
  
  11. Upptime
&lt;/h3&gt;

&lt;p&gt;🕒 GitHub-powered uptime monitor using GitHub Actions.&lt;br&gt;&lt;br&gt;
🌐 Self-hosted and open-source status page generation.&lt;br&gt;&lt;br&gt;
📬 Slack &amp;amp; email alerts supported.&lt;/p&gt;




&lt;h3&gt;
  
  
  12. Highlight.io
&lt;/h3&gt;

&lt;p&gt;🎞️ Session replay + frontend &amp;amp; backend observability.&lt;br&gt;&lt;br&gt;
🔍 Full visibility into logs, traces, and performance in one view.&lt;br&gt;&lt;br&gt;
⚡ Built for modern JS frameworks like Next.js.&lt;/p&gt;




&lt;h3&gt;
  
  
  13. BetterStack (formerly Better Uptime)
&lt;/h3&gt;

&lt;p&gt;📡 Uptime &amp;amp; incident monitoring with on-call scheduling.&lt;br&gt;&lt;br&gt;
🧠 Smart incident resolution workflows.&lt;br&gt;&lt;br&gt;
📱 Mobile and Slack notifications with clean status pages.&lt;/p&gt;




&lt;h3&gt;
  
  
  14. Elastic Observability (Elastic APM)
&lt;/h3&gt;

&lt;p&gt;🌐 Integrated logging, metrics, and tracing via the Elastic Stack.&lt;br&gt;&lt;br&gt;
📈 Great for advanced analytics and full-text search on logs.&lt;br&gt;&lt;br&gt;
⚙️ OpenTelemetry support for wide compatibility.&lt;/p&gt;




&lt;h3&gt;
  
  
  15. Raygun
&lt;/h3&gt;

&lt;p&gt;💥 Real-time error and crash reporting with performance monitoring.&lt;br&gt;&lt;br&gt;
📲 User-centric diagnostics.&lt;br&gt;&lt;br&gt;
🎯 Focused on front-end experience tracking and load time metrics.&lt;/p&gt;




&lt;h3&gt;
  
  
  16. StatusCake
&lt;/h3&gt;

&lt;p&gt;🧪 Simple and effective uptime and performance testing.&lt;br&gt;&lt;br&gt;
🌍 Multiple test locations for global visibility.&lt;br&gt;&lt;br&gt;
📧 Alerting integrations with email, SMS, Slack, and more.&lt;/p&gt;




&lt;h3&gt;
  
  
  17. Airbrake
&lt;/h3&gt;

&lt;p&gt;⚠️ Exception tracking for client and server errors.&lt;br&gt;&lt;br&gt;
📦 Performance analytics and deploy tracking.&lt;br&gt;&lt;br&gt;
🎛️ Lightweight and dev-friendly.&lt;/p&gt;




&lt;h3&gt;
  
  
  18. Instana
&lt;/h3&gt;

&lt;p&gt;🤖 AI-assisted APM tool with distributed tracing.&lt;br&gt;&lt;br&gt;
⚙️ Automatic service discovery and dependency mapping.&lt;br&gt;&lt;br&gt;
🚀 Built for dynamic apps and microservices.&lt;/p&gt;




&lt;h3&gt;
  
  
  19. Netdata
&lt;/h3&gt;

&lt;p&gt;📊 High-frequency monitoring with real-time metrics.&lt;br&gt;&lt;br&gt;
🖥️ Beautiful, interactive dashboards for system-level tracking.&lt;br&gt;&lt;br&gt;
🧩 Works well alongside Next.js server monitoring.&lt;/p&gt;




&lt;h3&gt;
  
  
  20. Grafana + Prometheus
&lt;/h3&gt;

&lt;p&gt;📈 Advanced dashboarding and alerting system.&lt;br&gt;&lt;br&gt;
⚙️ Custom instrumentation via Prometheus metrics.&lt;br&gt;&lt;br&gt;
🌐 Ideal for teams who want full control over their observability stack.&lt;/p&gt;




</description>
      <category>nextjs</category>
      <category>react</category>
      <category>javascript</category>
      <category>frontend</category>
    </item>
    <item>
      <title>React Checklist: 9 Tips to Avoid Bugs 🐞</title>
      <dc:creator>Joodi</dc:creator>
      <pubDate>Mon, 14 Apr 2025 18:04:45 +0000</pubDate>
      <link>https://dev.to/joodi/react-checklist-9-tips-to-avoid-bugs-5979</link>
      <guid>https://dev.to/joodi/react-checklist-9-tips-to-avoid-bugs-5979</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6xs5ksa0lkcyl49diez0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6xs5ksa0lkcyl49diez0.png" alt="Image description" width="800" height="204"&gt;&lt;/a&gt;&lt;br&gt;
Today, I'll be sharing a checklist for reviewing React applications.&lt;/p&gt;

&lt;p&gt;Take a quick look at it before committing your changes — this will boost your confidence and help you catch those tricky errors.&lt;/p&gt;

&lt;p&gt;We'll start by going through each point in detail, and at the end, you'll find the complete list without comments for future reference.&lt;/p&gt;

&lt;p&gt;1️⃣ &lt;strong&gt;Every list item has a unique key&lt;/strong&gt; 🔑&lt;/p&gt;

&lt;p&gt;Keys allow React to track changes in list items during rendering. Missing or unstable keys can cause unpredictable behavior during re-renders.&lt;/p&gt;

&lt;p&gt;Make sure each element has a unique key that remains consistent across renders.&lt;/p&gt;

&lt;p&gt;It's best to use an element's ID from the database or any other unique value.&lt;/p&gt;
&lt;h2&gt;
  
  
  Avoid using the array index as a key unless your array is static, as it doesn't prevent unnecessary re-renders.
&lt;/h2&gt;

&lt;p&gt;2️⃣ &lt;strong&gt;When calling setState, only use the parameter for the previous value&lt;/strong&gt; ⚠️&lt;/p&gt;

&lt;p&gt;If state updates depend on the current value, avoid directly using the old value:&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="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="nx"&gt;React&lt;/span&gt;&lt;span class="p"&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;span class="c1"&gt;// Direct update ❌&lt;/span&gt;
&lt;span class="nf"&gt;setCount&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="c1"&gt;// Use the parameterized value ✅&lt;/span&gt;
&lt;span class="nf"&gt;setCount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prevCount&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;prevCount&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;setState&lt;/code&gt; function in React is asynchronous for performance optimization.&lt;/p&gt;

&lt;p&gt;When &lt;code&gt;setState&lt;/code&gt; is called multiple times in quick succession, using the functional syntax ensures each update is based on the most recent state.&lt;/p&gt;




&lt;p&gt;3️⃣ &lt;strong&gt;Objects and arrays are not directly mutated when calling setState&lt;/strong&gt; 🚫&lt;/p&gt;

&lt;p&gt;When updating state, always create a new copy of the data rather than directly mutating the original array or object.&lt;/p&gt;

&lt;p&gt;Methods like &lt;code&gt;.push()&lt;/code&gt;, &lt;code&gt;.pop()&lt;/code&gt;, or mutating objects can cause unpredictable bugs.&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="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setItems&lt;/span&gt;&lt;span class="p"&gt;]&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;useState&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;addItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;newItem&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;newItem&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Mutation&lt;/span&gt;
  &lt;span class="nf"&gt;setItems&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the reference to the object doesn't change, React might not trigger a re-render.&lt;/p&gt;

&lt;p&gt;Always use methods that return a new copy of the original data, or manually create a copy before updating the state.&lt;/p&gt;




&lt;p&gt;4️⃣ &lt;strong&gt;Hooks have neither excessive nor missing dependencies&lt;/strong&gt; ⚠️&lt;/p&gt;

&lt;p&gt;If dependencies are missing, your hook may not have the relevant data when it runs, and in the case of &lt;code&gt;useEffect&lt;/code&gt;, it may not be triggered at all.&lt;/p&gt;

&lt;p&gt;On the other hand, excessive dependencies cause unnecessary re-renders and, in the worst case, can lead to an infinite loop.&lt;/p&gt;

&lt;p&gt;Make sure to include all variables, functions, and memoized values used inside the hook in the dependency array.&lt;/p&gt;

&lt;p&gt;Global variables or constants don't need to be listed.&lt;/p&gt;

&lt;p&gt;To help you manage this, ESLint has a rule called &lt;code&gt;react-hooks/exhaustive-deps&lt;/code&gt; — it will ensure you list the dependencies correctly. Avoid disabling this rule unless you have a solid reason.&lt;/p&gt;

&lt;p&gt;The worst case is completely omitting the dependency array, which can cause unpredictable behavior.&lt;/p&gt;




&lt;p&gt;5️⃣ &lt;strong&gt;Heavy computations are memoized, and there are no inline objects or callbacks&lt;/strong&gt; 🧠&lt;/p&gt;

&lt;p&gt;This is the "silent killer" of performance.&lt;/p&gt;

&lt;p&gt;Any objects or functions placed directly in JSX will be recreated on every render.&lt;/p&gt;

&lt;p&gt;This can cause unnecessary re-renders of child components, as the reference is different from the previous render.&lt;/p&gt;

&lt;p&gt;To prevent this, move the logic outside of JSX.&lt;/p&gt;

&lt;p&gt;If the computation is intensive or the function relies on multiple parameters, make sure to wrap it in &lt;code&gt;useMemo&lt;/code&gt; or &lt;code&gt;useCallback&lt;/code&gt; to memoize it and improve performance.&lt;/p&gt;




&lt;p&gt;6️⃣ &lt;strong&gt;All subscriptions are cleaned up on unmount&lt;/strong&gt; 🧹&lt;/p&gt;

&lt;p&gt;The application might continue running code even after the component has unmounted, leading to memory leaks, errors, and unpredictable behavior.&lt;/p&gt;

&lt;p&gt;If you use &lt;code&gt;setTimeout&lt;/code&gt;, &lt;code&gt;setInterval&lt;/code&gt;, &lt;code&gt;addEventListener&lt;/code&gt;, or make asynchronous requests or subscriptions inside &lt;code&gt;useEffect&lt;/code&gt;, make sure to clean them up when the component unmounts.&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;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;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;setInterval&lt;/span&gt;&lt;span class="p"&gt;(...);&lt;/span&gt;

  &lt;span class="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="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;clearInterval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Clean up&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;In modern browsers, you can also use &lt;code&gt;AbortController&lt;/code&gt; to cancel API requests when the component unmounts.&lt;/p&gt;




&lt;p&gt;7️⃣ &lt;strong&gt;There are no references to ref.current in the render body&lt;/strong&gt; 🚫&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ref.current&lt;/code&gt; is not initialized during the first render and will be &lt;code&gt;null&lt;/code&gt;. The element will only be mounted after the first render pass.&lt;/p&gt;

&lt;p&gt;Accessing it directly within the component body can cause errors and unpredictable behavior.&lt;/p&gt;

&lt;p&gt;Instead, use &lt;code&gt;useEffect&lt;/code&gt; or &lt;code&gt;useLayoutEffect&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;function&lt;/span&gt; &lt;span class="nf"&gt;MyComponent&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;divRef&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="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;container&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setContainer&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;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="nf"&gt;setContainer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;divRef&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;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="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;container&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// Your logic here&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;container&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;divRef&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;Example&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By the time &lt;code&gt;useEffect&lt;/code&gt; is triggered, &lt;code&gt;divRef&lt;/code&gt; will be properly initialized.&lt;/p&gt;




&lt;p&gt;8️⃣ &lt;strong&gt;Avoid side-effects inside JSX&lt;/strong&gt; ⚡&lt;/p&gt;

&lt;p&gt;Side-effects, such as API calls or modifying state, should never be executed inside JSX. This is because JSX is meant for rendering only, and putting logic inside JSX can lead to unexpected behaviors.&lt;/p&gt;

&lt;p&gt;Instead, handle side-effects in &lt;code&gt;useEffect&lt;/code&gt; or other hooks, and keep JSX purely for rendering.&lt;/p&gt;

&lt;p&gt;Example of incorrect usage:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&amp;gt; /&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;Avoid&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nx"&gt;Side&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;effect&lt;/span&gt; &lt;span class="nx"&gt;inside&lt;/span&gt; &lt;span class="nx"&gt;JSX&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead, do this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;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="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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Data&lt;/span&gt; &lt;span class="nx"&gt;loaded&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;9️⃣ Ensure proper accessibility with ARIA attributes ♿&lt;/p&gt;

&lt;p&gt;Accessibility should always be a priority in React applications. Make sure to use appropriate ARIA attributes for interactive elements like buttons, links, and form controls.&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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="nx"&gt;aria&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Close&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;close&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;X&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This ensures that screen readers and assistive technologies can properly interpret the component and provide the necessary information to users with disabilities.&lt;/p&gt;




&lt;h3&gt;
  
  
  Recap: The Complete List 🎯
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Every list item has a unique key 🔑
&lt;/li&gt;
&lt;li&gt;When calling &lt;code&gt;setState&lt;/code&gt;, only use the parameter for the previous value ⏪
&lt;/li&gt;
&lt;li&gt;Objects and arrays are not directly mutated when calling &lt;code&gt;setState&lt;/code&gt; 🛑
&lt;/li&gt;
&lt;li&gt;Hooks have neither excessive nor missing dependencies 🔄
&lt;/li&gt;
&lt;li&gt;Heavy computations are memoized, and there are no inline objects or callbacks ⚡
&lt;/li&gt;
&lt;li&gt;All subscriptions are cleaned up on unmount 🧹
&lt;/li&gt;
&lt;li&gt;There are no references to &lt;code&gt;ref.current&lt;/code&gt; in the render body 🚫
&lt;/li&gt;
&lt;li&gt;Avoid side-effects inside JSX ⚡
&lt;/li&gt;
&lt;li&gt;Ensure proper accessibility with ARIA attributes ♿
&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>react</category>
      <category>javascript</category>
      <category>frontend</category>
      <category>nextjs</category>
    </item>
    <item>
      <title>What’s new in Next.js 15.3</title>
      <dc:creator>Joodi</dc:creator>
      <pubDate>Mon, 14 Apr 2025 17:33:49 +0000</pubDate>
      <link>https://dev.to/joodi/whats-new-in-nextjs-153-mee</link>
      <guid>https://dev.to/joodi/whats-new-in-nextjs-153-mee</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1m4dso89d8pwdybvuv62.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1m4dso89d8pwdybvuv62.png" alt="Image description" width="800" height="418"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next.js 15.3 introduces powerful new features that improve build performance, observability, and overall developer control. With the alpha release of &lt;code&gt;next build --turbopack&lt;/code&gt;, client-side navigation hooks, better TypeScript support for large projects, and the experimental Rspack integration, this release is packed with tools to enhance your applications.&lt;/p&gt;

&lt;p&gt;Here's a breakdown of the most exciting updates in Next.js 15.3:&lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 &lt;strong&gt;Turbopack: Lightning-Fast Builds &amp;amp; Configuration&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Turbopack (Alpha Release)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The Turbopack alpha release extends the ultra-fast development performance into production builds. After the stable release of &lt;code&gt;next dev --turbopack&lt;/code&gt;, over 50% of Next.js development sessions have adopted Turbopack.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Features:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Test Coverage&lt;/strong&gt;: Over 99% of integration tests pass with &lt;code&gt;next build --turbopack&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compatibility&lt;/strong&gt;: If &lt;code&gt;next dev --turbopack&lt;/code&gt; works for your app, then &lt;code&gt;next build --turbopack&lt;/code&gt; will likely work as well.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Alpha Phase Warning&lt;/strong&gt;: Although Turbopack offers significant performance gains, it is still in the alpha stage. It's best suited for preview or staging environments.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Performance Improvements:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;On 4 CPU cores: 28% faster builds compared to Webpack.&lt;/li&gt;
&lt;li&gt;On 16 CPU cores: 60% faster.&lt;/li&gt;
&lt;li&gt;On 30 CPU cores: 83% faster build time.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Turbopack Configuration (Stable)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Next.js 15.3 introduces a more streamlined way to configure Turbopack. The configuration has been moved from &lt;code&gt;experimental.turbo&lt;/code&gt; to the top-level &lt;code&gt;turbopack&lt;/code&gt; key.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;NextConfig&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;next&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;nextConfig&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;NextConfig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;turbopack&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;rules&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;*.svg&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;loaders&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;@svgr/webpack&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="na"&gt;as&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;*.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;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;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;nextConfig&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For backward compatibility, the &lt;code&gt;experimental.turbo&lt;/code&gt; option will still be supported until the next major release.&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚙️ &lt;strong&gt;Navigation &amp;amp; Client Instrumentation Hooks&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Next.js 15.3 brings powerful hooks that enhance client-side routing and lifecycle observability:&lt;/p&gt;

&lt;h3&gt;
  
  
  Client Instrumentation Hook
&lt;/h3&gt;

&lt;p&gt;This new hook enables you to run monitoring and analytics code before the frontend code executes. It's perfect for performance tracking, error monitoring, and other observability tools at the start of the lifecycle.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Set up performance monitoring&lt;/span&gt;
&lt;span class="nx"&gt;performance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mark&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;app-init&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Initialize analytics&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;Analytics initialized&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Set up error tracking&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="s1"&gt;error&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;reportError&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;error&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;
  
  
  Navigation Hooks
&lt;/h3&gt;

&lt;p&gt;These new hooks offer finer control over client-side routing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;onNavigate&lt;/strong&gt;: Triggered during client-side navigation, giving you control over routing behavior, code execution, and even the ability to cancel navigation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;useLinkStatus&lt;/strong&gt;: Lets you check the status of navigation with a pending boolean, useful for showing localized loading indicators.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These hooks improve the flexibility and observability of your application's navigation.&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚡ &lt;strong&gt;TypeScript Plugin Performance Enhancements&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Next.js has significantly optimized the TypeScript plugin (LSP) for large codebases, improving plugin response times by 60%. This makes it easier to work with large projects by enhancing features like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Validation&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Component prop hints&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Configuration autocompletion&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Error detection in React Server Components&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These improvements offer a smoother experience for developers working with large applications.&lt;/p&gt;

&lt;h2&gt;
  
  
  🔧 &lt;strong&gt;Rspack Community Support (Experimental)&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Next.js now offers community support for Rspack, an alternative bundler with near-identical Webpack API compatibility. This option is for users who aren't yet ready to switch to Turbopack but still want faster builds. The &lt;code&gt;next-rspack&lt;/code&gt; adapter integrates Rspack into Next.js and passes 96% of tests in the Next.js integration suite.&lt;/p&gt;

&lt;h2&gt;
  
  
  🛠️ &lt;strong&gt;Other Features &amp;amp; Improvements&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Improved Image Handling&lt;/strong&gt;: The new &lt;code&gt;URL()&lt;/code&gt; support for &lt;code&gt;images.remotePatterns&lt;/code&gt; enhances image handling in Next.js.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Separated Viewport Options&lt;/strong&gt;: Viewport settings are now separated from metadata for clearer control.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;unstable_dynamicOnHover&lt;/code&gt; Option&lt;/strong&gt;: Experimental feature for handling dynamic content based on hover events.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pinterest Rich Pins Support&lt;/strong&gt;: Enhanced integration with Pinterest, improving how content appears on the platform.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Revalidate Enhancements&lt;/strong&gt;: Works better with redirects in Route Handlers, ensuring consistency after calling &lt;code&gt;revalidate&lt;/code&gt; in Server Actions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Faster PNG to AVIF Conversion&lt;/strong&gt;: With an upgrade to the Sharp library, PNG-to-AVIF conversion is now faster and more efficient.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These updates bring numerous performance, compatibility, and developer productivity improvements, making Next.js 15.3 a significant step forward for web developers.&lt;/p&gt;

</description>
      <category>nextjs</category>
      <category>react</category>
      <category>javascript</category>
      <category>frontend</category>
    </item>
  </channel>
</rss>
