Серверные компоненты (Server Components) в JavaScript представляют
собой блоки интерфейса, которые выполняются исключительно на сервере.
Они создаются с целью оптимизации производительности и снижения нагрузки
на клиентскую часть. Основная особенность серверных компонентов —
невозможность прямого использования состояния и эффектов браузера, таких
как useState или useEffect в React. Они не
содержат интерактивности и предназначены для генерации статического
HTML, который затем отправляется на клиент.
Преимущества серверных компонентов:
Однако серверные компоненты не могут хранить локальное состояние или обрабатывать события браузера напрямую. Любая интерактивность должна быть реализована через клиентские компоненты или JavaScript на стороне клиента.
Клиентские компоненты (Client Components) создаются для работы непосредственно в браузере. Они используют возможности JavaScript и фреймворков вроде React, включая управление состоянием, обработку событий, эффекты и анимацию. Такие компоненты необходимы там, где требуется динамическая интерактивность: формы, кнопки, модальные окна, элементы с анимацией.
Особенности клиентских компонентов:
window, document и другим
объектам браузера.useState, useEffect,
useLayoutEffect).Недостатком является дополнительная нагрузка на клиент и увеличение объёма JS, который требуется загрузить и выполнить в браузере.
Концепция «островов» (Islands Architecture) появилась как компромисс между серверными и клиентскими компонентами. Основная идея состоит в том, что большая часть страницы рендерится на сервере как статический HTML, а интерактивные участки (острова) становятся клиентскими компонентами, подключаемыми только там, где это необходимо.
Ключевые принципы архитектуры островов:
Архитектура островов идеально подходит для сайтов с большим количеством статического контента, где лишь небольшая часть требует интерактивности. Примером могут служить новостные порталы, корпоративные сайты, интернет-магазины с динамическими фильтрами и корзинами.
| Параметр | Серверные компоненты | Острова (Client Components внутри островов) |
|---|---|---|
| Место выполнения | Только на сервере | Сервер + клиент (интерактивная часть) |
| Поддержка состояния | Нет | Да, в пределах интерактивного острова |
| Обработка событий браузера | Нет | Да, события обрабатываются на клиенте |
| Объём JavaScript на клиенте | Минимальный | Только для интерактивных островов |
| Доступ к DOM | Нет | Полный доступ |
| Применение | Статический контент, SEO-оптимизация, быстрый первый рендер | Формы, кнопки, динамические виджеты, анимация |
Использование серверных компонентов и островов совместно позволяет создавать высокопроизводительные приложения. Рекомендуется рендерить весь статический контент на сервере, а интерактивные элементы — выделять в отдельные острова. Это снижает время загрузки страницы, уменьшает потребление ресурсов клиента и повышает общую отзывчивость интерфейса.
В современных фреймворках, таких как React 18+ с Server Components или Astro, такая комбинация стала стандартной практикой. Принцип «рендерим на сервере всё, что можно, и интерактивное — только на клиенте» обеспечивает баланс между производительностью и динамичностью интерфейса.