<?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: Jonathan Idioseph</title>
    <description>The latest articles on DEV Community by Jonathan Idioseph (@idioseph).</description>
    <link>https://dev.to/idioseph</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%2F1691654%2Fae0612a3-cc0b-4f5f-abf7-dc81c83392fe.jpg</url>
      <title>DEV Community: Jonathan Idioseph</title>
      <link>https://dev.to/idioseph</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/idioseph"/>
    <language>en</language>
    <item>
      <title>Why Websites Feel Slow, And How I Fix It as a Frontend Developer</title>
      <dc:creator>Jonathan Idioseph</dc:creator>
      <pubDate>Thu, 21 Aug 2025 11:54:38 +0000</pubDate>
      <link>https://dev.to/idioseph/why-websites-feel-slow-and-how-i-fix-it-as-a-frontend-developer-5a4d</link>
      <guid>https://dev.to/idioseph/why-websites-feel-slow-and-how-i-fix-it-as-a-frontend-developer-5a4d</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;1. Introduction&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;A few months ago, I clicked on a website that took 8 seconds to load on my phone.&lt;br&gt;
Guess what? I closed it.&lt;/p&gt;

&lt;p&gt;And I wasn’t alone, research shows that most users leave if a site doesn’t load in under 3 seconds.&lt;/p&gt;

&lt;p&gt;This is why performance is one of the first things I think about when building. With tools like Next.js (and especially the new App Router), I’ve seen how much easier it is to build apps that feel fast by default.&lt;/p&gt;


&lt;h2&gt;
  
  
  &lt;strong&gt;2. Why Website Speed Matters&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;It’s not just about being “nice to have.” Website performance impacts the business directly:&lt;/p&gt;

&lt;p&gt;People leave slow websites → Lost customers.&lt;br&gt;
Google ranks faster websites higher → Better visibility.&lt;br&gt;
Speed builds trust → Users stay longer and interact more.&lt;/p&gt;

&lt;p&gt;A slow site isn’t just annoying. It’s expensive.&lt;/p&gt;


&lt;h2&gt;
  
  
  &lt;strong&gt;3. The Usual Suspects Behind Slow Websites&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;In my experience (working on projects like &lt;strong&gt;HotBuyMart&lt;/strong&gt;, an E-commerce SaaS, and &lt;strong&gt;Intelcampus&lt;/strong&gt;), these are the main causes:&lt;/p&gt;

&lt;p&gt;🖼️ &lt;strong&gt;Unoptimized Images&lt;/strong&gt; → Serving 5MB images when a 200KB version would do.&lt;br&gt;
📦 &lt;strong&gt;Huge JavaScript Bundles&lt;/strong&gt; → Loading code the user doesn’t even need right away.&lt;br&gt;
🔄 &lt;strong&gt;No Caching/CDN&lt;/strong&gt; → Every request goes back to the origin server instead of nearby edge servers.&lt;br&gt;
⏳ &lt;strong&gt;Blocking Scripts&lt;/strong&gt; → Code that “freezes” the browser before the page can render.&lt;/p&gt;


&lt;h2&gt;
  
  
  &lt;strong&gt;4. How I Fix It (Practical Approaches)&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Here are some battle-tested techniques I use to make apps faster:&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Optimized Images&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Instead of manually resizing, I use Next.js’ &lt;code&gt;&amp;lt;Image&amp;gt;&lt;/code&gt; component. It automatically serves the right size and format depending on the device.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Image&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/image&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Image&lt;/span&gt; &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/product.jpg&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;width&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;600&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;height&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;alt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Product&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Result →&lt;/strong&gt; faster loads, fewer frustrated mobile users.&lt;/p&gt;




&lt;p&gt;✅ &lt;strong&gt;Code Splitting &amp;amp; Lazy Loading&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not all code needs to load upfront. With dynamic imports, users only download what they need:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Chart&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;dynamic&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../components/Chart&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;ssr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Result →&lt;/strong&gt; Initial page loads quickly, heavy components load later.&lt;/p&gt;




&lt;p&gt;✅ &lt;strong&gt;Static Site Generation (SSG)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Pages are pre-built at build time and served instantly from the CDN.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;generateStaticParams&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;products&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;getProducts&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;products&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;p&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Result →&lt;/strong&gt; Near-instant loads.&lt;/p&gt;




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

&lt;p&gt;I configure caching headers and leverage edge networks so frequently accessed data doesn’t always hit the origin server.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Result →&lt;/strong&gt; Users get content faster, especially across different regions.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;5. How the Next.js App Router Supercharges This&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;When Next.js introduced the App Router (from v13+), it changed the game. Performance is no longer something you “add later”, it’s baked into how you structure your app.&lt;/p&gt;

&lt;p&gt;Here’s why it’s a powerhouse:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Server Components&lt;/strong&gt; → Heavy lifting is done on the server. Users download less JS.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nested Layouts&lt;/strong&gt; → Shared UI (like navbars/sidebars) doesn’t reload every time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Streaming &amp;amp; Suspense&lt;/strong&gt; → Parts of a page appear progressively instead of waiting for everything.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Server Actions&lt;/strong&gt; → Handle form submissions and mutations without writing extra API routes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Colocation&lt;/strong&gt; → Routes, error states, and loading states live in the same folder → cleaner architecture.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Loading States (&lt;code&gt;loading.tsx&lt;/code&gt;)&lt;/strong&gt; → Even if something takes a few seconds, showing a loading state immediately makes users &lt;em&gt;feel&lt;/em&gt; like the app is responsive.&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 tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// app/dashboard/loading.tsx&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Loading&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Loading dashboard...&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Whenever &lt;code&gt;/dashboard&lt;/code&gt; is loading (like fetching data), this file automatically shows until the content is ready.&lt;/p&gt;

