Разработка фронтенда на Next.js: SSR, SSG, ISR и App Router

Медленный отклик и просадки в поисковой выдаче обычно упираются в то, как отрисованы страницы каталога. Мы разрабатываем фронтенд на Next.js под ключ: серверный рендеринг, статические страницы и обновление кэша настраиваем так, чтобы страницы отвечали быстрее, а позиции в выдаче росли. Обсудим задачу и вернёмся с планом и оценкой работ.

Разработка и обслуживание любых видов сайтов:

Информационные сайты или веб-приложения
Сайты визитки, landing page, корпоративные сайты, онлайн каталоги, квиз, промо-сайты, блоги, новостные ресурсы, информационные порталы, форумы, агрегаторы
Сайты или веб-приложения электронной коммерции
Интернет-магазины, B2B-порталы, маркетплейсы, онлайн-обменники, кэшбэк-сайты, биржи, дропшиппинг-платформы, парсеры товаров
Веб-приложения для управления бизнес-процессами
CRM-системы, ERP-системы, корпоративные порталы, системы управления производством, парсеры информации
Сайты или веб-приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, конструкторы сайтов, порталы предоставления электронных услуг, видеохостинги, тематические порталы

Это лишь некоторые из технических типов сайтов, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента

Услуги, которые мы предлагаем
Показано 1 из 1Все 2062 услуг
Разработка фронтенда на Next.js: SSR, SSG, ISR и App Router
Средний
от 1 недели до 3 месяцев
Часто задаваемые вопросы

Разработка Next.js: где узкое место и что ломается

Узкое место рендеринга почти всегда выглядит одинаково: сервер отдаёт пустой каркас, а вся логика — фильтры каталога, подстановка цен, подгрузка списков — выполняется в браузере. На среднем мобильном это секунды белого экрана, и рост отказов начинается раньше, чем метрики успевают его показать.

Медленная загрузка страниц редко объясняется одним тяжёлым файлом. Обычно это накопленный клиентский код: каждый новый блок, виджет и внешний счётчик подключается сразу ко всем страницам, потому что разделения по маршрутам нет. Пакет растёт монотонно — вместе с ним растёт время до первой отрисовки и стоимость каждого изменения.

Отдельная поломка — страницы-пустышки в выдаче поиска. Если содержимое подставляется скриптом уже после загрузки, робот индексирует заглушку: заголовок без текста, каталог без позиций, статья без абзацев. Это прямая потеря позиций в поиске по запросам, где направление раньше держалось в топе, и вернуть их дороже, чем не терять.

У всех трёх симптомов одна причина — архитектурная развилка: какой объём работы отдаётся серверу, что кэшируется и на какой срок, а что действительно обязано жить в браузере. В Next.js это режимы отрисовки и границы между серверными и клиентскими компонентами, а не выбор библиотеки. Разбираем, как это закрывается и что меняется в цифрах.

Что даёт серверный рендеринг: эффект в метриках и выдаче

Скорость первой отрисовки

Серверный рендеринг отдаёт разметку уже готовой, поэтому браузер показывает контент, не дожидаясь загрузки и выполнения скриптов. Время до первой отрисовки сокращается до одного сетевого запроса, и на медианной мобильной сети разрыв с клиентской сборкой заметен сразу.

Индексация страниц

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

Нагрузка на устройство клиента

Сервер присылает вычисленную разметку, а не данные для её сборки, поэтому слабые телефоны и бюджетные ноутбуки тратят меньше процессорного времени и заряда. На клиенте остаётся только интерактивность — формы, фильтры, переходы без перезагрузки страницы.

Устойчивость к пиковому трафику

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

Разработка Next.js: SSR, SSG, ISR и клиентский рендеринг

В App Router режим отдачи задаётся не для всего приложения, а на уровне сегмента маршрута: каталог может раздаваться статикой, личный кабинет — рендериться на сервере под каждый запрос, а новостной раздел — обновляться по расписанию. Поэтому «выбрать один режим для проекта» — вопрос поставлен неверно: решение принимается для каждого типа страниц отдельно.

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

Сводка по режимам

Режим Когда подходит Ограничения
SSG Лендинги, документация, справочные страницы: контент меняется при релизе Изменение требует пересборки, персонализация недоступна
ISR Каталог, карточки товаров, новости: контент меняется, но не посекундно До обновления может отдаваться прежняя версия, растёт объём кэша
SSR Личный кабинет, корзина, выдача поиска, страницы под авторизацией Отклик зависит от сервера и внешних источников, выше нагрузка
Клиентский рендеринг Виджеты и интерактивные панели внутри уже отрисованной страницы В этом блоке нет готового HTML для поисковых систем, данные приходят с задержкой

