Рендеринг веб-страницы
Для чего модуль
Научиться принимать решения по рендерингу через пользовательские метрики и реальные сценарии, а не через «модные подходы».
Результат после прохождения
- Вы понимаете критический путь рендера и умеете находить блокирующие факторы.
- Вы интерпретируете LCP/INP/CLS как инженерные сигналы для действий.
- Вы выбираете SSR/CSR/SSG/ISR на уровне маршрутов с учетом SEO, latency и стоимости.
- Вы умеете диагностировать hydration mismatch и нестабильный initial render.
Термины и аббревиатуры
| Термин | Коротко |
|---|---|
LCP | Скорость главного контента |
INP | Отзывчивость |
CLS | Визуальная стабильность |
SSR | Рендер на сервере |
ISR | Инкрементальный revalidate |
Фокус по грейдам
Junior: понимать базовые механики и объяснять их простыми примерами.Middle: применять тему в продуктовых сценариях с учетом рисков и ограничений.Senior: управлять архитектурными trade-offs, метриками и эволюцией решения.
Как работать с модулем
- Используйте один целевой экран для всех уроков модуля.
- На каждом шаге фиксируйте baseline и результат изменения.
- Не внедряйте оптимизации без явной гипотезы и метрики успеха.
Программа модуля
Урок 1. Критический путь рендера
Цель: понимать, где именно браузер тратит время до первого полезного кадра.
Что происходит после navigation
- HTML parsing -> DOM.
- CSS parsing -> CSSOM.
- DOM + CSSOM -> render tree.
- Layout -> paint -> composite.
Блокирующие факторы
- Render-blocking CSS.
- Синхронные скрипты в критическом пути.
- Тяжелые web-font сценарии без fallback/strategy.
- Слишком большой initial JS bundle.
Что обычно улучшает FCP/LCP
- Уменьшение и приоритизация критических ресурсов.
- Отложенная загрузка не-критичных блоков.
- Оптимизация hero-контента (изображение/текст) для быстрого LCP.
Где ломается в проде
- Один «удобный» shared bundle грузится на все маршруты.
- Критический CSS смешан с редко используемыми стилями.
- Изображения выше fold не имеют правильных размеров/приоритета.
Мини-задача (обязательная)
Снимите waterfall одного экрана и выделите 3 ресурса, которые больше всего задерживают first meaningful render.
Что спросит интервьюер: как вы уменьшите время до first meaningful paint без переписывания всего приложения.
Критерий готовности по уроку: вы можете объяснить задержку первого рендера по шагам и предложить 2-3 реалистичные оптимизации.
Урок 2. CWV и диагностика
Цель: читать Core Web Vitals как рабочую систему принятия решений.
Метрики и смысл
- LCP — скорость загрузки главного контента.
- INP — отзывчивость взаимодействий.
- CLS — визуальная стабильность.
Lab vs Field
- Lab (Lighthouse) — контролируемый эксперимент.
- Field (RUM) — реальный пользовательский трафик.
Вывод: решения принимаются по field-поведению, а lab используется для гипотез и локальной проверки.
Приоритизация улучшений
- Найти наихудший пользовательский сценарий (например, mobile p75).
- Выделить bottleneck, который дает максимальный вклад в деградацию.
- Проверить эффект после изменения на том же сегменте.
Где ломается в проде
- Команда смотрит только Lighthouse score и игнорирует RUM.
- Оптимизируется то, что легко померить, а не то, что болит пользователю.
- Нет сегментации (устройства, регионы, сети).
Мини-задача (обязательная)
Для одного экрана зафиксируйте baseline LCP/INP/CLS, предложите 2 гипотезы улучшения и оцените expected impact.
Что спросит интервьюер: почему «в Lighthouse зеленое» не всегда означает хороший UX в проде.
Критерий готовности по уроку: вы можете обосновать план оптимизации через метрики и пользовательский сценарий, а не через общий score.
Урок 3. SSR, CSR, SSG, ISR
Цель: выбирать режим рендера как продуктовый компромисс.
Быстрый фреймворк выбора
- Нужен SEO и стабильный контент -> SSG/ISR.
- Нужна персонализация на запрос -> SSR/dynamic.
- Нужна тяжелая интерактивность после загрузки -> CSR/гибрид.
Trade-offs
- SSR: свежие данные, но выше TTFB/операционная стоимость.
- SSG: быстрая отдача, но риск устаревших данных.
- ISR: баланс, но нужна дисциплина invalidation/revalidation.
- CSR: гибко, но риск медленного first render и SEO-проблем.
Гибридная стратегия по маршрутам
Обычно лучший путь — не один режим на все приложение, а матрица стратегий на уровне конкретных страниц.
Где ломается в проде
- «Один режим для всего» из-за простоты инфраструктуры.
- Отсутствие политики обновления контента для ISR.
- Персонализированные данные пытаются кэшировать как публичные.
Мини-задача (обязательная)
Выберите стратегию рендера для 5 экранов: лендинг, блог, каталог, карточка товара, личный кабинет. Укажите риски и критерии проверки выбора.
Что спросит интервьюер: что вы поменяете первым при плохом LCP на SEO-странице.
Критерий готовности по уроку: вы можете аргументированно защитить рендер-стратегию для каждого типа страницы.
Урок 4. Hydration и клиентские границы
Цель: устранить нестабильный initial render и трудноуловимые mismatch-баги.
Почему возникает hydration mismatch
- Сервер и клиент рендерят разные значения (
Date, random, locale). - Побочные эффекты в render-phase.
- Условные ветки, зависящие от browser-only данных.
Правила устойчивого initial render
- На сервере рендерим детерминированный HTML.
- browser-only логику переносим в effect/client boundary.
- Для нестабильных фрагментов используем явные placeholders/fallback.
Client boundaries и bundle size
Чем выше по дереву стоит client boundary, тем больше кода уходит в браузер и тем выше цена hydration.
Где ломается в проде
- mismatch проявляется только на части устройств/локалей.
- ошибка проявляется «редко», потому что зависит от времени/гонок.
- фиксят
suppressHydrationWarning, не устраняя причину.
Мини-задача (обязательная)
Создайте компонент с нестабильным значением (например, дата), воспроизведите hydration mismatch и исправьте его корректно.
Что спросит интервьюер: как вы диагностируете mismatch, если он воспроизводится только в проде.
Критерий готовности по уроку: вы можете довести mismatch до воспроизведения и устранить root cause без «косметических» костылей.
Практика
- Снимите baseline CWV для одного критичного экрана.
- Внедрите 2 оптимизации и зафиксируйте after-метрики.
- Подготовьте матрицу SSR/CSR/SSG/ISR для маршрутов вашего проекта.
- Разберите один hydration mismatch кейс с runbook от симптома до фикса.
- Закрепите в Next.js вопросах и Senior Frontend.
- Сделайте baseline/after для одного экрана в Песочнице и зафиксируйте влияние изменений.
Связь с треками и вопросами
- Треки: Junior трек, Middle трек, Senior трек.
- Вопросы: Next.js, Senior Frontend.
- Повторение: 3-5 вопросов без подсказок -> сверка с модулем -> повтор через 24 часа.
Критерий готовности
Вы связываете оптимизации рендера с пользовательским эффектом и метриками, а не с абстрактной «красотой архитектуры».
Артефакты после модуля
- Таблица baseline/after по CWV.
- Документ выбора рендер-стратегий по типам экранов.
- Runbook диагностики hydration mismatch.
- Набор из 6 сильных ответов по рендерингу для интервью.