&lt;p&gt;👉 It doesn’t literally make the server faster, but it makes the &lt;strong&gt;experience&lt;/strong&gt; faster because users get instant feedback.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;From my work at Billsalert&lt;/strong&gt; → While redesigning the website, I used layouts and server components so the navigation never reloaded, but users could still see live pricing updates. The result? Pages felt instant, even with dynamic data.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;6. Real-World Wins&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Billsalert (Website Redesign)&lt;/strong&gt;&lt;br&gt;
→ Used SSG + optimized images + App Router layouts.&lt;br&gt;
→ Reduced load times and improved the overall UX.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Intelcampus (Quiz Platform)&lt;/strong&gt;&lt;br&gt;
→ Leveraged caching + App Router streaming.&lt;br&gt;
→ Allowed 1,000+ students to take quizzes simultaneously without lag.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;7. Why This Matters for Businesses&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;✅ Faster apps → more conversions &amp;amp; sales.&lt;br&gt;
✅ Better performance → stronger SEO rankings.&lt;br&gt;
✅ Modern architecture → scalable apps that grow with your users.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;8. Final Takeaway&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;A slow website isn’t just frustrating. It costs users, customers, and revenue.&lt;/p&gt;

&lt;p&gt;By combining smart optimization practices with the Next.js App Router, I don’t just build apps. I build fast, scalable, and delightful experiences that users want to come back to.&lt;/p&gt;

&lt;p&gt;Here is a Summary for your Notes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Optimize images&lt;/li&gt;
&lt;li&gt;Split code + lazy load heavy parts&lt;/li&gt;
&lt;li&gt;Cache smartly&lt;/li&gt;
&lt;li&gt;Use App Router features (server components, nested layouts, streaming, loading.tsx)&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>nextjs</category>
      <category>javascript</category>
      <category>programming</category>
    </item>
    <item>
      <title>Everything You Need to Know About JavaScript’s this Keyword</title>
      <dc:creator>Jonathan Idioseph</dc:creator>
      <pubDate>Wed, 20 Aug 2025 10:34:42 +0000</pubDate>
      <link>https://dev.to/idioseph/everything-you-need-to-know-about-javascripts-this-keyword-11b4</link>
      <guid>https://dev.to/idioseph/everything-you-need-to-know-about-javascripts-this-keyword-11b4</guid>
      <description>&lt;h3&gt;
  
  
  &lt;strong&gt;1. Why I Care About &lt;code&gt;this&lt;/code&gt;&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;I once broke my app because I didn’t know what &lt;code&gt;this&lt;/code&gt; pointed to.&lt;br&gt;
Spoiler: it wasn’t my object.&lt;/p&gt;

&lt;p&gt;If you’ve ever seen &lt;code&gt;undefined&lt;/code&gt; or &lt;code&gt;TypeError: cannot read property of undefined&lt;/code&gt; when using &lt;code&gt;this&lt;/code&gt;, welcome to the club. Let’s break it down so you never have to guess again.&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%2Flgr97rpl5qz9f7zlg2gs.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%2Flgr97rpl5qz9f7zlg2gs.png" alt=" " width="606" height="1000"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  &lt;strong&gt;2. What is &lt;code&gt;this&lt;/code&gt;?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;👉 &lt;code&gt;this&lt;/code&gt; is a &lt;strong&gt;special keyword automatically created when a function is called.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It’s not about where the function was written, it’s about &lt;strong&gt;who is calling it at that moment&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;JavaScript created &lt;code&gt;this&lt;/code&gt; so methods could easily refer back to their owner object without repeating the object’s name every time.&lt;/p&gt;

&lt;p&gt;Think of it like pronouns in English:&lt;br&gt;
Instead of saying:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Jonathan is writing Jonathan’s article.”&lt;br&gt;
We say:&lt;br&gt;
“Jonathan is writing &lt;strong&gt;his&lt;/strong&gt; article.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Here, &lt;code&gt;this&lt;/code&gt; is like “his”, a shortcut to the current owner.&lt;/p&gt;


&lt;h3&gt;
  
  
  &lt;strong&gt;3. &lt;code&gt;this&lt;/code&gt; in Normal Functions&lt;/strong&gt;
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;person&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Jonathan&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hello, my name is &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nx"&gt;person&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; 
&lt;span class="c1"&gt;// "Hello, my name is Jonathan"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Here, the object &lt;code&gt;person&lt;/code&gt; is calling &lt;code&gt;greet&lt;/code&gt;, so inside the function, &lt;code&gt;this&lt;/code&gt; = &lt;code&gt;person&lt;/code&gt;.&lt;/p&gt;


&lt;h3&gt;
  
  
  &lt;strong&gt;4. &lt;code&gt;this&lt;/code&gt; in Arrow Functions&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;This is where most developers get confused.&lt;br&gt;
