awesome-everything EN
↑ Обратно к восхождению

Браузер и фронтенд-рантайм

SSG, SSR, ISR, streaming и RSC — как работает каждая стратегия

Суть Механизм каждой стратегии рендеринга: CDN-путь SSG, цена SSR на критическом пути, модель stale-while-revalidate ISR, shell-first-сброс streaming и сокращение бандла через RSC.
Высота — путь к senior
НольJuniorMiddleSenior
Ты на middle-высоте — в небе
◷ 18 min

Цена на странице товара меняется дважды в день. Залогиненный дашборд разный для каждого пользователя. Пост блога одинаков для всех. Эти три факта подразумевают три разные стратегии рендеринга — и выбор неправильной означает платить за серверные вычисления на каждый запрос, когда хватило бы попадания в кеш CDN, или отдавать протухшую цену 12 часов, когда ISR мог бы ограничить протухлость одним часом.

SSG: рендер на билде. Static Site Generation гоняет компоненты один раз во время билда и пишет результат в HTML-файлы, деплоящиеся на CDN. Путь запроса непобедим — никаких серверных вычислений, попадание в edge-кеш, time-to-first-byte в десятках миллисекунд. Цена — свежесть и масштаб: контент заморожен на момент билда, и сайт на миллион страниц билдится долго. SSG — правильный дефолт для всего, чей контент не меняется на запрос и на пользователя: маркетинговые страницы, документация, посты блога. В момент, когда страница должна отражать «сейчас» или «именно этого пользователя», чистый SSG ломается.

SSR: рендер на запрос. Server-Side Rendering гоняет компоненты на сервере на каждый запрос, производя свежий HTML каждый раз. Он может читать куки пользователя, текущее время, живые данные — HTML точно правильный для этого запроса. Цена — на критическом пути: time-to-first-byte пользователя теперь включает время серверного рендера плюс загрузку данных. Медленный запрос к базе в рендере — медленный TTFB для пользователя. SSR правилен, когда страница реально должна быть свежей на запрос или персонализированной: залогиненный дашборд, лента, результаты поиска.

ISR: SSG, обновляющий себя. Incremental Static Regeneration — SSG с правилом ревалидации. Страница отдаётся статически из кеша, но после настроенного времени — или по явному on-demand триггеру — следующий запрос получает протухшую копию, пока сервер регенерирует свежую в фоне; последующие запросы получают новую. Это stale-while-revalidate, применённый к целым страницам. ISR — ответ на «большей частью статично, но контент всё же меняется — страница товара, чья цена обновляется несколько раз в день». Мгновенная доставка SSG для подавляющего большинства запросов и ограниченная протухлость вместо полного ребилда.

Спектр свежести — от замороженного до живого

SSG
билд
заморожен на билде, мгновенный хит CDN
ISR
билд + интервал
stale-while-revalidate для страниц
SSR
на запрос
свежо, TTFB = серверный рендер + данные
CSR
в браузере, после фетча
самое свежее, сначала пустая оболочка

Streaming SSR: отправка HTML кусками. У обычного SSR есть блокирующий изъян: сервер должен закончить рендер всей страницы — включая самую медленную загрузку данных — до того, как сможет отправить хоть один байт. Если одному виджету нужен запрос на 400 мс, каждый пользователь ждёт 400 мс на time-to-first-byte. Streaming SSR это чинит. С renderToPipeableStream сервер шлёт оболочку немедленно, и каждая граница <Suspense> стримится по мере резолва её данных. Пользователь видит шапку, навигацию и лейаут за ~50 мс; медленный виджет приходит на 400 мс позже как стримленный кусок. TTFB падает до скорости самой быстрой части страницы.

React Server Components: компоненты, никогда не уходящие на клиент. RSC — совсем другая ось. Server Component гоняется только на сервере — его код никогда не шлётся в браузер. Он может читать базу напрямую, использовать серверные секреты и импортировать тяжёлые библиотеки (markdown-парсер, подсветку синтаксиса), которые ничего не стоят клиенту, потому что никогда не пересекают провод. Его выход — не HTML и не JS-бандл, а специальный сериализованный формат, RSC payload, описывающий отрендеренное дерево. Client Components (помеченные 'use client') — интерактивные острова внутри дерева; только их код шлётся. Выигрыш — размер бандла: части приложения, которые просто «показывают серверные данные», несут ноль клиентского JavaScript.

Почему это работает

RSC и SSR часто путают как конкурирующие. Они ортогональны. SSR — о том, когда и где генерируется HTML. RSC — о том, какие компоненты вообще шлют код на клиент. Продакшен-страница Next.js App Router обычно использует оба: Server Components гоняются на сервере и производят HTML через SSR (часто стримленный), а Client Components внутри тоже серверно-рендерятся в HTML для первой отрисовки и потом гидрируются. RSC уменьшает, сколько надо гидрировать; SSR/streaming контролирует, когда HTML появляется.

Викторина

Страница товара должна показывать цену, обновляющуюся несколько раз в день, и грузиться мгновенно для подавляющего большинства посетителей. Какая стратегия подходит лучше всего?

Викторина

У обычного SSR один виджет, которому нужен запрос к базе на 400 мс. Как streaming SSR меняет time-to-first-byte пользователя?

Викторина

В чём выгода размера бандла у React Server Component?

Расставь шаги по порядку

Расставьте эти стратегии рендеринга по свежести их HTML — от замороженного-на-билде до свежего-каждый-запрос.

  1. 1 SSG — отрендерено один раз на билде
  2. 2 ISR — статика, регенерируется на интервале ревалидации
  3. 3 SSR — рендерится свежо на каждый запрос
  4. 4 CSR — рендерится в браузере, после загрузки живых данных
Посчитай

Обычный SSR ждёт самую медленную загрузку данных — скажем 400 мс — до отправки любого HTML. Streaming SSR шлёт оболочку, как только она готова, ~50 мс. Примерно сколько миллисекунд time-to-first-byte экономит streaming здесь?

мс
Вспомните перед уходом
  1. 01
    Почему SSG правильный дефолт для документации и маркетинговых страниц, но неправильный для залогиненного дашборда?
  2. 02
    Как ISR работает как stale-while-revalidate для страниц?
  3. 03
    Какова роль границы Suspense в streaming SSR?
Итог

SSG выигрывает по TTFB — десятки миллисекунд, попадание в edge CDN, никаких серверных вычислений — но контент заморожен на момент билда и для обновления нужен полный ребилд. SSR меняет эту скорость на свежесть: каждый запрос гоняет дерево компонентов на сервере с живыми данными, но TTFB пользователя теперь включает время серверного рендера и загрузки данных. ISR находится между ними через stale-while-revalidate: страницы отдаются статически, после интервала ревалидации сервер регенерирует в фоне, пока протухшая копия ещё отдаётся — идеально для контента, меняющегося с известной частотой. Streaming SSR меняет единицу ожидания с всей страницы на отдельные границы Suspense: оболочка приходит за ~50 мс, медленные виджеты стримятся по мере резолва запросов. RSC режет другую цену: работая исключительно на сервере, Server Components никогда не вносят вклад в клиентский бандл или поверхность гидратации — тяжёлые библиотеки и код загрузки данных остаются на сервере, и только интерактивные листья Client Component шлют JS.

Связанные уроки
встречается в267
Продолжить восхождение ↑Цена гидратации: selective, progressive, острова, resumability
хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources4
expand
  1. 01
  2. 02
  3. 03
  4. 04

Trademarks belong to their respective owners. Editorial reference only.