Next.js Pages Router vs App Router
Next.js provides two routing and data-fetching strategies: Pages Router (pages/) and App Router (app/). Each has its own way of handling Server-Side Rendering (SSR), Static Site Generation (SSG), and Incremental Static Regeneration (ISR).
Comparison Table
| Feature | Pages Router (pages/) | App Router (app/) |
|---|---|---|
| SSR (Server-Side Rendering) | getServerSideProps | fetch() with cache: "no-store" |
| SSG (Static Site Generation) | getStaticProps | fetch() with cache: "force-cache" |
| ISR (Incremental Static Regeneration) | getStaticProps + revalidate: X | fetch() with { next: { revalidate: X } } |
| Client-Side Rendering (CSR) | Using useEffect() with fetch() | Using useEffect() with fetch() (same as Pages Router) |
| Nested Layouts | Not supported | Supported via layout.tsx |
| Middleware | Available via middleware.ts | Available via middleware.ts |
Server-Side Rendering (SSR)
Pages Router (pages/)
export async function getServerSideProps() {
const res = await fetch('https://api.example.com/data');
const data = await res.json();
return { props: { data } };
}
App Router (app/)
async function getData() {
const res = await fetch('https://api.example.com/data', { cache: "no-store" });
return res.json();
}
Static Site Generation (SSG)
Pages Router (pages/)
export async function getStaticProps() {
const res = await fetch('https://api.example.com/data');
const data = await res.json();
return { props: { data } };
}
App Router (app/)
async function getData() {
const res = await fetch('https://api.example.com/data', { cache: "force-cache" });
return res.json();
}
Incremental Static Regeneration (ISR)
Pages Router (pages/)
export async function getStaticProps() {
const res = await fetch('https://api.example.com/data');
const data = await res.json();
return { props: { data }, revalidate: 60 };
}
App Router (app/)
async function getData() {
const res = await fetch('https://api.example.com/data', { next: { revalidate: 60 } });
return res.json();
}
Client-Side Rendering (CSR)
import { useEffect, useState } from 'react';
export default function Component() {
const [data, setData] = useState(null);
useEffect(() => {
fetch('https://api.example.com/data')
.then(res => res.json())
.then(setData);
}, []);
if (!data) return <p>Loading...</p>;
return <pre>{JSON.stringify(data, null, 2)}</pre>;
}
Nested Layouts in App Router
// app/layout.tsx
export default function Layout({ children }) {
return (
<div>
<header>Header</header>
<main>{children}</main>
<footer>Footer</footer>
</div>
);
}
Conclusion
The App Router provides a more flexible and modern approach with nested layouts, React Server Components, and better data fetching capabilities. However, Pages Router is still useful for existing projects.
Comments
Post a Comment