Arrow functions &lt;strong&gt;do not&lt;/strong&gt; create their own &lt;code&gt;this&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Instead, they “look up” and &lt;strong&gt;borrow &lt;code&gt;this&lt;/code&gt; from the surrounding code&lt;/strong&gt; (the lexical scope).&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;person&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Jonathan&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hello, my name is &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nx"&gt;person&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="c1"&gt;// "Hello, my name is undefined"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why &lt;code&gt;undefined&lt;/code&gt;?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The arrow function &lt;code&gt;greet&lt;/code&gt; doesn’t bind its own &lt;code&gt;this&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;It borrows &lt;code&gt;this&lt;/code&gt; from the environment where it was created, in this case, the global scope (not &lt;code&gt;person&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;In strict mode, global &lt;code&gt;this&lt;/code&gt; is &lt;code&gt;undefined&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ When should you use arrow functions then?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Great for callbacks (like inside &lt;code&gt;setTimeout&lt;/code&gt; or &lt;code&gt;map&lt;/code&gt;) where you want to use the &lt;code&gt;this&lt;/code&gt; of the outer function.&lt;/li&gt;
&lt;li&gt;Bad for object methods, because they won’t refer to the object itself.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So remember:&lt;br&gt;
👉 Arrow functions = “use the &lt;code&gt;this&lt;/code&gt; of where I live”&lt;br&gt;
👉 Normal functions = “create my own &lt;code&gt;this&lt;/code&gt; when called”&lt;/p&gt;


&lt;h3&gt;
  
  
  &lt;strong&gt;5. Common Situations Where &lt;code&gt;this&lt;/code&gt; Trips You Up&lt;/strong&gt;
&lt;/h3&gt;
&lt;h4&gt;
  
  
  &lt;strong&gt;❌ Lost &lt;code&gt;this&lt;/code&gt; in Callbacks&lt;/strong&gt;
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;person&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Jonathan&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hello, &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;1000&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;person&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; 
&lt;span class="c1"&gt;// "Hello, undefined"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Why &lt;code&gt;undefined&lt;/code&gt;?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The function inside &lt;code&gt;setTimeout&lt;/code&gt; is a plain function.&lt;/li&gt;
&lt;li&gt;Nobody “owns” that callback when it runs.&lt;/li&gt;
&lt;li&gt;So &lt;code&gt;this&lt;/code&gt; defaults to the global object (&lt;code&gt;window&lt;/code&gt; in browsers) → which has no &lt;code&gt;name&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ Fix with an arrow function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hello, &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;1000&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, the arrow function borrows &lt;code&gt;this&lt;/code&gt; from &lt;code&gt;greet&lt;/code&gt;, which correctly points to &lt;code&gt;person&lt;/code&gt;.&lt;/p&gt;




&lt;h4&gt;
  
  
  &lt;strong&gt;❌ Forgetting &lt;code&gt;bind&lt;/code&gt;&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;button&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;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Clicked!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;handleClick&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&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;button&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;click&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;handleClick&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// undefined&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why &lt;code&gt;undefined&lt;/code&gt;?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When you pass &lt;code&gt;app.handleClick&lt;/code&gt; directly, the function gets detached.&lt;/li&gt;
