[Lv2] Реализация SSR: Загрузка данных и управление SEO-метаданными
Практический паттерн SSR-реализации в Nuxt для динамических страниц: получать данные на сервере, рендерить полный HTML и генерировать route-specific метаданные.
1. Фокус на интервью
- Стратегия server-first загрузки данных
- Динамические метаданные из загруженного контента
- Дедупликация и кэширование для производительности
2. Паттерны загрузки данных в SSR
useFetch для прямой работы с API
const route = useRoute();
const { data: product, error } = await useFetch(`/api/products/${route.params.id}`, {
key: `product-${route.params.id}`,
server: true,
lazy: false,
});
useAsyncData для кастомной логики
const { data } = await useAsyncData(`article-${route.params.slug}`, async () => {
const article = await $fetch(`/api/articles/${route.params.slug}`);
return normalizeArticle(article);
});
3. Генерация dynamic head
Генерируйте метаданные из контента, полученного в SSR:
useHead(() => ({
title: product.value?.name || 'Product',
meta: [
{ name: 'description', content: product.value?.summary || '' },
{ property: 'og:title', content: product.value?.name || '' },
{ property: 'og:description', content: product.value?.summary || '' },
{ property: 'og:image', content: product.value?.image || '' },
],
link: [{ rel: 'canonical', href: `https://example.com/products/${route.params.id}` }],
}));
4. Обработка ошибок и status codes
Для SEO-критичных страниц возвращайте корректные коды ответа.
if (!product.value) {
throw createError({ statusCode: 404, statusMessage: 'Product Not Found' });
}
5. Контроль производительности
- Дедуплицируйте одинаковые request keys
- Где возможно, кэшируйте стабильные ответы
- Не блокируйте SSR некритичными API-запросами
- Переносите пользовательские низкоприоритетные данные в клиентскую загрузку
6. Продакшен-чеклист
- SSR HTML содержит осмысленный контент до hydration
- Title и description специфичны для маршрута
- Canonical URL совпадает с публичным URL
- Страницы 404/410 возвращают реальные status codes
- Рендер остается стаби льным при медленном API
Краткое резюме для интервью
Я загружаю SEO-критичный контент во время SSR, формирую из него метаданные и обеспечиваю корректные status codes. Затем оптимизирую через дедупликацию запросов и выборочное кэширование, чтобы сбалансировать качество и скорость.