filipovici bogdan

2024-02-19 · 10 min read

battle of the greats: react vs next.js

react
next.js
frontend
web development
javascript

in the ever-evolving landscape of web development, two titans stand out: react and next.js. while they're often mentioned in the same breath, their roles and capabilities differ significantly. let's explore what makes each one special and how they complement each other.

react: the foundation

react, developed by facebook, revolutionized frontend development with its component-based architecture and virtual dom. it's a library that focuses on ui components and state management.

pros of react:

  • flexibility: complete control over your application's architecture
  • rich ecosystem: vast collection of libraries and tools
  • mature community: extensive resources and solutions available
  • lightweight: minimal core library size

cons of react:

  • configuration heavy: requires setup for routing, bundling, etc.
  • no opinion: architectural decisions fall on developers
  • seo challenges: additional setup needed for server-side rendering
  • performance optimization: manual implementation required

next.js: the evolution

next.js builds upon react's foundation, providing an opinionated framework that addresses many of react's limitations.

pros of next.js:

  • zero configuration: works out of the box
  • built-in features: routing, ssr, ssg, api routes
  • performance optimized: automatic code splitting, image optimization
  • seo friendly: server-side rendering by default

cons of next.js:

  • less flexibility: more opinionated structure
  • learning curve: additional concepts to master
  • hosting considerations: some features require specific hosting setups

behind the scenes: next.js magic

1. server components

// in next.js 13+
async function ProductPage() {
  const products = await fetchProducts(); // runs on server
  return <ProductList products={products} />;
}

server components execute on the server, reducing client-side javascript and improving performance.

2. automatic route optimization

// app/products/[id]/page.tsx
export async function generateStaticParams() {
  const products = await fetchProducts();
  return products.map((product) => ({
    id: product.id,
  }));
}
 
export default async function ProductPage({
  params,
}: {
  params: Promise<{ id: string }>;
}) {
  const { id } = await params;
  const product = await fetchProduct(id);
  return <ProductDetails product={product} />;
}

next.js automatically generates optimized static pages at build time. note that in next.js 15, params is a promise and must be awaited.

3. image optimization

import Image from 'next/image'
 
function Product() {
  return (
    <Image
      src="/product.jpg"
      alt="product"
      width={500}
      height={300}
      priority
    />
  );
}

automatic image optimization, lazy loading, and proper sizing.

when to choose what?

choose react when:

  • building a highly customized application
  • creating a client-side-only app
  • working with existing complex setups
  • need maximum flexibility

choose next.js when:

  • building production-ready applications
  • seo is crucial
  • need server-side rendering
  • want built-in performance optimizations

real-world example: e-commerce site

react implementation:

// manual setup needed for routing
import { BrowserRouter, Routes, Route } from 'react-router-dom';
import { useState, useEffect } from 'react';
 
function ProductPage() {
  const [products, setProducts] = useState([]);
  const [loading, setLoading] = useState(true);
 
  useEffect(() => {
    fetch('/api/products')
      .then(res => res.json())
      .then(data => {
        setProducts(data);
        setLoading(false);
      });
  }, []);
 
  if (loading) return <Loading />;
  return <ProductList products={products} />;
}

next.js implementation:

// app/products/page.tsx
export default async function ProductPage() {
  const res = await fetch('https://api.store.com/products', {
    next: { revalidate: 3600 },
  });
  const products = await res.json();
  return <ProductList products={products} />;
}

the next.js version is not only shorter but also:

  • runs on the server
  • automatically optimized
  • seo-friendly
  • better performance

conclusion

while react remains the foundational library that revolutionized frontend development, next.js has emerged as a powerful framework that solves many real-world challenges. the choice between them often comes down to specific project requirements, but next.js is increasingly becoming the go-to choice for production applications due to its built-in optimizations and developer experience.