Спор о серверном рендеринге и статической генерации обычно ведут в категориях "быстро против гибко", и обе стороны остаются при своих. Реальный ответ скучнее: выбор зависит от того, как часто меняется контент, сколько на сайте страниц и что посетитель должен увидеть в момент открытия. Роботу и человеку в итоге нужен один и тот же HTML, а вот цена этого HTML для бизнеса разная. Разберём оба подхода с позиций SEO, посмотрим, где статика упирается в собственные ограничения, где серверный рендеринг становится необходимостью и какие гибридные режимы снимают саму дилемму.
Разница между SSR и SSG на уровне первого байта ответа
Статическая генерация собирает HTML заранее, на этапе сборки: файл с готовой разметкой ложится на CDN и отдаётся мгновенно, без вычислений на каждый запрос. Серверный рендеринг собирает ту же разметку в момент обращения: берёт шаблон, подтягивает содержимое, отдаёт готовый HTML. Для робота разницы почти нет, в обоих случаях в первом ответе лежит полный контент со ссылками. Разница в экономике: статика стоит копейки на любом трафике, SSR требует живого сервера под каждым визитом.
Гидратация - общий хвост обеих схем: после доставки HTML клиентские скрипты подключают интерактив, события и состояние. Классификация из мира браузеров разделяет смежные понятия: предрендеринг - съём HTML с клиентского приложения на сборке, регидратация - подключение состояния после загрузки страницы. Команда Chrome прямо рекомендует по умолчанию смотреть в сторону серверного рендеринга или статической отдачи и не строить сайты целиком на регидратации: именно она съедает метрики на слабых устройствах.
Сколько стоит гидратация, видно по простому правилу: каждый килобайт клиентского кода выполняется на устройстве пользователя, а не на вашем сервере. Веб-сервер отдаёт текст мгновенно, а браузер распаковывает, разбирает и исполняет бандл по очереди, блокируя главный поток. Отсюда формула: чем больше HTML приезжает готовым и чем меньше скриптов его дорисовывают, тем предсказуемее метрики на любом устройстве. Есть и мелкая разница в обвязке: серверный рендеринг управляет кодами ответов и перенаправлениями программно, на каждый запрос, а у статики заголовки и редиректы настраиваются на уровне CDN. Для индексации это не аргумент ни в одну сторону, но гибкость SSR экономит часы на нестандартных задачах вроде геозависимых ответов.
Страницы которым статика подходит без компромиссов
Блоги, базы знаний, документация, лендинги и страницы брендов - идеальные кандидаты на генерацию при сборке. Контент меняется редко, правки спокойно ждут следующей сборки, а выигрыш велик: ответ из кэша CDN не гоняет вычисления на Origin, время до первого байта стремится к минимуму, и у метрики LCP появляется запас. Для SEO это значит, что робот получает страницу дешевле и быстрее, а сервер не проседает при пиковом обходе.
Хранение тоже дешевеет: терабайты статики лежат в объектном хранилище за копейки, в отличие от фермы рендер-серверов. Надёжность выше: сбой бэкенда не уносит лендинги, они продолжают раздаваться из кэша, как ни в чём не бывало. Сборку можно проверять до деплоя, и брак не доезжает до продакшена. Предсказуемость - тихое преимущество, которое не видно в отчётах, зато чувствуется в бюджете на инфраструктуру.
Отдельный плюс для SEO-задач: генераторы собирают не только страницы, но и sitemap с честным lastmod прямо на сборке, и робот получает файл, синхронный сайту до секунды. Мультиязычные версии печатаются из одних шаблонов, и hreflang проставляется в шаблоне один раз для всех страниц языка. Ещё один скучный, но настоящий плюс - безопасность: у статики нет исполняемого кода на запрос и нет соединений к базе на пути ответа. Для транзакционных страниц это не аргумент, а для контентных проектов - минус один класс рисков и один пункт в чек-листе аудита.
Ограничения статической генерации на большом каталоге
Первое ограничение - время сборки. Пять тысяч страниц собираются минутами, сто тысяч - десятками минут, миллион превращается в целый конвейер с очередями и шардированием. Turbopack в Next.js 16 ускорил production-сборки в 2-5 раз, но архитектурную проблему это не лечит: сборка остаётся событием, а не потоком. Пока она идёт, изменения копятся, и свежая карточка товара может ждать публикации до конца цикла.
Второе ограничение - свежесть. Остатки на складе, цены, наличие в конкретном городе меняются чаще любого цикла пересборки. Классическое решение - пересобирать каждые N минут, но на большом каталоге это оборачивается бесконечным марафоном ради нескольких изменившихся страниц.
Третье - персонализация. Статический HTML одинаков для всех, а региональные цены, авторизованное состояние и персональные подборки требуют вычислений в момент запроса. Обходной путь - подтягивать такие блоки на клиенте островами, но тогда часть контента снова уезжает в браузер со всеми минусами клиентского кода.
Четвёртое ограничение - инфраструктура сборки. Один раз собрать можно и на ноутбуке, но регулярная пересборка требует конвейера CI, кэша зависимостей и дисциплины: упавшая сборка блокирует публикации целиком, а откат неудачного релиза на статике - это инвалидация огромного кэша CDN, которую все так не любят планировать.
Сценарии где серверный рендеринг обязателен
Живой поиск по каталогу, корзины, личные кабинеты, страницы с ценами и остатками в реальном времени, свежие отзывы - территория SSR. Правило простое: если содержимое страницы зависит от того, кто и когда её открыл, статике там делать нечего. Серверный рендеринг отдаёт роботу тот же HTML, что и посетителю, с актуальными цифрами на момент запроса.
Цена подхода - время до первого байта: на каждый запрос сервер тратит вычисления. Готовые приёмы её снижают: кэширование ответов на уровне CDN с разумным временем жизни, потоковая отдача HTML, при которой браузер начинает разбор до завершения рендера, и заголовки Cache-Control с политикой stale-while-revalidate, когда устаревшая копия отдаётся сразу, а фоновый запрос её обновляет. Кэш для SSR-ответов управляется заголовками Cache-Control и s-maxage, точечная инвалидация - через теги суррогатного кэша: CDN хранит копию под маркером вроде категории или карточки, и событие обнуляет ровно связанные страницы. ETag позволяет отдать 304 вместо полного документа, когда содержимое не изменилось. Потоковая отдача делает ожидание незаметным: каркас и шапка страницы уезжают в браузер сразу, а блоки с содержимым дописываются в ответ по мере готовности через Suspense-границы. Робот в итоге получает финальный HTML целиком, а посетитель не смотрит на пустой экран.
Гибридные режимы Next.js от ISR до Cache Components
Промежуточные схемы снимают дилемму. Инкрементальная статическая регенерация ISR отдаёт страницу из кэша мгновенно и пересобирает её по расписанию:
// app/catalog/[slug]/page.tsx
export const revalidate = 3600;
Страница живёт час, потом первый визит запускает фоновое обновление. Для событийной свежести без расписания работает связка с headless CMS: вебхук о публикации вызывает пересборку только затронутых страниц или бьёт по тегу кэша, и новый текст в блоге виден через секунды после нажатия кнопки. Для робота это остаётся статикой с молниеносным ответом, для бизнеса - свежестью с контролируемой задержкой. Точечные обновления работают через теги: revalidateTag() и updateTag() из Next.js 16 инвалидируют кэш ровно тех страниц, чьи цифры изменились, например после прихода новой партии на склад.
Версия 16, вышедшая 21 октября 2025 года, добавила Cache Components: динамическое выполнение кода стало умолчанием, а кэш включается директивой "use cache" точечно, на страницу, компонент или функцию:
export async function ProductCard({ id }) {
"use cache";
const product = await getProduct(id);
return render(product);
}
Частичный пререндеринг PPR отдаёт статичную оболочку мгновенно и догружает динамические вставки через Suspense. По сути Next.js стёр границу между "статическим сайтом" и "серверным приложением": схема выбирается на уровне компонента, а не проекта. Вне React-мира тот же принцип живёт в Astro с островной архитектурой, где каркас статичен, а интерактивные островки гидратируются по отдельности.
Ошибки при выборе схемы рендеринга и их настоящая цена
Первая и самая дорогая ошибка - клиентский рендеринг для публичного контента. Фраза "сайт соберётся в браузере" красиво звучит на презентации, а на практике контент уезжает во вторую очередь рендеринга, метрики страдают от гидратации, а сторонние обходчики видят пустой каркас. Вторая - механический SSR всего подряд: сервер рендерит и лендинги, которые не менялись год, тратя вычисления впустую и усложняя инфраструктуру. Третья - пересборка всего сайта на каждую правку: комментарий в блоге не должен инвалидтировать миллион страниц.
Четвёртая ошибка - гибрид без правил. ISR без контроля свежести превращает карточки товаров в витрину вчерашних цен, а Cache Components без разбиения кэшируют то, что кэшировать нельзя, например корзину конкретного посетителя. Пятая - игнор полевых метрик: команда гордится лабораторными тестами на мощном ноутбуке, а реальные посетители со среднебюджетными смартфонами получают другой сайт. Каждая из этих ошибок лечится не сменой технологии, а картой страниц с явными правилами: что статичное, что динамическое, как часто обновляется и кто за это отвечает.
Как схема рендеринга отражается на метриках и обходе роботом
Пороги Core Web Vitals одинаковы для всех: LCP укладывается в 2.5 секунды, INP - в 200 миллисекунд с учётом того, что в марте 2024 года он заменил FID в тройке ключевых метрик, CLS - в 0.1. Путь к ним разный. У статики первый байт приходит почти мгновенно, и LCP упирается разве что в вес картинок. У SSR первый байт зависит от скорости сервера: тяжёлый запрос к базе легко съедает весь запас, поэтому медленные выборки в рендер-путь стараются не пускать. INP портит тяжёлая гидратация, и чем меньше клиентского кода, тем быстрее отклик на любом устройстве. Для времени до первого байта у Google есть собственные пороги: хорошим считается ответ быстрее 0.8 секунды, плохим - медленнее 1.8. Статика с CDN держится в этих границах без усилий, а SSR требует контроля за каждой тяжёлой выборкой.
Для обхода роботом преимущество тоже у готового HTML: нет второй очереди на рендеринг, ссылки видны в первом ответе, а поддержка If-Modified-Since с ответом 304 позволяет серверу не пересылать неизменившиеся страницы. При пиковом обходе больших каталогов статика держит напор без деградации, а SSR-инфраструктура требует запаса мощностей и продуманного кэша.
Расклад по типам страниц на реальном проекте выглядит так:
- лендинги и промо-страницы уходят в чистую статику и кэшируются на CDN настолько долго, насколько позволяет смелость;
- блог и база знаний собираются статически с пересборкой по расписанию или по событию публикации;
- категории и карточки с живыми ценами рендерятся на сервере с кэшированием по тегам остатков;
- поиск, подборки и страницы с параметрами остаются динамическими и закрываются от индексации;
- личные кабинеты и корзины в поиске не участвуют, SSR там нужен только ради скорости интерфейса.
Проверить решение проще всего через неделю после релиза: разнесите в отчётах время до первого байта по типам шаблонов и посмотрите Core Web Vitals по группам страниц. Если статические разделы и серверные различаются в разы, вы уже нашли следующую задачу.
Главный вывод не в выборе стороны, а в отказе от одного размера на весь сайт. Современный фреймворк позволяет собирать разные разделы по разным правилам, и грамотнее думать не "SSR или SSG", а картой страниц с их требованиями к свежести и персонализации. Статика закрывает всё, что меняется редко. Сервер закрывает всё, что обязано быть живым. Гибриды сглаживают границу между ними. Если у схемы не находится аргументов, кроме вкусов команды, выбирайте по времени до первого байта на целевых устройствах - эта метрика честно показывает, во что обходится ваша архитектура.