Beyond the Basics
Next.js has evolved far beyond a simple React framework. The App Router introduces patterns that fundamentally change how we think about web application architecture.
Server Components: The Default
The mental model shift is significant: components are server-rendered by default. This means:
// This runs entirely on the server
async function ProductPage({ params }: { params: { id: string } }) {
const product = await db.products.findById(params.id)
return <ProductDisplay product={product} />
}Streaming and Suspense
Don't make users wait for everything. Stream your UI:
export default function Dashboard() {
return (
<div>
<Header />
<Suspense fallback={<ChartSkeleton />}>
<AnalyticsChart />
</Suspense>
<Suspense fallback={<TableSkeleton />}>
<RecentOrders />
</Suspense>
</div>
)
}Each Suspense boundary streams independently, giving users immediate feedback while slower data loads in the background.
Parallel Routes
Run multiple page segments simultaneously:
app/
@analytics/
page.tsx
@team/
page.tsx
layout.tsxThis pattern is powerful for dashboards where independent sections can load, error, and interact separately.
Intercepting Routes
The most underutilized pattern. Show a modal preview while maintaining a shareable URL:
Cache Components with "use cache"
The new use cache directive makes caching explicit and granular. Cache entire pages, individual components, or specific data-fetching functions.
The future of Next.js is about composability. Each pattern solves a specific problem, and the real power comes from combining them intentionally.