Plaintext Engineering
0%

🪂 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:

Suddenly, my SPA (Single Page Application) approach wasn’t cutting it. I was manually implementing:

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 TypeReact AloneNextJS/FrameworkWhy?
Marketing Sites15%85%SEO, performance, static generation
E-commerce5%95%SSR, SEO, Core Web Vitals
SaaS Dashboards40%60%Authentication complexity, but moving to Next
Component Libraries90%10%Framework agnostic
Internal Tools70%30%Less concern about SEO/performance
Embedded Widgets95%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:

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:

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.

Here’s my honest take after working with both approaches extensively:

React alone is still very much alive for specific use cases:

NextJS (or similar frameworks) have become the default for:

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:

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