&lt;li&gt;It’s called without an owner object.&lt;/li&gt;
&lt;li&gt;So again, &lt;code&gt;this&lt;/code&gt; defaults to global → no &lt;code&gt;text&lt;/code&gt; found.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ Fix with &lt;code&gt;.bind&lt;/code&gt; (glues &lt;code&gt;this&lt;/code&gt; to &lt;code&gt;app&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;button&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;click&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;handleClick&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ Or wrap it in an arrow function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;button&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;click&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;handleClick&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  &lt;strong&gt;6. The Golden Rule&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;👉 &lt;code&gt;this&lt;/code&gt; is not about where a function is written, but &lt;strong&gt;how it is called&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That’s the rule. Once you get that, everything clicks.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;7. Quick Reference (Copy This!)&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;In &lt;strong&gt;methods&lt;/strong&gt; → &lt;code&gt;this&lt;/code&gt; = the object calling it&lt;/li&gt;
&lt;li&gt;In &lt;strong&gt;functions&lt;/strong&gt; (strict mode) → &lt;code&gt;this&lt;/code&gt; = undefined&lt;/li&gt;
&lt;li&gt;In &lt;strong&gt;functions&lt;/strong&gt; (non-strict) → &lt;code&gt;this&lt;/code&gt; = global object&lt;/li&gt;
&lt;li&gt;In &lt;strong&gt;arrow functions&lt;/strong&gt; → &lt;code&gt;this&lt;/code&gt; = borrowed from surrounding scope&lt;/li&gt;
&lt;li&gt;With &lt;strong&gt;.call/.apply/.bind&lt;/strong&gt; → you manually set &lt;code&gt;this&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;The &lt;code&gt;this&lt;/code&gt; keyword isn’t broken or magical, it’s just contextual.&lt;br&gt;
It was designed to make object methods simpler.&lt;/p&gt;

&lt;p&gt;Once you remember: &lt;em&gt;“&lt;code&gt;this&lt;/code&gt; depends on how the function is called, not where it’s written”&lt;/em&gt;, the confusion melts away.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>programming</category>
      <category>ai</category>
    </item>
    <item>
      <title>🍝 Spaghetti Code: Why Your App Breaks When You Touch One Line</title>
      <dc:creator>Jonathan Idioseph</dc:creator>
      <pubDate>Sun, 17 Aug 2025 09:13:15 +0000</pubDate>
      <link>https://dev.to/idioseph/spaghetti-code-why-your-app-breaks-when-you-touch-one-line-4n9g</link>
      <guid>https://dev.to/idioseph/spaghetti-code-why-your-app-breaks-when-you-touch-one-line-4n9g</guid>
      <description>&lt;p&gt;We’ve all been there.&lt;/p&gt;

&lt;p&gt;You change one tiny line of code… and suddenly &lt;strong&gt;five other parts of your app explode&lt;/strong&gt;. That’s not a feature. That’s &lt;strong&gt;spaghetti code&lt;/strong&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%2Fayxw43n4iqk97wlghlal.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%2Fayxw43n4iqk97wlghlal.png" alt=" " width="800" height="502"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But what exactly is spaghetti code, and how do we avoid writing it?&lt;/p&gt;

&lt;h2&gt;
  
  
  🍝 What is Spaghetti Code?
&lt;/h2&gt;

&lt;p&gt;Spaghetti code is messy, tangled code where &lt;strong&gt;everything depends on everything else&lt;/strong&gt;. Like a plate of spaghetti, it’s hard to know which strand leads where.&lt;/p&gt;

&lt;p&gt;It often looks like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No clear structure or architecture&lt;/li&gt;
&lt;li&gt;Functions doing too many things at once&lt;/li&gt;
&lt;li&gt;Copy-pasted logic everywhere&lt;/li&gt;
&lt;li&gt;Variables and state scattered across the codebase&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🚨 Why It’s a Problem
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hard to debug:&lt;/strong&gt; Change one function, break another.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hard to scale:&lt;/strong&gt; Adding new features feels like defusing a bomb.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hard for teams:&lt;/strong&gt; New developers get lost trying to understand the mess.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ⚡ Real Examples
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Example 1: Nested Conditionals
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Spaghetti Version:&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;function&lt;/span&gt; &lt;span class="nf"&gt;processUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isAdmin&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isActive&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Admin active&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="c1"&gt;// More logic...&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="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;Admin inactive&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="k"&gt;else&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;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isActive&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;User active&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="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;User inactive&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Cleaner Version:&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;function&lt;/span&gt; &lt;span class="nf"&gt;processUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;role&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isAdmin&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Admin&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;User&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isActive&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;active&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;inactive&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;role&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Example 2: Inline Database Queries Everywhere
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Spaghetti Version:&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="nx"&gt;app&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="s2"&gt;/users&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;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;SELECT * FROM users&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;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="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;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;users&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;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/users&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;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s2"&gt;`INSERT INTO users (name, email) VALUES ('&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;', '&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;')`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="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;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Business logic is mixed with DB logic — hard to test or maintain.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cleaner Version (separating layers):&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="c1"&gt;// services/userService.js&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getUsers&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;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;SELECT * FROM users&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;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;createUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;email&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;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;INSERT INTO users (name, email) VALUES (?, ?)&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;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// routes/userRoutes.js&lt;/span&gt;
&lt;span class="nx"&gt;app&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="s2"&gt;/users&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="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&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;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;getUsers&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/users&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="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&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;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;createUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email&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;
  
  
  Example 3: React Components That Do Too Much
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Spaghetti Version:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Dashboard&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;users&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setUsers&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="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/api/users&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;setUsers&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[]);&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Dashboard&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;u&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Looks fine… until you add more features (loading states, error handling, pagination). It quickly becomes spaghetti.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cleaner Version (separation of concerns):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;useUsers&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;users&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setUsers&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="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/api/users&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;setUsers&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;users&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;UserList&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;users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useUsers&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;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;u&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Dashboard&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Dashboard&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;UserList&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How to Avoid Spaghetti Code
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Single Responsibility Principle&lt;/strong&gt; → Each function does &lt;em&gt;one thing well&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Modular Design&lt;/strong&gt; → Break code into reusable components.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consistent Naming&lt;/strong&gt; → Future you (and teammates) will thank you.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Refactor Early&lt;/strong&gt; → Don’t wait until your codebase is a jungle.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tests&lt;/strong&gt; → They catch bugs before spaghetti spreads.&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;Spaghetti code isn’t just a meme, It’s the Number 1 reason why small projects turn into nightmares.&lt;/p&gt;

&lt;p&gt;The good news? With a little discipline (and some clean coding practices), you can turn that tangled bowl of noodles into a well-organized recipe.&lt;/p&gt;

&lt;p&gt;Next time you’re coding, ask yourself:&lt;br&gt;
👉 &lt;em&gt;“Am I cooking clean code, or serving spaghetti?”&lt;/em&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>programming</category>
      <category>nextjs</category>
      <category>react</category>
    </item>
    <item>
      <title>Mastering the App Router in Next.js 15: The Powerhouse Behind Its Full Feature Set</title>
      <dc:creator>Jonathan Idioseph</dc:creator>
      <pubDate>Fri, 15 Aug 2025 11:26:04 +0000</pubDate>
      <link>https://dev.to/idioseph/mastering-the-app-router-in-nextjs-15-the-powerhouse-behind-its-full-feature-set-2p6c</link>
      <guid>https://dev.to/idioseph/mastering-the-app-router-in-nextjs-15-the-powerhouse-behind-its-full-feature-set-2p6c</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;1. Introduction&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;When Next.js 15 dropped, it brought a lot of shiny new features. But here’s the secret — the &lt;strong&gt;App Router&lt;/strong&gt; is the real engine powering most of them.&lt;br&gt;
If you don’t understand it, you’re only scratching the surface of what Next.js can do.&lt;/p&gt;

&lt;p&gt;Think of it like upgrading from a regular car to a Tesla. Sure, it looks sleek on the outside, but the magic is in the new engine and smart features inside.&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;2. What is the App Router?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The App Router is a &lt;strong&gt;new way to structure and render your application&lt;/strong&gt; using the &lt;code&gt;/app&lt;/code&gt; directory.&lt;br&gt;
It’s built for speed, better organization, and flexibility.&lt;br&gt;
With it, you get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Layouts&lt;/strong&gt; that stay in place while you switch pages&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Server Components&lt;/strong&gt; that reduce JavaScript bundle size&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Streaming&lt;/strong&gt; so pages start loading before all data arrives&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Simpler data fetching&lt;/strong&gt; without boilerplate&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In short: it’s designed for &lt;strong&gt;modern, scalable apps&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;3. Pages Router vs App Router: What Changed?&lt;/strong&gt;
&lt;/h2&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%2F0cuowo2nj21kc9hpgwek.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%2F0cuowo2nj21kc9hpgwek.png" alt=" " width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it’s better&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No more copying the same layout into multiple pages&lt;/li&gt;
&lt;li&gt;Faster loads because less JavaScript is sent to the browser&lt;/li&gt;
&lt;li&gt;Easier to keep related files together&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;4. Why the App Router is a Game-Changer in Next.js 15&lt;/strong&gt;
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Server Components&lt;/strong&gt; → Send only what’s needed to the browser&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nested Layouts&lt;/strong&gt; → Keep sidebars, navbars, and headers while switching pages&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Server Actions&lt;/strong&gt; → Handle form submissions and database updates without extra API endpoints&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Streaming &amp;amp; Suspense&lt;/strong&gt; → Show parts of the UI as soon as they’re ready&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Simplified Data Fetching&lt;/strong&gt; → Fetch right inside your component without special functions&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;5. Core Concepts You Must Understand&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Special Files in App Router:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;page.tsx&lt;/code&gt; → Defines what shows up at a route&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;layout.tsx&lt;/code&gt; → Wraps your pages with shared UI like a navbar&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;loading.tsx&lt;/code&gt; → Shows while the page is fetching data&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;error.tsx&lt;/code&gt; → Handles errors for that route&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Client vs Server Components:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Server Components&lt;/strong&gt; (default) → Run only on the server, don’t ship JS to the browser&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Client Components&lt;/strong&gt; (&lt;code&gt;"use client"&lt;/code&gt;) → Run in the browser for interactive features&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;6. Practical Example: A Simple Dashboard&lt;/strong&gt;
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;app/
 ├─ dashboard/
 │   ├─ layout.tsx   // Sidebar + header
 │   ├─ page.tsx     // Main dashboard content
 │   ├─ loading.tsx  // Loading spinner
 │   └─ error.tsx    // Error message
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;With this setup:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;layout&lt;/strong&gt; stays while switching between sections&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data fetching&lt;/strong&gt; happens in &lt;code&gt;page.tsx&lt;/code&gt; on the server&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Loading states&lt;/strong&gt; are automatic with &lt;code&gt;loading.tsx&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;7. Common Mistakes and How to Avoid Them&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;❌ &lt;strong&gt;Mistake 1&lt;/strong&gt;: Overusing Client Components&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ❌ Wrong - No need to make this a Client Component&lt;/span&gt;
&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;use client&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Dashboard&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Welcome&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;Correct&lt;/strong&gt;: Use Server Components unless you need interactivity&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Dashboard&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Welcome&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;❌ &lt;strong&gt;Mistake 2&lt;/strong&gt;: Fetching in Client Components when you can use Server Components&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ❌ Wrong&lt;/span&gt;
&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;use client&lt;/span&gt;&lt;span class="dl"&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;useEffect&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="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;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Users&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;users&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setUsers&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="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/api/users&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;setUsers&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[]);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;pre&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;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;users&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="mi"&gt;2&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;pre&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;Correct&lt;/strong&gt;: Fetch on the server&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ✅ Right&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Users&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;users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://api.example.com/users&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&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;pre&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;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;users&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="mi"&gt;2&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;pre&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;❌ &lt;strong&gt;Mistake 3&lt;/strong&gt;: No error boundaries&lt;br&gt;
If one component crashes, the whole page breaks.&lt;br&gt;
✅ Add error.tsx for each route folder.&lt;/p&gt;

