Компоненты 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