🪂 Is React Still Flying Solo? React vs Next.js in 2025
Aug 25, 2025 • 8 min read

Hey there, fellow developers! đź‘‹
Let’s have a real talk about something that’s been on my mind lately (and probably yours too). Are people still using React by itself, or has NextJS basically become the default way to use React? As someone who’s been building with React since 2017 and jumped on the NextJS train around 2020, I’ve got some thoughts and data to share.
The Current State of Affairs: What the Numbers Tell Us
First, let me hit you with some fresh data that might surprise you. According to the latest surveys and statistics:
React’s Dominance Remains Strong
React came in second for both most used (81.1%) and most loved (46.7%) in recent JavaScript ecosystem surveys. That’s still massive adoption! As of September 2024, the React core package (react) records over 20 million weekly downloads, according to NPM Trends. Twenty. Million. Downloads. Per week. That’s not going anywhere anytime soon.
Of these frameworks, the clear favorite is React, with 57% of JavaScript developers using it. According to the survey, the second most used is Vue (32%), with third place going to Next.js (27%). Interesting, right? React still leads, but NextJS is climbing fast.
NextJS’s Rising Star
Here’s where things get interesting. Next.js emerges as the most used meta-framework (source: 2024 State of JavaScript). When we talk about React frameworks specifically, NextJS is absolutely dominating the space.
My Personal Journey: From Create React App to NextJS
Let me tell you about my own evolution as a React developer, because I think it mirrors what a lot of us have experienced.
The Early Days (2017-2019): Pure React Heaven
Back in the day, I was all about that vanilla React life. Create React App was my best friend, and I thought I had everything I needed:
// My typical 2018 React setup
import React, { useState, useEffect } from 'react';
import ReactDOM from 'react-dom';
function App() {
const [data, setData] = useState(null);
useEffect(() => {
fetch('/api/data')
.then(res => res.json())
.then(setData);
}, []);
return (
<div>
<h1>My React App</h1>
{data ? <div>{data.message}</div> : <div>Loading...</div>}
</div>
);
}
ReactDOM.render(<App />, document.getElementById('root'));
Life was simple. No build complexity, no server-side rendering headaches, just good old client-side React doing its thing.
The Reality Check (2019-2020): SEO and Performance Woes
Then reality hit. I was building e-commerce sites and marketing pages that needed:
- SEO that actually worked
- Fast initial page loads
- Good Core Web Vitals scores
- Social media previews that weren’t broken
Suddenly, my SPA (Single Page Application) approach wasn’t cutting it. I was manually implementing:
- React Helmet for meta tags
- Code splitting with React.lazy
- Complex routing with React Router
- Build optimization with Webpack configurations
I spent more time fighting tooling than building features. Sound familiar?
The NextJS Revelation (2020-Present)
When I finally tried NextJS, it was like someone had read my mind and built exactly what I needed:
// The same functionality, but with NextJS magic
import { useState, useEffect } from 'react';
import Head from 'next/head';
export default function HomePage({ initialData }) {
const [data, setData] = useState(initialData);
return (
<>
<Head>
<title>My Next.js App</title>
<meta name="description" content="SEO-friendly React app" />
</Head>
<div>
<h1>My Next.js App</h1>
<div>{data.message}</div>
</div>
</>
);
}
// This runs on the server before the page loads
export async function getServerSideProps() {
const res = await fetch('https://api.example.com/data');
const initialData = await res.json();
return { props: { initialData } };
}
Just like that, I had server-side rendering, automatic code splitting, built-in SEO optimization, and API routes. The developer experience was night and day.
When I Still Use React Alone
Now, before you think I’ve completely abandoned vanilla React, let me be clear – there are absolutely still times when I reach for React by itself:
1. Component Libraries and Design Systems
When I’m building reusable component libraries, I want them to be framework-agnostic:
// Building a component library
import React from 'react';
export const Button = ({ variant = 'primary', children, ...props }) => {
return (
<button
className={`btn btn-${variant}`}
{...props}
>
{children}
</button>
);
};
// This can be used in NextJS, Gatsby, or any React app
2. Embedded Widgets and Micro-frontends
For widgets that get embedded in other sites or micro-frontend architectures, vanilla React is perfect:
// A widget that gets embedded anywhere
import React from 'react';
import { createRoot } from 'react-dom/client';
function ChatWidget() {
return (
<div className="chat-widget">
{/* Widget content */}
</div>
);
}
// Can be embedded in any website
const container = document.getElementById('chat-widget');
const root = createRoot(container);
root.render(<ChatWidget />);
3. Learning and Prototyping
When I’m teaching React or quickly prototyping ideas, I often start with Vite + React because it’s fast and minimal:
npm create vite@latest my-react-app -- --template react-ts
cd my-react-app
npm install
npm run dev
No routing, no SSR, no opinions – just React in its purest form.
4. Electron or React Native Projects
For desktop or mobile apps, I’m using React but in completely different contexts where NextJS doesn’t make sense.
The Data Breakdown: Usage Patterns by Project Type
Let me break down what I’m seeing in the wild based on the projects I’ve worked on and consulted for:
Project Type | React Alone | NextJS/Framework | Why? |
---|---|---|---|
Marketing Sites | 15% | 85% | SEO, performance, static generation |
E-commerce | 5% | 95% | SSR, SEO, Core Web Vitals |
SaaS Dashboards | 40% | 60% | Authentication complexity, but moving to Next |
Component Libraries | 90% | 10% | Framework agnostic |
Internal Tools | 70% | 30% | Less concern about SEO/performance |
Embedded Widgets | 95% | 5% | Bundle size, deployment flexibility |
The Real Talk: Why NextJS Has Won Over So Many Developers
1. The “It Just Works” Factor
Remember when we had to configure Webpack, Babel, ESLint, Prettier, and a dozen other tools just to get a decent development environment? NextJS eliminated that pain:
// .next.config.js - This is literally all you need for most projects
/** @type {import('next').NextConfig} */
const nextConfig = {
experimental: {
appDir: true,
},
}
module.exports = nextConfig
2. Performance by Default
NextJS gives you performance optimizations out of the box:
- Automatic code splitting
- Image optimization
- Font optimization
- Script optimization
- Automatic static optimization
3. Full-Stack Capabilities
API routes turned NextJS into a full-stack solution:
// pages/api/users.js or app/api/users/route.js
export async function GET(request) {
const users = await db.user.findMany();
return Response.json(users);
}
export async function POST(request) {
const userData = await request.json();
const user = await db.user.create({ data: userData });
return Response.json(user);
}
No need for a separate backend framework for simple applications.
4. Deploy Anywhere Mentality
The fact that I can deploy the same NextJS app to:
- Vercel (obviously)
- Netlify
- AWS Lambda
- Docker containers
- Traditional servers
This flexibility is huge for real-world projects.
The Counterargument: When NextJS Might Be Overkill
Let’s be honest – NextJS isn’t always the right choice. Here’s when I still reach for vanilla React:
Bundle Size Concerns
If you’re building something that needs to be super lightweight:
// A simple calculator widget - vanilla React + Vite
import { useState } from 'react';
function Calculator() {
const [result, setResult] = useState(0);
// Just the logic you need, nothing more
return <div>/* calculator UI */</div>;
}
// Bundle size: ~45KB gzipped
// NextJS equivalent: ~200KB+ gzipped
Complex Authentication Requirements
Sometimes NextJS’s auth patterns don’t fit your specific enterprise requirements. I’ve worked on projects where the authentication was so custom that NextJS’s built-in patterns actually made things harder.
Team Learning Curve
If your team is just learning React, jumping straight to NextJS can be overwhelming. There’s value in understanding React fundamentals first.
The Verdict: It’s About Context, Not Trends
Here’s my honest take after working with both approaches extensively:
React alone is still very much alive for specific use cases:
- Component libraries
- Embedded applications
- Learning environments
- Highly specialized applications
- When bundle size is critical
NextJS (or similar frameworks) have become the default for:
- Business websites
- E-commerce platforms
- Content-heavy applications
- Applications that need SEO
- Full-stack applications
Looking Ahead: The Future Landscape
Most likely 2025 will be the year when React Server Components become more mainstream, and honestly, that’s going to push even more developers toward NextJS or similar frameworks because implementing RSC from scratch in a vanilla React app is… well, let’s just say it’s not fun.
The industry is moving toward:
- Better performance by default
- Better developer experience
- Full-stack JavaScript solutions
- Edge computing and streaming
All of these trends favor framework-based approaches over vanilla React.
My Current Setup and Recommendations
For anyone asking what I’d recommend in 2025:
If You’re New to React
Start with vanilla React + Vite. Learn the fundamentals first:
npm create vite@latest my-first-react-app -- --template react
Build a few projects, understand state management, component lifecycle, and React patterns.
If You’re Building Production Applications
Go with NextJS unless you have a specific reason not to:
npx create-next-app@latest my-app --typescript --tailwind --eslint --app
You’ll thank me later when you don’t have to configure everything from scratch.
If You’re Building Component Libraries
Stick with vanilla React but use modern tooling:
npm create vite@latest my-component-lib -- --template react-ts
# Add Storybook, build tools, etc.
The Bottom Line
React by itself isn’t dead – it’s just evolved. Most developers are using React within frameworks because those frameworks solve real problems we all face. The core React skills you learn transfer perfectly to NextJS, Remix, Gatsby, or any other React framework.
React will maintain its leading position in the list of front-end frameworks in 2025, and adoption is taking place globally and in many industries. The question isn’t whether React is relevant – it’s which tooling and frameworks will help you build better applications faster.
My advice? Learn React fundamentals first, then pick up a framework that matches your project needs. Don’t feel pressured to use NextJS for everything, but don’t ignore it either. The JavaScript ecosystem is big enough for both approaches to coexist.
Sources
Related articles