На практике режимы комбинируются внутри одного дерева маршрутов: страница отдаётся статикой, а её персональные блоки подгружаются отдельно.

Этапы внедрения: от аудита до передачи инженерам

Порядок этапов определяется рисками, а не удобством: сначала снимаем неопределённость по текущему коду, затем меняем маршрутизацию, и только потом трогаем нагрузку и приёмку. На каждом шаге фиксируем состояние до и после — приёмка работ опирается на измерения, а не на впечатления.

  1. Аудит фронтенда. Разбираем структуру страниц и маршрутов, источники данных и объём кода, уходящего в браузер. На выходе — карта узких мест с оценкой влияния на скорость отдачи.
  2. Схема маршрутов и данных. Раскладываем страницы по режимам: статика, сборка на сервере под запрос, обновление по расписанию или событию. Для каждого маршрута — источник данных и поведение при его недоступности.
  3. Настройка рендеринга. Переносим схему в App Router, размечаем серверные и клиентские компоненты, задаём правила обновления и точечную инвалидацию по тегам, чтобы правка одной сущности не сбрасывала весь кэш.
  4. Миграция без простоя. Новые маршруты работают параллельно старым, сверка ответов идёт на живом трафике, переключение — по мере совпадения.
  5. Проверка под нагрузкой. Замеряем время до первого байта, долю ошибок, холодный старт и поведение при отказе внешних сервисов.
  6. Приёмка работ. Сверяем метрики до и после, фиксируем чек-лист маршрутов, сценарий отката на предыдущую версию и регламент обновления контента.
  7. Передача инженерам. Архитектурная документация, схема маршрутов, доступы и регламенты — команда ведёт проект дальше сама.

Артефакты проекта: репозиторий, схемы, регламенты

Проект передаётся не архивом файлов, а рабочей системой: по ней новый инженер поднимает окружение и выпускает релиз, не разыскивая автора. Ниже — перечень артефактов, которые остаются у заказчика вместе с исходным кодом.

  • Репозиторий и структура маршрутов — дерево сегментов, вложенные макеты, границы загрузки и обработки ошибок. По нему сразу видно, какой адрес отдаётся статикой, какой рендерится на сервере, а какой живёт на клиенте.
  • Конфигурация маршрутов — переадресации, переписывание адресов, заголовки ответа и правила доступа собраны в одном месте, а не разбросаны по обработчикам.
  • Схема потоков данных — откуда приходят данные, где серверный слой, где клиентский, какие запросы кэшируются, а какие идут напрямую к источнику.
  • Политики кэширования — для каждого маршрута зафиксированы режим отдачи, срок жизни записи и условие её сброса по событию, а не по таймеру. Это то, что чаще всего ломается при доработках без документации.
  • Регламент релизов и выката — порядок сборки, обязательные проверки, схема веток, порядок выкладки на тестовое окружение и откат на предыдущий выпуск.
  • Инструкции по сопровождению фронтенда — обновление зависимостей, поведение при расхождении данных и кэша, точки контроля при падении сборки.
  • Документация проекта — схема окружений, переменные, порядок доступов, журнал известных ограничений и передача с разбором для команды заказчика.

Кейс: каталог на миллион страниц стал отвечать заметно быстрее

Каталог на миллионе товарных страниц рендерился на сервере на каждый запрос: время ответа на пике доходило до 1,9 с, поисковые роботы обходили разделы медленно, в индексе держалось меньше половины карточек. В дни распродаж, когда трафик вырастал в шесть раз, сервис начинал отдавать ошибки, и часть аудитории уходила к конкурентам.

Мы развели контент по режимам: категории и ходовые карточки отдаём статикой, остальное — по обращению с фоновым обновлением по правилам перепроверки, а персональные блоки (наличие в регионе, цену с картой лояльности) унесли в клиентские компоненты. Витрину пересобрали на серверных компонентах Next.js и потоковой отдаче, а серверную часть каталога закрыли кэшем с точечным сбросом по уведомлению об изменении товара: вместо полной пересборки на 40 минут обновляются только затронутые страницы.

Что изменилось по метрикам: время ответа сервера на 95-м процентиле — с 1,9 до 0,3 с, доля страниц в поисковом индексе — с 43 до 91%, органический трафик вырос примерно в 2,3 раза за квартал. Шестикратный пик распродажи сервис проходит без ошибок и деградации, а массовая правка цен перестала требовать полной пересборки каталога.