&lt;p&gt;❌ &lt;strong&gt;Mistake 4&lt;/strong&gt;: Misusing and not using the"use client"&lt;br&gt;
When to use: If your component needs state, event listeners, or browser APIs (e.g., useState, useEffect, window).&lt;br&gt;
When not to: If it’s purely presentational or only fetches data, keep it a Server Component to reduce bundle size.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;8. Final Thoughts&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The App Router isn’t just an upgrade — it’s a complete rethink of how we build with Next.js.&lt;br&gt;
If you want &lt;strong&gt;faster&lt;/strong&gt;, &lt;strong&gt;cleaner&lt;/strong&gt;, and &lt;strong&gt;easier-to-maintain&lt;/strong&gt; applications, it’s worth learning inside out.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>nextjs</category>
    </item>
    <item>
      <title>JavaScript’s Most Misunderstood Feature: The Event Loop Isn’t What You Think</title>
      <dc:creator>Jonathan Idioseph</dc:creator>
      <pubDate>Thu, 14 Aug 2025 09:58:38 +0000</pubDate>
      <link>https://dev.to/idioseph/javascripts-most-misunderstood-feature-the-event-loop-isnt-what-you-think-4n15</link>
      <guid>https://dev.to/idioseph/javascripts-most-misunderstood-feature-the-event-loop-isnt-what-you-think-4n15</guid>
      <description>&lt;p&gt;&lt;em&gt;Demystifying async behavior so you can predict it, without memorizing diagrams.&lt;/em&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%2Fkepaws2fer7ggmh3mjne.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%2Fkepaws2fer7ggmh3mjne.png" alt=" " width="800" height="644"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Why this matters (in plain English)
