Как работает SSR в Nuxt?
Вопрос
Как работает серверный рендеринг (SSR) в Nuxt?
Короткий ответ
При SSR сервер выполняет Vue-приложение и генерирует готовый HTML на каждый запрос. Браузер сразу получает отрисованную страницу, а затем Vue "гидратирует" её на клиенте, делая интерактивной.
Подробный ответ
Режим Nuxt по умолчанию — universal rendering: один и тот же код компонентов выполняется и на сервере (для первого рендера), и на клиенте (для последующей интерактивности и переходов между страницами).
Этапы запроса страницы:
- Сервер выполняет компоненты, включая
useAsyncData/useFetch, и строит HTML. - Данные, загруженные на сервере, сериализуются в
payloadи встраиваются в HTML. - Браузер получает готовый HTML — пользователь видит контент мгновенно, до загрузки JS.
- Vue на клиенте "гидратируется": переиспользует уже отрисованный DOM и payload вместо повторных запросов, навешивает обработчики событий.
Преимущества SSR: быстрый First Contentful Paint, корректная работа SEO/соцсетей (краулеры видят готовый HTML), лучше на медленных устройствах — тяжёлая работа сделана на сервере.
Минусы: нагрузка на сервер, необходимость писать код, работающий и в Node.js, и в браузере (нет прямого доступа к window/document на сервере).
Пример
<script setup>
// Выполнится на сервере при первой загрузке,
// на клиенте при client-side навигации данные уже в payload — повторный запрос не нужен
const { data: post } = await useFetch(`/api/posts/${route.params.id}`)
</script>
Дополнительные вопросы
- Что такое гидратация и что если серверный и клиентский HTML не совпадают (hydration mismatch)?
- Чем
useFetchотличается от обычногоfetchв контексте SSR? - Как безопасно обратиться к
windowв компоненте, который рендерится на сервере?