Отзыв технического директора заказчика: «Каталог перестал быть узким местом — распродажи и обновление цен больше не требуют ручного вмешательства дежурной команды».

Чем отличается серверный рендеринг от статической генерации?

В основе — момент, когда формируется HTML. Статическая генерация готовит страницы один раз, на сборке: каждый запрос отдаёт уже собранный файл из кеша на ближайшем к пользователю узле. Серверный рендеринг собирает разметку в момент запроса — под конкретного пользователя и с актуальными данными.

Разницу удобно смотреть по трём осям: актуальность данных на странице, поведение под нагрузкой и требования к инфраструктуре. В Next.js это не жёсткий выбор из двух вариантов: инкрементальное обновление отдаёт страницу из кеша, а перегенерацию запускает фоном по интервалу или по требованию, когда контент изменился.

Режим отдачи Когда подходит Ограничения
Статическая генерация Каталог, лендинги, документация — данные меняются редко Правка контента требует пересборки; персонализация недоступна
Рендеринг по запросу Личные кабинеты, остатки и цены под конкретного пользователя Каждый запрос занимает ресурс приложения; пики требуют запаса мощностей
Инкрементальное обновление Контентные страницы с частыми правками Нужно управлять кешем и временем жизни: остаётся окно устаревания

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

Поэтому на практике режимы разводят по маршрутам, а не выбирают один на весь проект: статика — для публичных разделов, рендеринг по запросу — для персонализированных, инкрементальное обновление — для каталогов с регулярными правками.

Сомнения по App Router, кэшу и маршрутизации

Сомнения перед стартом обычно технические, и снимаются они на проектировании, а не в бою. Ниже — вопросы, которые чаще всего звучат, когда команда уже выбрала Next.js и обсуждает переход на App Router.

Можно ли переходить частями, не переписывая сайт целиком?

Да. Новые разделы поднимаем на App Router, старые маршруты продолжают работать и переносятся зонами, по одной. Слой данных, стилей и разметки остаётся единым, поэтому посетитель не видит швов, а релизы не встают на время перехода.

Не начнёт ли кэш отдавать старые цены и остатки?

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

У нас свой сервер и своя выкладка — придётся всё перестраивать?

Как правило нет. Приложение уезжает в контейнере за ваш прокси, домен, сертификаты и балансировка остаются на месте, меняются только шаги сборки. Планы на статическую выдачу обсуждаем до старта — от этого зависит набор доступных режимов рендеринга.

Внешние сервисы отвечают медленно — сайт будет ждать?

Нет. Ответы внешних систем забираем на своей стороне, с ограничением времени ожидания и запасным значением: посетитель получает готовую страницу, а не ожидание чужого серверa. Если сервис недоступен, показываем корректный вариант и фиксируем сбой для разбора.

Обсудим задачу: вернёмся с планом и оценкой работ

Начать можно с обсуждения задачи — подробное техническое задание на входе не требуется. Достаточно описать продукт и то, как он должен работать: какие страницы и разделы нужны, откуда приходят данные, нужна ли раздача через серверный рендеринг или хватает статической генерации с фоновым обновлением.

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

На выходе вы получаете:

  • карту маршрутов App Router: какие страницы рендерятся на сервере, какие собираются статически;
  • схему источников данных и правила обновления кэша;
  • план работ по этапам с порядком и зависимостями;
  • оценку трудоёмкости и сроков по каждому этапу;
  • состав команды и точки, где нужно ваше решение;
  • перечень рисков и порядок отката к предыдущему состоянию.

Это рабочий документ, по которому видно, с чего начнётся старт проекта и что вы получите на каждом шаге. Опишите задачу в удобном виде — вернёмся с планом работ и оценкой проекта, а детали при необходимости уточним на созвоне с инженерами.

Наши компетенции:

Последние работы

  • Разработка сайта компании B2B ADVANCE
    Разработка сайта компании B2B ADVANCE
    1542
  • Разработка веб-приложения для компании FEEDME
    Разработка веб-приложения для компании FEEDME
    1394
  • Разработка веб-сайта для компании БЕЛФИНГРУПП
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    1081
  • Разработка интернет магазина для компании FURNORO
    Разработка интернет магазина для компании FURNORO
    1369
  • Разработка веб-приложения для компании Enviok
    Разработка веб-приложения для компании Enviok
    1141
  • Разработка веб-сайта для компании ФИКСПЕР
    Разработка веб-сайта для компании ФИКСПЕР
    1060