Why Next.js Feels Different from Regular React - and Why Developers Love It
I remember the exact moment I fell in love with Next.js.
I was building a React app. A simple blog. Nothing fancy.
But I needed routing, so I installed React Router. Then I needed SEO, so I added React Helmet. Then server-side rendering for performance, so I looked into complicated SSR setups. Then I needed to optimize images, configure webpack, set up API routes...
Three days in, I hadn't written a single line of actual business logic.
I was just configuring tools.
That's when a colleague said: "Just use Next.js."
I did. And everything changed.
Next.js vs React: What's Actually Different?
Let's clear this up first. Next.js IS React. It's not a different framework-it's React with superpowers.
Think of it this way:
- React: A library for building user interfaces
- Next.js: A framework built on React that handles all the annoying setup
React gives you the building blocks. Next.js gives you the whole house, already built, with electricity and plumbing included.
The Pain Points Next.js Solves
1. Routing Hell
With Regular React:
import { BrowserRouter, Routes, Route } from 'react-router-dom'
function App() {
return (
} />
} />
} />
} />
)
}
You install a library. Configure routes. Handle 404s. Set up nested routes. It works, but it's manual labor.
With Next.js:
Just create files. That's it.
app/
├── page.tsx → /
├── about/
│ └── page.tsx → /about
├── blog/
│ └── [slug]/
│ └── page.tsx → /blog/:slug
└── user/
└── [id]/
└── page.tsx → /user/:id
No configuration. No route definitions. The file structure IS the routing.
It's beautiful.
2. SEO Nightmare
With Regular React:
React renders on the client. Search engines see an empty HTML file with a loading div.
You need to:
- Set up React Helmet for meta tags
- Configure server-side rendering (complex)
- Handle dynamic meta tags for each page
- Worry about social media previews
It's doable. But it's painful.
With Next.js:
SEO just works. Out of the box.
import { Metadata } from 'next'
export const metadata: Metadata = {
title: 'My Blog Post',
description: 'An amazing blog post about Next.js',
openGraph: {
title: 'My Blog Post',
description: 'An amazing blog post',
images: ['/og-image.jpg'],
},
}
export default function BlogPost() {
return ...
}
Search engines see fully rendered HTML. Twitter sees proper cards. Facebook sees correct previews.
No extra libraries. No configuration. It just works.
3. Performance by Default
With Regular React:
Everything loads on the client. Large JavaScript bundles. Slow initial load. You need to manually:
- Code split with React.lazy
- Optimize images
- Configure webpack
- Set up lazy loading
- Implement caching strategies
With Next.js:
Performance is automatic.
import Image from 'next/image'
Next.js automatically:
- Optimizes images (WebP, sizes, lazy loading)
- Code splits at the route level
- Prefetches visible links
- Caches aggressively
- Tree shakes unused code
You write normal React code. Next.js makes it fast.
Benefits of Next.js: The Real Advantages
Server-Side Rendering (SSR) Made Simple
SSR sounds scary. In vanilla React, it is.
In Next.js? It's the default.
async function getData() {
const res = await fetch('https://api.example.com/posts')
return res.json()
}
export default async function BlogPage() {
const posts = await getData()
return (
{posts.map(post => (
{post.title}
))}
)
}
This component fetches data on the server. Returns fully rendered HTML. No loading spinners. No client-side fetch. Just content.
Static Site Generation (SSG): Best of Both Worlds
Want your site to be as fast as a static site but dynamic like an app?
export default async function BlogPost({ params }: { params: { slug: string } }) {
const post = await getPost(params.slug)
return {post.content}
}
// Generate all blog post pages at build time
export async function generateStaticParams() {
const posts = await getAllPosts()
return posts.map(post => ({ slug: post.slug }))
}
Next.js generates HTML files at build time. Serves them instantly. Revalidates when needed.
Your blog loads in milliseconds. SEO is perfect. Hosting is cheap (it's just static files).
API Routes Without a Backend
Need a simple API? Don't spin up Express.
// app/api/subscribe/route.ts
export async function POST(request: Request) {
const { email } = await request.json()
await saveToDatabase(email)
return Response.json({ success: true })
}
That's it. You have an API endpoint at /api/subscribe.
No separate server. No CORS issues. No deployment headaches.
SSR vs CSR: When Next.js Shines
Client-Side Rendering (CSR) - Regular React
How it works:
1. Browser downloads empty HTML 2. Downloads React bundle 3. React renders the app 4. Fetches data 5. Shows content
Good for:
- Dashboards (already logged in)
- Internal tools
- Apps where SEO doesn't matter
Bad for:
- Landing pages
- Blogs
- E-commerce
- Anything public-facing
Server-Side Rendering (SSR) - Next.js
How it works:
1. Server fetches data 2. Server renders React to HTML 3. Sends complete HTML to browser 4. React "hydrates" (makes it interactive)
Good for:
- Everything public
- SEO-critical pages
- Dynamic content
- Better user experience
The Hybrid Approach - Next.js Magic
Here's where Next.js gets brilliant. You don't choose SSR or CSR. You use both.
// This runs on the server
export default async function ProductPage({ params }) {
const product = await getProduct(params.id)
return (
{/* Server-rendered */}
{/* Client-rendered */}
)
}
Critical content? Server-rendered. Interactive features? Client-rendered. Best of both worlds.
Real Developer Stories: When Next.js Clicked
Story 1: The E-commerce Migration
A friend was building a React e-commerce site. Product pages loaded slowly. SEO was terrible. Google wasn't indexing products properly.
Switched to Next.js. Same React components. Just moved them to the app directory.
Results:
- Page load: 4.2s → 1.1s
- Google indexing: 40% → 98%
- Conversion rate: +23%
Same code. Better framework.
Story 2: The Blog Rewrite
I built a blog with Create React App. It worked. But:
- Each page needed client-side fetch
- Meta tags didn't work for social sharing
- Lighthouse score: 62
Rebuilt with Next.js in a weekend.
- Static generation for all posts
- Perfect meta tags
- Lighthouse score: 98
And I deleted 300 lines of routing configuration.
Story 3: The Dashboard That Needed More
Started as a simple dashboard. Client-side React was fine.
Then they wanted:
- A marketing site (needs SEO)
- A public API
- Better performance
- Social auth
Instead of setting up separate projects, moved to Next.js. One codebase for everything.
app/
├── (dashboard)/ → Client-side app
├── (marketing)/ → Server-rendered marketing
├── api/ → Backend API
└── auth/ → Authentication
One deployment. One repository. Everything in sync.
Why Developers Love Next.js
1. It Just Works
No webpack config. No babel setup. No deployment scripts.
npx create-next-app@latest
npm run dev
You're building features in 30 seconds.
2. Deploy Anywhere (But Especially Vercel)
Deploying React apps? You need:
- Build scripts
- Server configuration
- Environment variables setup
- CDN configuration
Deploying Next.js to Vercel?
git push
That's it. Automatic previews. Edge functions. Global CDN. Zero config.
3. The Ecosystem
Next.js isn't just a framework. It's an ecosystem.
- next/image: Automatic image optimization
- next/font: Font optimization
- next/link: Smart prefetching
- Middleware: Edge functions
- Server Actions: Forms without API routes
Everything is thought through. Everything works together.
4. TypeScript is First-Class
Next.js loves TypeScript.
type Params = { slug: string }
type SearchParams = { page?: string }
export default async function Page({
params,
searchParams,
}: {
params: Params
searchParams: SearchParams
}) {
// Full type safety
}
Types for everything. Autocomplete everywhere. It feels right.
When NOT to Use Next.js
Let me be honest. Next.js isn't always the answer.
Don't use Next.js for:
- Pure SPAs behind login: If your entire app is authenticated and SEO doesn't matter, plain React is fine.
- Electron apps: Desktop apps don't need SSR.
- Very simple projects: A single landing page? Maybe overkill.
- When your team can't learn: If your team is struggling with React, adding Next.js won't help.
Do use Next.js for:
- Anything public-facing
- When SEO matters
- When performance matters
- When you want to ship fast
- When you're tired of configuration
Making the Switch
Already have a React app? Migration is easier than you think.
// Your React component
function BlogPost({ post }) {
return {post.title}
}
// Same component in Next.js
export default function BlogPost({ post }) {
return {post.title}
}
Same component. Just move it to the right folder structure.
Data fetching changes:
// React
function BlogPost() {
const [post, setPost] = useState(null)
useEffect(() => {
fetch('/api/post').then(r => r.json()).then(setPost)
}, [])
if (!post) return
return {post.title}
}
// Next.js
export default async function BlogPost() {
const post = await fetch('/api/post').then(r => r.json())
return {post.title}
}
Simpler. Cleaner. Faster.
The Bottom Line
Next.js doesn't replace React. It makes React better.
It handles all the stuff you'd have to configure anyway:
- Routing ✓
- SEO ✓
- Performance ✓
- Server rendering ✓
- API routes ✓
- Image optimization ✓
- Code splitting ✓
You focus on building features. Next.js handles the infrastructure.
That's why developers love it.
That's why I'll never go back to plain Create React App.
And that's why if you're starting a new React project today, you should seriously consider Next.js.
It's not hype. It's just better.
---
Ready to try Next.js? Start with the official tutorial or check out my beginner-friendly guide to the Next.js App Router.Want articles like this in your inbox?
Join developers and founders who get practical insights on frontend, SaaS, and building better products.
Written by Salman Izhar
Frontend Developer specializing in React, Next.js, and building high-converting web applications.
Learn More