Что такое React Server Components
React Server Components (RSC) — это новый тип компонентов, который полностью исполняется на сервере. В отличие от традиционных React‑компонентов, которые могут рендериться как на сервере, так и в браузере, RSC не попадают в клиентский бандл и не требуют гидратации. Их основной набор возможностей:
- Выполнение только на сервере.
- Прямой доступ к базе данных, файловой системе и другим бекенд‑ресурсам без промежуточных API‑запросов.
- Отсутствие JavaScript‑кода, отправляемого клиенту.
- Невозможность использовать клиентские хуки (
useState,useEffectи пр.) и браузерные API (window,document).
Эти ограничения делают RSC идеальными для построения страниц, где требуется только статическое представление данных, но без интерактивных элементов.
Ментальная модель и порядок рендеринга
Традиционный стек React выглядит так:
Server → HTML → Client → Hydrate → Interactive
С серверными компонентами процесс упрощается:
Server → Rendered Component → Client → Already Interactive
Сервер генерирует готовый UI‑дерево, включающее как серверные, так и клиентские части. Клиент получает уже готовый набор HTML‑элементов и только те компоненты, которые объявлены как клиентские. Это устраняет необходимость в гидратации большинства UI‑элементов и сокращает время до первой отрисовки.
Сравнение с клиентскими компонентами
| Аспект | Server Component (по умолчанию в Next.js 15) | Client Component |
|---|---|---|
| Где исполняется | На сервере | В браузере |
| Доступ к бекенду | Прямой (например, db.products.findMany()) | Через API‑запросы |
| JavaScript в клиенте | Не отправляется | Отправляется |
| Возможность использовать хуки | Нет (useState, useEffect недоступны) | Да |
| Поддержка SEO | Высокая (полный HTML сразу) | Зависит от гидратации |
| Автоматическое код‑сплиттинг | Да (каждый RSC — отдельный запрос) | Да (по роутам) |
Пример серверного компонента
// app/products/page.jsx — серверный компонент по умолчанию
import { db } from '@/lib/database';
export default async function ProductsPage() {
// Прямой запрос к базе без API‑слоя
const products = await db.products.findMany();
return (
<section>
<h1>Products</h1>
<ul>
{products.map(product => (
<li key={product.id}>{product.name}</li>
))}
</ul>
</section>
);
}
Пример клиентского компонента
// components/Counter.jsx
'use client'; // Обязательная директива
import { useState } from 'react';
export default function Counter() {
const [count, setCount] = useState(0);
return (
<button onClick={() => setCount(count + 1)}>
Count: {count}
</button>
);
}
Преимущества серверных компонентов
- Отсутствие клиентского JavaScript – экономия байтов, ускорение загрузки.
- Прямой доступ к бекенд‑ресурсам – сокращение количества сетевых запросов и упрощение архитектуры.
- Автоматическое разделение кода – каждый RSC формирует отдельный запрос к серверу, что упрощает кеширование и масштабирование.
- Повышенный SEO – поисковые роботы сразу получают полностью отрендеренный HTML.
Эти свойства делают RSC привлекательными для страниц каталога, статических блогов, лендингов и любой другой части сайта, где интерактивность не критична.
Когда использовать клиентские компоненты
Несмотря на преимущества RSC, есть сценарии, где необходим клиентский код:
- Обработчики событий:
onClick,onChange,onSubmit. - Управление состоянием:
useState,useReducer,useContext. - Эффекты:
useEffect,useLayoutEffect– для работы с таймерами, подписками, анимациями. - Браузерные API:
localStorage,sessionStorage,navigator,window.
Если компонент требует любой из перечисленных механизмов, он обязан быть объявлен как клиентский ('use client').
Архитектурные паттерны: композиция серверных и клиентских компонентов
Эффективное приложение обычно сочетает оба типа компонентов. На уровне страниц часто используют серверные компоненты для загрузки данных, а внутри внедряют клиентские интерактивные блоки.
Пример микса в дашборде
// app/dashboard/page.jsx — серверный компонент
import { getUser, getStats } from '@/lib/data';
import InteractiveChart from './InteractiveChart'; // клиентский
export default async function Dashboard() {
const [user, stats] = await Promise.all([getUser(), getStats()]);
return (
<section>
<h2>Welcome, {user.name}</h2>
<p>Current stats: {stats.summary}</p>
{/* Интерактивный график, который использует клиентские хуки */}
<InteractiveChart data={stats.chartData} />
</section>
);
}
В этом примере серверный компонент собирает все необходимые данные, а клиентский InteractiveChart отвечает за отрисовку интерактивного графика, реагирующего на пользовательские действия.
Потоковая передача и Suspense
React 18 introduced Streaming SSR, а RSC используют эту возможность для постепенной отправки готового UI‑дерева клиенту. Комбинация с Suspense позволяет отображать загрузочные состояния только для тех частей, которые действительно требуют времени (например, клиентские компоненты, загружаемые динамически).
import { Suspense } from 'react';
import LoadingSpinner from '@/components/LoadingSpinner';
import HeavyClientWidget from '@/components/HeavyClientWidget';
export default function Page() {
return (
<section>
<h1>Analytics</h1>
{/* Серверный контент готов сразу */}
<p>Summary generated on the server.</p>
{/* Клиентский виджет загружается асинхронно */}
<Suspense fallback={<LoadingSpinner />}>
<HeavyClientWidget />
</Suspense>
</section>
);
}
Благодаря потоковой передаче, пользователь получает часть страницы сразу, пока тяжелый клиентский виджет загружается в фоне. Это улучшает perceived performance и снижает показатель Time‑to‑Interactive.
Практические рекомендации для разработки с RSC
- Разделяйте ответственность: серверные компоненты отвечают за данные, клиентские — за интерактивность.
- Минимизируйте количество клиентских компонентов: каждый из них добавляет JavaScript‑нагрузку.
- Пользуйтесь
async/awaitв серверных компонентах для параллельных запросов к базе и API. - Обрабатывайте ошибки на уровне сервера: RSC могут возвращать fallback UI без участия клиента.
- Тестируйте потоковую отдачу: убедитесь, что критический контент отображается без задержек, а загрузочные индикаторы корректно работают в
Suspense.
С учётом этих принципов React Server Components становятся мощным инструментом для построения быстрых, SEO‑дружественных и масштабируемых веб‑приложений в 2026 году.