React Server Components (RSC)

Компоненти тільки сервера для оптимізованої продуктивності, за замовчуванням у App Router. Ідеально для Сучасних додатків, додатків з багатьма даними та Безпечних додатків, які потребують серверної логіки.

Сервер

🌐
Request
Response
🖥️
Сервер отримує запит
Сервер отримує дані
React.renderToReadableStream()
Сервер рендерить Server Components
Сервер серіалізує payload RSC
Сервер надсилає payload RSC

Клієнт

Клієнт отримує payload RSC
React.hydrateRoot()
Клієнт гідратує компоненти
Сторінка інтерактивна
Переваги x Компроміси

Benefits

  • Оптимізована Продуктивність: Серверні + клієнтські компоненти
  • Безпечний Доступ до Даних: Отримання даних серверною стороною
  • Зменшений Розмір Bundle: Менше JavaScript для клієнта
  • Кращий SEO: Контент рендериться на сервері

Trade-offs

  • Розділення інтерактивності: Потрібно вибирати сервер vs клієнт
  • Крок гідратації: Клієнтські компоненти потребують гідратації
  • Крива навчання: Розуміння меж сервер/клієнт
  • Обмеження серіалізації: Не можна передавати функції/класи
Як реалізувати?

RSC використовує Server Components за замовчуванням у App Router. Server Components не можуть імпортувати Client Components.

// Server Component (за замовчуванням)
export default async function ServerComponent() {
  const res = await fetch("https://api.example.com/data");
  const data = await res.json();

  return (
    <div>
      <h1>{data.title}</h1>
      <ClientComponent data={data} />
    </div>
  );
}

// Client Component (коли потрібно)
"use client";
import { useState } from "react";

export function ClientComponent({ data }: { data: any }) {
  const [count, setCount] = useState(0);
  return <button onClick={() => setCount(count + 1)}>{count}</button>;
}
  • Server Components є асинхронними функціями (за замовчуванням, без директиви)
  • Не можна використовувати React hooks у Server Components
  • Додайте директиву 'use client' лише коли потрібна інтерактивність
  • Server Components можуть отримувати дані безпосередньо, Client Components використовують hooks