Diving Into Nextjs from Reactjs

Anuj Patel

Oct 7, 2025

4 min read

Blog Image

Your Next Step After React: Diving into Next.js



So, you've mastered the fundamentals of React: components, state, hooks, and
the virtual DOM. Congratulations! You're ready to build real-world, production-grade
applications. The best way to do that? By moving from a client-side rendering
framework like pure React (with tools like Vite or Create React App) to a
full-stack, server-side-rendered (SSR) framework: Next.js.



Next.js takes everything you love about React and supercharges it with performance,
routing, and data-fetching capabilities that make your applications faster, more
SEO-friendly, and easier to scale.



1. The Core Shift: Client-Side vs. Server-Side Rendering



The biggest change you'll encounter is how your application is rendered.


In pure React (Client-Side Rendering):



The browser downloads an empty HTML file and a massive JavaScript bundle. The JS
runs, fetches data, and then renders the UI. This is bad for SEO and slow on
initial load.

In Next.js (Server-Side Rendering/Pre-rendering):



Next.js renders the initial HTML for each page on the server and sends it to the
browser. The browser sees a fully formed page instantly (great for SEO and performance),
and then React "hydrates" it to become interactive. This is the power of
Pre-rendering.



2. Effortless Routing with the File System



Forget about manually setting up `react-router-dom`. Next.js uses a **file-system-based router**.
Every file in the `app` directory (or `pages` in older versions) automatically becomes a route.



Example: Creating an "About" Page


In your Next.js project, simply create a file:


app/about/page.js


And add your component:


'use client' // This tells Next.js to render this component on the client


import React from 'react'

const AboutPage = () => {
return (
<div>
<h1>Welcome to the About Page</h1>
<p>This page is automatically routed to /about</p>
</div>
)
}

export default AboutPage


You can now navigate to `yourdomain.com/about` without any extra setup.



3. Data Fetching and Server Components (App Router)



With the Next.js App Router, you can write **Server Components** by default (no `'use client'` at the top). Server Components allow you to fetch data directly on the server, which is secure and fast.



In a Server Component, you can use the native `fetch` API directly, and it will run **on the server**.



Example: Server-Side Data Fetching


// app/posts/page.js (This is a Server Component by default)


async function getPosts() {
// This fetch call runs securely on the server
const res = await fetch('https://jsonplaceholder.typicode.com/posts', { next: { revalidate: 60 } })
if (!res.ok) {
// This will activate the closest `error.js` Error Boundary
throw new Error('Failed to fetch data')
}
return res.json()
}

export default async function PostsPage() {
const posts = await getPosts()

return (
<ul>
{posts.map((post) => (
<li key={post.id}>{post.title}</li>
))}
</ul>
)
}



  • Notice the `async/await` directly in the component and the function!


  • You handle fetching with simple `fetch`, and Next.js automatically handles caching and revalidation (`revalidate: 60`).



4. Bridging the Gap: Where to Use 'use client'



While Next.js prefers Server Components for performance, you still need to use **Client Components** for interactivity. If a component needs to use:



  1. State (`useState`)

  2. Effects (`useEffect`)

  3. Browser APIs (like `window` or event listeners)


...then you must add the `'use client'` directive at the top of the file.



Conclusion



Moving from React to Next.js is a natural, necessary evolution. It allows you to leverage your existing React knowledge while adopting powerful features like file-system routing, built-in SEO, and advanced rendering patterns (SSR, SSG, ISR). The learning curve is gentle because the core is still React, but the performance payoff is immense. Happy coding!