Компоненты React Server¶
Серверные компоненты - это новый тип компонентов, которые рендерятся заранее, до сборки, в среде, отдельной от вашего клиентского приложения или сервера SSR.
Эта отдельная среда является «сервером» в React Server Components. Серверные компоненты могут запускаться один раз во время сборки на вашем CI-сервере, или они могут запускаться для каждого запроса с помощью веб-сервера.
Как обеспечить поддержку серверных компонентов?
В то время как React Server Components в React 19 стабильны и не ломаются между основными версиями, базовые API, используемые для реализации бандлера или фреймворка React Server Components, не следуют semver и могут ломаться между основными версиями в React 19.x.
Для поддержки React Server Components в качестве бандлера или фреймворка мы рекомендуем привязываться к определенной версии React или использовать релиз Canary. Мы продолжим работу с бандлерами и фреймворками, чтобы стабилизировать API, используемые для реализации React Server Components в будущем.
Серверные компоненты без сервера¶
Серверные компоненты могут запускаться во время сборки для чтения из файловой системы или получения статического содержимого, поэтому веб-сервер не требуется. Например, вам может понадобиться считывать статические данные из системы управления контентом.
Без серверных компонентов статические данные обычно считываются на клиенте с помощью Effect:
bundle.js | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
api.js | |
---|---|
1 2 3 4 5 |
|
Этот шаблон означает, что пользователям нужно загрузить и разобрать дополнительные 75K (gzipped) библиотек, а также ожидать второго запроса для получения данных после загрузки страницы, только чтобы отобразить статическое содержимое, которое не будет меняться в течение всего времени существования страницы.
С помощью Server Components вы можете отобразить эти компоненты один раз во время сборки:
1 2 3 4 5 6 7 8 9 |
|
Полученный результат можно перевести на сторону сервера (SSR) в HTML и загрузить в CDN. Когда приложение загрузится, клиент не увидит ни оригинального компонента Page
, ни дорогостоящих библиотек для рендеринга уценки. Клиент увидит только отрендеренный результат:
1 |
|
Это означает, что контент виден при первой загрузке страницы, а в сборку не входят дорогостоящие библиотеки, необходимые для рендеринга статического контента.
Вы можете заметить, что приведенный выше серверный компонент является асинхронной функцией:
1 2 3 |
|
Async-компоненты - это новая возможность серверных компонентов, которая позволяет вам await
при рендеринге.
См. раздел Асинхронные компоненты с серверными компонентами ниже.
Серверные компоненты с сервером¶
Серверные компоненты также могут запускаться на веб-сервере во время запроса страницы, позволяя вам получить доступ к слою данных без необходимости создавать API. Они отображаются до сборки приложения и могут передавать данные и JSX в качестве пропсов клиентским компонентам.
Без серверных компонентов часто приходится получать динамические данные на клиенте в Effect:
bundle.js | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
|
api.js | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 |
|
С помощью серверных компонентов вы можете считывать данные и отображать их в компоненте:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
Затем компоновщик объединяет данные, отрисованные компоненты сервера и динамические компоненты клиента в сборку. По желанию, эта сборка может быть отрендерена на стороне сервера (SSR) для создания исходного HTML для страницы. Когда страница загружается, браузер не видит оригинальных компонентов Note
и Author
; клиенту передается только отрендеренный вывод:
1 2 3 4 |
|
Серверные компоненты можно сделать динамичными, повторно получая их с сервера, где они могут получить доступ к данным и отрисовать их заново. Эта новая архитектура приложений сочетает в себе простую ментальную модель «запрос/ответ» многостраничных приложений, ориентированных на сервер, и бесшовную интерактивность одностраничных приложений, ориентированных на клиента, предоставляя вам лучшее из обоих миров.
Добавление интерактивности к серверным компонентам¶
Серверные компоненты не отправляются в браузер, поэтому они не могут использовать интерактивные API, такие как useState
. Чтобы добавить интерактивность серверным компонентам, вы можете объединить их с клиентскими компонентами с помощью директивы "use server"
.
Директива для серверных компонентов отсутствует
Распространенное заблуждение заключается в том, что серверные компоненты обозначаются "use server"
, но директивы для серверных компонентов не существует. Директива "use server"
используется для Server Actions.
Более подробную информацию можно найти в документации по Directives.
В следующем примере серверный компонент Notes
импортирует клиентский компонент Expandable
, который использует состояние для переключения своего состояния expanded
:
Server Component | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
Client Component | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
Для этого сначала отображается Notes
как серверный компонент, а затем дается указание бандлеру создать бандл для клиентского компонента Expandable
. В браузере клиентские компоненты будут видеть вывод серверных компонентов, переданных в качестве пропсов:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
Асинхронные компоненты с серверными компонентами¶
Серверные компоненты представляют новый способ написания компонентов с использованием async/await. При использовании await
в async-компоненте React приостанавливает выполнение обещания и ждет, пока оно разрешится, прежде чем возобновить рендеринг. Это работает через границы сервера/клиента с потоковой поддержкой Suspense.
Вы даже можете создать обещание на сервере и ожидать его на клиенте:
Server Component | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
Client Component | |
---|---|
1 2 3 4 5 6 7 8 9 |
|
Содержимое note
- это важные данные для рендеринга страницы, поэтому мы await
его на сервере. Комментарии находятся под сгибом и имеют более низкий приоритет, поэтому мы запускаем обещание на сервере и ожидаем его на клиенте с помощью API use
. Это приостановит выполнение обещания на клиенте, не блокируя рендеринг содержимого note
.
Поскольку асинхронные компоненты не поддерживаются на клиенте, мы ожидаем обещание с помощью use
.
Источник — https://react.dev/reference/rsc/server-components