Ответ вслух Senior React 18-19: Suspense, transitions, RSC обновлено

Серверные компоненты

Вопрос

Расскажи, что такое React Server Components, какие у них ограничения и что они дают.

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Серверный компонент это компонент, который выполняется только на сервере или на этапе сборки. Его код и зависимости не попадают в клиентский бандл, клиент получает только результат рендера в специальном формате.

Что должно прозвучать в ответе

  • Серверный компонент выполняется только на сервере или при сборке, его код не уходит в бандл

  • Может быть async и читать данные напрямую (БД, файлы, секреты)

  • Нельзя использовать состояние, эффекты, обработчики и браузерные API

  • `'use client'` задаёт границу; клиентский модуль и его импорты идут в бандл

  • Пропсы через границу сериализуемые: данные, JSX, промисы, серверные функции; обычные функции нельзя

  • RSC не равно SSR: SSR даёт первый HTML и гидрирует, RSC вообще не гидрируются

Что могут спросить следом

  • Как вставить клиентский компонент внутрь серверного и наоборот?
  • Что такое серверные функции и как они связаны с формами?
  • Как RSC влияют на размер бандла и время до интерактивности?

Разбор

Серверный компонент это компонент, который выполняется только на сервере или на этапе сборки. Его код и зависимости не попадают в клиентский бандл, клиент получает только результат рендера в специальном формате. Поэтому тяжёлую библиотеку для разбора markdown можно использовать на сервере бесплатно для пользователя.

Серверный компонент может быть асинхронным и читать данные прямо из базы или API с секретами, без отдельного эндпоинта. Ограничения: нет useState, useEffect, обработчиков и доступа к window.

Интерактивные части выносятся в клиентские компоненты с директивой 'use client', это граница: модуль и всё, что он импортирует, идёт в бандл. Серверный компонент может рендерить клиентский и передавать ему сериализуемые пропсы. Функцию-обработчик передать нельзя, можно только серверную функцию с 'use server'. Клиентский компонент не может импортировать серверный, но может получить его как children.

Важно не путать с SSR. SSR рендерит HTML для первого показа, а потом тот же код гидрируется. Серверные компоненты не гидрируются вовсе. В Next.js App Router используются оба механизма вместе.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.