Inicio > Cursos > React > React Server Components (RSC)
ReactReact AvanzadoLección 20 de 21

React Server Components (RSC)

React Server Components (RSC) son componentes que se ejecutan SOLO en el servidor. No se envían al navegador, no aumentan el tamaño del bundle, y pueden acceder directamente a bases de datos, archivos del sistema, y APIs internas sin exponer credenciales. Next.js (App Router) los implementa por defecto: todo componente es "Server" a menos que pongas "use client" al inicio del archivo.

La separación es clara: Server Components para fetch de datos, acceso a DB, rendering estático. Client Components (con "use client") para interactividad: useState, useEffect, onClick, formularios. Puedes anidarlos: un Server Component renderiza datos y pasa props a un Client Component que maneja la interacción. Esto reduce drásticamente el JavaScript enviado al navegador.

// app/page.jsx — Server Component (por defecto en Next.js)
// Ejecuta SOLO en el servidor, nunca llega al navegador
import { db } from "@/lib/database";
import ProductList from "./ProductList";

export default async function HomePage() {
  // Acceso directo a DB — sin API, sin fetch
  const products = await db.product.findMany({
    orderBy: { createdAt: "desc" },
    take: 20,
  });

  return (
    <main>
      <h1>Productos ({products.length})</h1>
      {/* Pasa datos al Client Component */}
      <ProductList initialProducts={products} />
    </main>
  );
}

// app/ProductList.jsx — Client Component (interactivo)
"use client";
import { useState } from "react";

export default function ProductList({ initialProducts }) {
  const [search, setSearch] = useState("");
  const filtered = initialProducts.filter(p =>
    p.name.toLowerCase().includes(search.toLowerCase())
  );

  return (
    <div>
      <input
        value={search}
        onChange={(e) => setSearch(e.target.value)}
        placeholder="Buscar producto..."
      />
      {filtered.map(p => (
        <div key={p.id}>{p.name} - ${p.price}</div>
      ))}
    </div>
  );
}

// Server Actions — mutaciones desde el servidor
// app/actions.js
"use server";
export async function addToCart(productId) {
  await db.cart.create({ data: { productId, userId: getCurrentUser() } });
  revalidatePath("/cart");
}
Consejo🔑 Regla simple: si el componente necesita useState, useEffect, onClick o cualquier interactividad del navegador → "use client". Si solo muestra datos → Server Component (default).
← Estado Global: Zustand y Redux ToolkitProyecto Final: App Películas Avanzada →

Practica esta lección

Resuelve los ejercicios del curso de React en la app, gratis y con corrección automática.

Empezar a practicar