βš–οΈ Pages Router vs App Router Comparison

Understanding the evolution from Pages Router to App Router in Next.js

πŸ“ Pages Router (Legacy)

Data Fetching Methods:

getStaticProps

Runs at build time for SSG

getServerSideProps

Runs on each request for SSR

getStaticPaths

Defines dynamic routes for SSG

File Structure:

pages/
  index.tsx         β†’ /
  about.tsx         β†’ /about
  blog/
    index.tsx       β†’ /blog
    [slug].tsx      β†’ /blog/[slug]
  api/
    hello.ts        β†’ /api/hello

πŸ†• App Router (Current)

Data Fetching Methods:

async components

Direct async/await in components

fetch with cache

Built-in caching strategies

generateStaticParams

Dynamic route generation

server actions

Direct mutations & revalidation

File Structure:

app/
  page.tsx          β†’ /
  about/
    page.tsx        β†’ /about
  blog/
    page.tsx        β†’ /blog
    [slug]/
      page.tsx      β†’ /blog/[slug]
    layout.tsx      β†’ Shared layout
  api/
    hello/
      route.ts      β†’ /api/hello

πŸ”„ Migration Examples

Pages Router (Old Way)

// pages/blog.tsx
export const getStaticProps = async () => {
  const posts = await fetch('/api/posts')
  return {
    props: { posts: await posts.json() },
    revalidate: 60
  }
}

export default function Blog({ posts }) {
  return <div>{/* render posts */}</div>
}

App Router (New Way)

// app/blog/page.tsx
async function getPosts() {
  const res = await fetch('/api/posts', {
    next: { revalidate: 60 }
  })
  return res.json()
}

export default async function Blog() {
  const posts = await getPosts()
  return <div>{/* render posts */}</div>
}

πŸ“Š Comparison Table

FeaturePages RouterApp Router
Data FetchinggetStaticProps, getServerSidePropsasync/await in components
LayoutsCustom _app.tsx wrapperNative layout.tsx files
Loading StatesManual implementationBuilt-in loading.tsx
Error HandlingCustom _error.tsxBuilt-in error.tsx
Server Components❌ Not availableβœ… Default behavior
Streaming❌ Limited supportβœ… Component-level (Suspense)
Data MutationsAPI Routes onlyβœ… Native Server Actions

Try getStaticProps

Pages Router SSG example

Try getServerSideProps

Pages Router SSR example

App Router Examples

Modern Next.js approach