[Lv3] Проблемы реализации SSR и решения
Реальные SSR-проекты обычно ломаются на границах: консистентность hydration, различия окружений, совместимость со сторонними библиотеками и производительность под нагрузкой.
Сценарий интервью
Q: С какими SSR-проблемами вы сталкивались и как их решали?
Сильный ответ должен охватывать реальные failure mode'ы, root cause'ы и измеримые исправления.
1. Проблема: Hydration Mismatch
Симптомы
- Предупреждения hydration в Vue/React
- Ломаются click handler'ы после первичного рендера
- Неожиданный UI flicker при mount
Root causes
- Недетерминированный серверный output (
Date.now(), случайные значения) - Выполнение browser-only API во время SSR
- Разная условная логика на сервере/клиенте
Решения
- Делать первый рендер детерминированным
- Защищать browser API client-only хуками
- При необходимости оборачивать browser-only фрагменты в
ClientOnly
2. Проблема: разрывы между серверным и клиентским окружением
Типичные проблемы
- Доступ к
window,document,localStorageна сервере - Предположение о совпадении timezone/locale
- Некорректное чтение runtime config
Решения
- Использовать environment guards (
process.server,process.client) - Стандартизировать рендеринг, чувствительный к timezone
- Разделять приватный server runtime config и публичный client config
3. Проблема: несовместимость сторонних библиотек
Типичные проблемы
- Библиотеки, которым нужен DOM на этапе import
- Трекинг-скрипты, мутирующие DOM во время hydration
Решения
- Dynamic import в client-only контексте
- Ин капсулировать интеграции в выделенные клиентские компоненты
- Откладывать некритичное выполнение сторонних скриптов
4. Проблема: SSR-производительность и TTFB
Типичные bottleneck'и
- Последовательные API waterfall
- Отсутствие стратегии кэширования для дорогих endpoint'ов
- Слишком большой payload, отправляемый клиенту
Решения
- Параллелить независимые запросы
- Вводить серверный кэш с коротким TTL
- Не отправлять лишнее состояние в payload
- По возможности стримить или откладывать некритичные секции
5. Проблема: кэширование и инвалидация
Риски
- Устаревшие SEO-метаданные
- Утечка пользовательского контента через общий кэш
Решения
- Кэшировать только безопасные публичные ответы
- Включать в cache keys locale и route params
- Определять четкие события инвалидации и TTL-политику