Глубокое понимание React Server Components

2 мин

1. Что такое React Server Components (RSC)?

React Server Components (RSC) — это новый тип компонентов React, которые рендерятся во время сборки или на сервере. В отличие от традиционных компонентов, рендерящихся в браузере клиента и теперь называемых «Client Components», код RSC никогда не отправляется клиенту. Браузер получает только готовый HTML или данные в специальном потоковом формате.

Это знаменует превращение React из исключительно клиентской библиотеки в full-stack-фреймворк, способный бесшовно работать между сервером и клиентом.

2. Какие проблемы решают RSC?

RSC появились прежде всего для решения следующих ключевых проблем:

  • Огромные пакеты JavaScript: Традиционные React-приложения упаковывают и отправляют клиенту JS-код всех компонентов, в том числе не имеющих прямой интерактивности, что замедляет первоначальную загрузку. RSC позволяют оставить множество компонентов — например, текст, макеты и представления данных — на сервере, добиваясь для них нулевого объёма JS.
  • Водопады запросов (Request Waterfalls): Типичный шаблон получения данных на клиенте выглядит так: рендеринг компонента -> useEffect -> отправка запроса -> ожидание данных -> повторный рендеринг. При глубокой вложенности компонентов возникает водопад запросов, замедляющий отображение страницы. RSC могут получать данные прямо на сервере через async/await и передавать их клиенту потоком вместе с компонентами, устраняя первопричину проблемы.
  • Прямой доступ к ресурсам бэкенда: RSC работают в серверной среде, например Node.js. Это позволяет им прямо и безопасно обращаться к базам данных, файловой системе или внутренним API, не открывая клиенту дополнительные API-эндпоинты.

3. Server Components и Client Components

Понимание различий между ними — ключ к освоению RSC.

ХарактеристикаServer Components (серверные компоненты)Client Components (клиентские компоненты)
Среда выполненияСервер (Node.js и т. п.)Клиент (браузер)
JS отправляется клиентуНетДа
Состояние (State)Не поддерживается (например, useState)Поддерживается
Жизненный цикл/HooksНе поддерживаются (например, useEffect)Поддерживаются
Взаимодействие (Events)Не поддерживается (например, onClick)Поддерживается
Получение данныхПоддерживает async/awaitЧерез useEffect или библиотеку получения данных
Правила импортаНе может импортировать Client ComponentsМожет импортировать Server Components (как children или prop)

Практическое правило: По умолчанию считайте все компоненты Server Components. Только когда компоненту нужны useState, useEffect или обработка пользовательских событий вроде onClick, добавляйте директиву "use client"; в начало файла и помечайте его как Client Component.

4. Как они работают вместе?

Современное React-приложение сочетает оба типа. Например, страница записи в блоге может состоять из следующих частей:

  • PageLayout (Server Component): Отвечает за общий макет.
  • ArticleContent (Server Component): Получает данные статьи из базы данных или Markdown-файла и рендерит их.
  • LikeButton (Client Component): Содержит useState и событие onClick для обработки отметки «Нравится».
  • Comments (Client Component): Получает и отображает комментарии, содержит отправку формы и другие интерактивные элементы.

Серверные компоненты могут на сервере «держать места» для клиентских компонентов, а затем браузер бесшовно соединит их вместе.

Заключение

React Server Components — глубокий сдвиг парадигмы, расширяющий возможности React с браузера на сервер и приносящий заметные преимущества в производительности и удобстве разработки. Хотя RSC требуют новой ментальной модели, практика в таких фреймворках, как Next.js App Router, быстро превращает их в новый стандарт создания высокопроизводительных и масштабируемых Web-приложений.