>_
EngineeringNotes
Back to Next.js Mastery

Routing & Layouts

Next.js provides a sophisticated file-based routing systemwhere your folder structure directly defines your application's paths.

1. Routing in Next.js

Next.js uses a file-system based router where folders are used to define routes.

Pages Router (Legacy)
/pages
├── index.js → /
├── about.js → /about
└── blog/
└── [id].js → /blog/:id

Key logic: File = Route

App Router (Modern)
/app
├── page.js → /
├── about/
└── page.js → /about
└── blog/
└── [id]/
└── page.js → /blog/:id

Key logic: Folder = Route, page.js = UI

2. Layout System

Pages Router Limitations

No built-in layout system. You manually wrap components in _app.js, making nested or per-route layouts difficult to manage.

_app.js
javascript
function MyApp({ Component, pageProps }) {
  return (
    <Layout>
      <Component {...pageProps} />
    </Layout>
  );
}

App Router Advantages

Nested layouts are built-in features. Reusable UI like navbars and sidebars are persisted across child routes, improving performance through partial rendering.

Layout Hierarchy Diagram

Root Layout
Dashboard Layout
Page Content

Partial Rendering: Only the Page Content re-renders

App Router vs Pages Router

FeatureApp RouterPages Router
Routing StyleFolder-basedFile-based
LayoutBuilt-in Nested LayoutsManual setup
RenderingServer Components (Default)Client-side React
Data FetchingDirect Fetch in ComponentsSpecial Async Hooks
PerformanceBetter (Streaming & Partial)Moderate
FlexibilityHigh (Sub-route control)Limited

Server vs Client Components

Server Components (Default)

  • Execute purely on the server
  • Zero client-side JavaScript bundle size
  • Direct access to backend resources/DB
page.js
javascript
async function Page() {
  const data = await fetch('https://api.example.com/data');
  return <div>{data.message}</div>;
}

Client Components ("use client")

  • Used for interactivity (useState, useEffect)
  • Access to Browser APIs (window, localStorage)
  • Required for Event Handlers (onClick, onChange)
counter.js
javascript
"use client";

import { useState } from 'react';

function Counter() {
  const [count, setCount] = useState(0);
  return <button onClick={() => setCount(count + 1)}>
    Count: {count}
  </button>;
}

Advanced Routing Features

Dynamic Routes

/app/blog/[id]/page.js → Matches /blog/123

Nested Routes

/dashboard/settings/profile hierarchy

Route Groups

(auth)/login → URL stays /login

Loading UI

loading.js → Automated skeleton states

Error Handling

error.js → Error boundaries per route

Not Found

not-found.js → Custom 404 per section

App Router Advantage: Streaming

Sends HTML in chunks rather than waiting for the entire page, resulting in significantly faster perceived loading times.

Interview Gold (Routing & Layouts)

Real Example Structure

/app
├── layout.js (Root Layout)
├── page.js (Main Page)
├── (auth)/ (Route Group)
├── login/page.js
└── signup/page.js
├── dashboard/
├── layout.js (Nested Layout)
├── page.js
├── analytics/page.js
└── settings/page.js