&lt;/h2&gt;

&lt;h4&gt;
  
  
  The Problem That Made Me Google at 2 AM
&lt;/h4&gt;

&lt;p&gt;I was building a dashboard in Next.js.&lt;br&gt;
Everything worked… except my loading spinner.&lt;/p&gt;

&lt;p&gt;It just froze.&lt;br&gt;
No error, no crash, it just stopped spinning.&lt;/p&gt;

&lt;p&gt;Turns out, I had no clue I’ve met the event loop, just… indirectly. This guide strips the jargon and gives you a mental model you’ll actually use.&lt;/p&gt;
&lt;h2&gt;
  
  
  2. Think of JavaScript as a Restaurant
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Kitchen&lt;/strong&gt; = Call Stack (where cooking happens)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Waiter&lt;/strong&gt; = Event Loop (decides what order to serve next)&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Two waiting lines&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fast line&lt;/strong&gt; = Promises (&lt;code&gt;.then()&lt;/code&gt;, &lt;code&gt;async/await&lt;/code&gt;) → “urgent orders”&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Slow line&lt;/strong&gt; = Timers (&lt;code&gt;setTimeout&lt;/code&gt;, clicks, network) → “big meal orders”&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  3. The Secret Rule Nobody Told Me
&lt;/h2&gt;

&lt;p&gt;Before serving any big orders, the waiter &lt;strong&gt;must&lt;/strong&gt; finish all "urgent orders" first.&lt;/p&gt;

&lt;p&gt;That’s why a &lt;code&gt;Promise&lt;/code&gt; often runs before a &lt;code&gt;setTimeout&lt;/code&gt;, even if the timeout is set to &lt;code&gt;0&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Example 1: Why &lt;code&gt;setTimeout(0)&lt;/code&gt; still feels “late”
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Start&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="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;Timeout&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="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;Promise&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;End&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Start  
End  
Promise  
Timeout
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JavaScript finishes the current work (&lt;code&gt;Start&lt;/code&gt;, &lt;code&gt;End&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Runs &lt;strong&gt;Promises&lt;/strong&gt; (urgent orders) → &lt;code&gt;"Promise"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Then runs &lt;strong&gt;setTimeout&lt;/strong&gt; (big orders) → &lt;code&gt;"Timeout"&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Example 2: The silent performance bug with &lt;code&gt;async/await&lt;/code&gt;
&lt;/h2&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;task1&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;task2&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Waits for task1 before even starting task2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Better:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nf"&gt;task1&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="nf"&gt;task2&lt;/span&gt;&lt;span class="p"&gt;()]);&lt;/span&gt; &lt;span class="c1"&gt;// Both start together&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If tasks don’t depend on each other, run them in parallel. Saves time.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. How This Saved My Spinner
&lt;/h2&gt;

&lt;p&gt;My “frozen” spinner was because I ran a heavy loop that never let the Event Loop breathe.&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;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="nx"&gt;e9&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt; &lt;span class="c1"&gt;// freezes everything&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Break work into chunks so the UI gets a chance to update.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;doWorkInChunks&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;j&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;j&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;100000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="nx"&gt;e9&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// let UI breathe&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nf"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  5. Why You Should Care
&lt;/h2&gt;

&lt;p&gt;Understanding the Event Loop means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Faster apps&lt;/li&gt;
&lt;li&gt;Less “freezing” UIs&lt;/li&gt;
&lt;li&gt;Predictable async behavior&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even if you’re not “deep into backend stuff,” this is frontend survival skill.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Myths vs Reality (quick de-mystification)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Myth:&lt;/strong&gt; &lt;code&gt;setTimeout(fn, 0)&lt;/code&gt; runs immediately.
&lt;strong&gt;Reality:&lt;/strong&gt; It waits until all microtasks finish.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Myth:&lt;/strong&gt; &lt;code&gt;async/await&lt;/code&gt; is always faster than Promises.
&lt;strong&gt;Reality:&lt;/strong&gt; It’s about &lt;strong&gt;ordering&lt;/strong&gt;. Sequential &lt;code&gt;await&lt;/code&gt; can be &lt;strong&gt;slower&lt;/strong&gt; than &lt;code&gt;Promise.all&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Myth:&lt;/strong&gt; The event loop is “browser stuff only.”
&lt;strong&gt;Reality:&lt;/strong&gt; Node.js has the loop too (with its own task sources); the microtask &amp;gt; macrotask rule still applies.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  7. When to care (and when not to)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Care when: spinners freeze, progress bars stutter, “0ms” timers feel late, &lt;code&gt;await&lt;/code&gt; feels slow.&lt;/li&gt;
&lt;li&gt;Don’t overthink it when: the page is simple and nothing is heavy—ship it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  8. Debug checklist you can copy
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Is something “late”? → &lt;strong&gt;Check for a Promise&lt;/strong&gt; running first.&lt;/li&gt;
&lt;li&gt;Is something “slow”? → &lt;strong&gt;Run independent tasks in parallel&lt;/strong&gt; with &lt;code&gt;Promise.all&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Is UI freezing? → &lt;strong&gt;Break big loops&lt;/strong&gt; with &lt;code&gt;setTimeout&lt;/code&gt;/&lt;code&gt;requestIdleCallback&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Still weird? → Log order: &lt;code&gt;console.log("A")&lt;/code&gt;, Promise &lt;code&gt;.then("B")&lt;/code&gt;, &lt;code&gt;setTimeout("C", 0)&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  9. Too Long; Didn't Read (stick this in your notes)
&lt;/h2&gt;

&lt;p&gt;1). Sync finishes → 2) &lt;strong&gt;All&lt;/strong&gt; microtasks run → 3) One macrotask runs → repeat.&lt;br&gt;
   Use &lt;code&gt;Promise.all&lt;/code&gt; for parallel work; slice heavy loops so the UI can breathe.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your turn:&lt;/strong&gt; Ever had a bug that only happened because of “JavaScript timing magic”? Drop it in the comments, I might try to explain it in plain English.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>node</category>
    </item>
    <item>
      <title>The Power of Deep-Level Multi-Tenancy: and How I Nailed It in My Latest Project</title>
      <dc:creator>Jonathan Idioseph</dc:creator>
      <pubDate>Wed, 13 Aug 2025 05:17:51 +0000</pubDate>
      <link>https://dev.to/idioseph/the-power-of-deep-level-multi-tenancy-and-how-i-nailed-it-in-my-latest-project-46eg</link>
      <guid>https://dev.to/idioseph/the-power-of-deep-level-multi-tenancy-and-how-i-nailed-it-in-my-latest-project-46eg</guid>
      <description>&lt;p&gt;Multi-tenancy is one of those architectural concepts you hear tossed around a lot in SaaS circles, but when you &lt;em&gt;really&lt;/em&gt; get it right, it feels like a superpower.&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%2F86zv0n3fsjedat55lr0p.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%2F86zv0n3fsjedat55lr0p.png" alt=" " width="604" height="1000"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In my latest project, I built &lt;strong&gt;deep-level multi-tenancy&lt;/strong&gt; into a Next.js application, and the results were nothing short of game-changing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;One codebase&lt;/strong&gt; serving multiple schools&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data isolation&lt;/strong&gt; for security and privacy&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scalability&lt;/strong&gt; without the chaos of separate deployments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here’s how I did it, and how you can too.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Why Multi-Tenancy Matters&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;For a SaaS product, multi-tenancy means that a single application instance serves multiple clients (“tenants”), with each tenant’s data, settings, and user sessions kept separate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The benefits:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lower hosting and maintenance costs&lt;/li&gt;
