Technical
Next.js Evolution: What Changed and What Stuck in 2025
Next.js shipped major changes in 2025. Some of them changed how I build frontends. Some of them I ignored entirely. Sorting signal from noise in a fast-moving framework is a skill worth practicing. Here is what stuck in my production code and what did not.
What I Adopted
App Router: I resisted for a while. Once I committed, the mental model clicked. Server Components by default changed how I think about data fetching. No more getServerSideProps boilerplate.
Server Actions: form submissions without writing API routes. For simple mutations this is genuinely simpler.
Partial Prerendering: static shell, dynamic islands. For content sites this is the right model.
// app/posts/[slug]/page.tsx
export default async function PostPage({ params }) {
const post = await getPost(params.slug)
// No getServerSideProps. Just fetch and render.
return <article>{post.body}</article>
}What I Did Not Adopt
Streaming UI for everything: most of my pages do not need it. The extra complexity is not worth it for pages that render in under 200ms server-side.
Middleware for auth: I moved auth back to the page-level. Middleware debugging is painful. Page-level checks are explicit and easy to read.
The Caching Saga
Next.js caching changed multiple times in 2025. I ended up explicitly marking everything with no-store or force-static rather than trusting defaults. Explicit beats implicit when the defaults shift.
The Deployment Story
Vercel stayed my default host. Edge functions stayed limited. Serverless functions stayed the workhorse. Cold starts got better. Pricing stayed predictable on the pro plan. Nothing dramatic, just steady improvement.
What 2026 Needs
- Clearer caching defaults
- Better DX for rarely-used features
- Less churn on stable APIs
Next.js is the framework I keep choosing. Not because it is exciting but because it is reliable. That is the better outcome for client work.
The TypeScript Story Inside Next.js
Strict-mode TypeScript plus Next.js 14 plus Server Components is a combination that either works well or produces the most confusing error messages in the ecosystem. The key is running tsc --noEmit in CI. Let the build surface problems before deploy, not after.
What Client Sites Actually Use
- App Router: every new project
- Server Components: content pages
- Client Components: interactive sections only
- Server Actions: simple forms
- API routes: third-party integrations
- Image component: every image
Those six features cover 95% of what client sites need. The rest of Next.js sits unused most of the time.
For the current feature set, see the Next.js App Router documentation.
RELATED READING
The Consulting Shift I Am Making In Year Two
After a year of writing and building, my consulting practice is changing shape. Shorter engagements. Sharper outcomes.
ReadThe Frontend Shift: Shipping Less JavaScript In Year Two
A year ago I reached for Next.js for everything. This year I often reach for nothing.
ReadThe Serverless Lesson I Would Write On A Sticky Note
After a year of shipping serverless projects, one rule explains most of the wins and all of the losses.
Read