Рендеринг веб-страницы
Для чего модуль
Научиться принимать решения по рендерингу через пользовательские метрики и реальные сценарии, а не через «модные подходы».
Результат после прохождения
- Вы понимаете критический путь рендера и умеете находить блокирующие факторы.
- Вы интерпретируете 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.
Визуальная проверка: Browser Rendering: text update, затем layout change и transform 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 без «косметических» костылей.
Практика
1. CWV baseline и bottleneck map
Связка: Senior q-3, Next.js q-10, Next.js q-14, DOM/a11y audit pack.
Что сделать:
- Снимите baseline для одного критичного экрана: LCP, INP, CLS, TTFB, transfer size, main-thread long tasks.
- Найдите LCP element и выпишите waterfall: server work, cache, image/font, render-blocking CSS/JS, client bundle.
- Внесите 2 оптимизации и зафиксируйте before/after: что изменилось, какая метрика затронута, какой пользовательский эффект улучшился.
Артефакт: CWV baseline/after table + TTFB/LCP bottleneck map.
Критерий готовности: вы не говорите "ускорю страницу" абстрактно, а показываете конкретную метрику, причину, evidence и проверку после фикса.
2. Rendering strategy decision table
Связка: Senior q-4, Next.js q-3, Next.js q-8.
Что сделать:
- Выберите стратегию для 5 экранов: landing, blog article, catalog, product page, account/checkout.
- Заполните таблицу
route -> freshness -> SEO -> personalization/auth -> cache -> mode -> failure mode -> validation. - Для каждого route назовите, что сломается при неправильном выборе: stale content, private data leak, high TTFB, poor first content, hydration mismatch.
Артефакт: rendering strategy decision table.
Критерий готовности: вы выбираете CSR/SSR/SSG/ISR не по моде, а по данным, freshness, personalization, cacheability, SEO и hydration risk.
3. Hydration mismatch runbook
Связка: Next.js q-6, Next.js q-19, Next.js q-20.
Что сделать:
- Воспроизведите mismatch на нестабильном значении:
Date, random, locale/timezone,window/localStorageили неправильная HTML-вложенность. - Заполните diagnosis table:
source of nondeterminism -> server render -> first client render -> fix -> why not suppressHydrationWarning. - Исправьте root cause: deterministic initial render, client boundary/effect, stable placeholder или маленький no-SSR island там, где это оправдано.
Артефакт: hydration mismatch runbook from symptom to root cause.
Критерий готовности: вы отличаете hydration mismatch от обычного client update и не прячете warning косметическим suppress.
4. Main thread, lists и client boundary cost
Связка: Senior q-14, Senior q-15, Next.js q-17, Browser Rendering: layout thrashing.
Что сделать:
- Разберите экран со списком: 100, 1 000, 20 000 элементов, variable row height, keyboard navigation, SEO need.
- Заполните large-list decision matrix: pagination, infinite scroll, virtualization, server filtering/sorting, Web Worker, progressive loading.
- Проверьте client boundary cost: какие данные реально должны быть client state, что можно оставить server/rendered, где hydration расширяет bundle.
Артефакт: large-list rendering decision matrix + client boundary cost note.
Критерий готовности: вы не ставите virtualization по умолчанию, а доказываете, что bottleneck в DOM/main thread/client JS, и проверяете INP, focus behavior, scroll restoration и a11y risk.
Связь с треками и вопросами
- Performance budget и CWV: Senior q-3, Next.js q-10, Next.js q-14.
- Rendering mode: Senior q-4, Next.js q-3, Next.js q-8.
- Hydration: Next.js q-6, Next.js q-19, Next.js q-20.
- Main-thread/list cost: Senior q-14, Senior q-15, Next.js q-17.
- Практический мост: строка
HTML, CSS and rendering, Browser Rendering: layout change и DOM/a11y audit pack.
Критерий готовности
Ready: вы связываете rendering-решение с метрикой, user impact, route constraints, failure mode и проверкой в DevTools/Web Vitals.
Partial: вы знаете SSR/CSR/SSG/ISR и CWV определения, но не можете выбрать стратегию для конкретного route или доказать bottleneck.
Not ready:
вы предлагаете "добавить SSR", "добавить memo", "поставить virtualization" или suppressHydrationWarning без диагностики причины.
Артефакты после модуля
- CWV baseline/after table для одного критичного экрана.
- TTFB/LCP bottleneck map.
- Rendering strategy decision table для 5 route types.
- Hydration mismatch diagnosis table and runbook.
- Large-list rendering decision matrix.
- Client boundary cost note: что стало client-side и почему это оправдано.