&lt;li&gt;Faster feature rollouts (update once, all tenants benefit)&lt;/li&gt;
&lt;li&gt;Easier scaling compared to managing multiple deployments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In my case, each school using the platform has its &lt;strong&gt;own subdomain&lt;/strong&gt;, isolated authentication, onboarding process, and dashboard.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Why Next.js Was a Perfect Fit&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Next.js gives you the exact tools needed for deep multi-tenancy:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dynamic routing&lt;/strong&gt; → Perfect for tenant-specific paths&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Middleware&lt;/strong&gt; → Great for intercepting requests and directing them to the right tenant context before rendering&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API Routes&lt;/strong&gt; → Handle tenant-specific API calls with ease&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SSR/SSG flexibility&lt;/strong&gt; → Customize pages per tenant&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;My Deep-Level Multi-Tenancy Setup&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Here’s a quick peek at my &lt;strong&gt;project structure&lt;/strong&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%2Fa7frwbdce171hcq7qpfy.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%2Fa7frwbdce171hcq7qpfy.png" alt=" " width="382" height="670"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This folder structure allows me to scope &lt;strong&gt;every route, page, and feature&lt;/strong&gt; to a specific subdomain (tenant).&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;The Middleware Magic&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The heart of this setup is my &lt;strong&gt;Next.js middleware&lt;/strong&gt;, which:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Extracts the tenant subdomain&lt;/strong&gt; from the request&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Handles local dev and production environments&lt;/strong&gt; (even Vercel preview URLs)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manages authentication &amp;amp; onboarding flows&lt;/strong&gt; per tenant&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rewrites URLs&lt;/strong&gt; so each request is served from the correct tenant route&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here’s the key part of my middleware logic:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;extractSubdomain&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;NextRequest&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="o"&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="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;host&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;host&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;hostname&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;host&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

  &lt;span class="c1"&gt;// Localhost handling&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;url&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;localhost&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;match&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/http:&lt;/span&gt;&lt;span class="se"&gt;\/\/([^&lt;/span&gt;&lt;span class="sr"&gt;.&lt;/span&gt;&lt;span class="se"&gt;]&lt;/span&gt;&lt;span class="sr"&gt;+&lt;/span&gt;&lt;span class="se"&gt;)\.&lt;/span&gt;&lt;span class="sr"&gt;localhost/&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;match&lt;/span&gt;&lt;span class="p"&gt;?.[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;hostname&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;// Production handling&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;rootDomainFormatted&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;rootDomain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&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;isSubdomain&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
    &lt;span class="nx"&gt;hostname&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="nx"&gt;rootDomainFormatted&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
    &lt;span class="nx"&gt;hostname&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="s2"&gt;`www.&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;rootDomainFormatted&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
    &lt;span class="nx"&gt;hostname&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;endsWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`.&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;rootDomainFormatted&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;isSubdomain&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;hostname&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`.&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;rootDomainFormatted&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And the &lt;strong&gt;rewrite step&lt;/strong&gt; that ties it all together:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;subdomain&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;redirectUrl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`/tenat/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;subdomain&lt;/span&gt;&lt;span class="p"&gt;}${&lt;/span&gt;&lt;span class="nx"&gt;pathname&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;NextResponse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rewrite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;redirectUrl&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 means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;school1.example.com/dashboard&lt;/code&gt; → internally becomes &lt;code&gt;/tenat/school1/dashboard&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;school2.example.com/login&lt;/code&gt; → becomes &lt;code&gt;/tenat/school2/login&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All while &lt;strong&gt;keeping the public-facing URL clean&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Guiding You to Set This Up Yourself&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;If you want to replicate this deep-level multi-tenancy approach:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Plan your folder structure&lt;/strong&gt; under &lt;code&gt;/app/[subdomain]&lt;/code&gt; or &lt;code&gt;/app/tenant/[subdomain]&lt;/code&gt; so that tenant-specific routes are cleanly separated.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Write middleware&lt;/strong&gt; that:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Extracts the subdomain&lt;/li&gt;
&lt;li&gt;Handles special cases (localhost, staging domains, etc.)&lt;/li&gt;
&lt;li&gt;Decides what to do based on user session and onboarding state

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Use &lt;code&gt;NextResponse.rewrite&lt;/code&gt;&lt;/strong&gt; to send the request to the correct tenant-specific route without changing the public URL.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integrate authentication per tenant&lt;/strong&gt;, your session should store the tenant identifier (&lt;code&gt;schema_name&lt;/code&gt; in my case) so you can easily redirect users post-login.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test across environments&lt;/strong&gt;, production, staging, and local dev, to make sure subdomain routing behaves consistently.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Why This Was Worth It&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The result?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Isolated environments&lt;/strong&gt; for each school without deploying multiple apps&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Centralized updates&lt;/strong&gt;: push new features once, all tenants get them&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Secure, predictable routing&lt;/strong&gt; thanks to middleware control&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Multi-tenancy isn’t just about being clever, it’s about scaling &lt;em&gt;right&lt;/em&gt;. And when done well, it turns complexity into something manageable, even elegant.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Have you tried multi-tenancy before?&lt;/strong&gt; What was the toughest part, routing, auth, or database isolation?&lt;/p&gt;

&lt;p&gt;#Nextjs #SaaS #Multitenancy #WebDevelopment #DevExperience&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>nextjs</category>
      <category>programming</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Why I Keep Choosing Next.js — and What It’s Taught Me</title>
      <dc:creator>Jonathan Idioseph</dc:creator>
      <pubDate>Mon, 11 Aug 2025 10:37:23 +0000</pubDate>
      <link>https://dev.to/idioseph/why-i-keep-choosing-nextjs-and-what-its-taught-me-24dj</link>
      <guid>https://dev.to/idioseph/why-i-keep-choosing-nextjs-and-what-its-taught-me-24dj</guid>
      <description>&lt;p&gt;You don’t need to know every JavaScript framework to ship great products.&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%2Fwgnycus34jp8vqtbdis4.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%2Fwgnycus34jp8vqtbdis4.png" alt=" " width="800" height="997"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But for most of my projects, I keep coming back to Next.js.&lt;/p&gt;

&lt;p&gt;It’s not hype. It’s a mix of flexibility, developer experience, and built-in performance wins that make it a solid choice for both small and large projects.&lt;/p&gt;

&lt;p&gt;Here’s my story and what I’ve learned along the way.&lt;/p&gt;

&lt;p&gt;How I First Met Next.js, Like most frontend devs, I started with plain React. I loved the component model, but I quickly ran into the same problems:&lt;/p&gt;

&lt;p&gt;SEO challenges with SPAs&lt;/p&gt;

&lt;p&gt;Too much setup for routing and performance optimization&lt;/p&gt;

&lt;p&gt;Having to choose between server-side rendering and static generation, with no simple middle ground&lt;/p&gt;

&lt;p&gt;Next.js came in like a toolkit that already had answers for most of these problems.&lt;/p&gt;

&lt;p&gt;Why I Keep Choosing It&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. SSR + SSG Flexibility&lt;/strong&gt;&lt;br&gt;
Next.js lets me choose rendering strategies per page. I can make one route statically generated for speed, and another server-rendered for up-to-date data, all in the same project.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Performance Built In&lt;/strong&gt;&lt;br&gt;
Image optimization, smart routing, and lazy loading happen almost automatically. Less time on micro-optimizations, more time on core features.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Developer Experience&lt;/strong&gt;&lt;br&gt;
File-based routing, built-in API routes, TypeScript support, I spend less time wiring things together and more time building.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Ecosystem Fit&lt;/strong&gt;&lt;br&gt;
It works seamlessly with Tailwind CSS, Framer Motion, and my usual backend stack (Node.js, MongoDB, Firebase).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Multitenancy Support&lt;/strong&gt;&lt;br&gt;
One of my recent projects required multi-tenant architecture, different clients having their own custom subdomains, data isolation, and branding, all within a single codebase.&lt;br&gt;
Next.js made it straightforward to handle dynamic routing and domain mapping, which saved weeks of manual work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lessons Learned Along the Way&lt;/strong&gt;&lt;br&gt;
No tool is perfect; I’ve had to manage longer build times on large projects.&lt;/p&gt;

&lt;p&gt;The temptation to over-engineer is real, sometimes a plain React app is enough.&lt;/p&gt;

&lt;p&gt;For me, Next.js isn’t just a tool; it’s a balance between performance, flexibility, and developer happiness.&lt;/p&gt;

&lt;p&gt;Have you tried Next.js? What’s the biggest lesson it taught you, or the biggest pain point you’ve had with it?&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
      <category>nextjs</category>
    </item>
  </channel>
</rss>
