Какие режимы рендеринга существуют в Nuxt 3: SSR, SSG, SPA, ISR и гибридный режим?
Nuxt 3 поддерживает SSR (рендеринг на каждый запрос), SSG (генерация при сборке), SPA (только клиент), ISR (кэш с обновлением по таймеру) и гибридный режим через routeRules — разные стратегии для разных маршрутов одного приложения.
Обзор режимов рендеринга в Nuxt 3
Nuxt 3 поддерживает несколько стратегий рендеринга, которые можно применять как глобально, так и для отдельных маршрутов через routeRules. Это позволяет строить гибридные приложения, где одни страницы статичны, другие серверно рендерятся, а третьи обновляются по расписанию.
SSR — Server-Side Rendering
Каждый запрос обрабатывается сервером: Nitro выполняет Vue-компоненты, генерирует HTML и отдаёт его браузеру. Браузер получает готовый HTML (хорошо для SEO и TTFB), затем Vue «гидратирует» страницу для интерактивности.
// nuxt.config.ts — SSR включён по умолчанию
export default defineNuxtConfig({
ssr: true, // можно не указывать, это дефолт
})
Когда использовать: динамические страницы с персонализацией, данными реального времени, аутентификацией.
SSG — Static Site Generation
При сборке Nuxt обходит все маршруты, выполняет SSR для каждого и сохраняет результат как статические HTML-файлы. Итоговый сайт можно хостить на любом CDN без сервера.
# Генерация статики
npx nuxi generate
# Артефакты в .output/public/
// nuxt.config.ts
export default defineNuxtConfig({
nitro: {
prerender: {
routes: ['/sitemap.xml', '/robots.txt'],
crawlLinks: true, // обходить все ссылки на страницах
},
},
})
Когда использовать: маркетинговые сайты, блоги, документация — контент меняется редко.
SPA — Single-Page Application
Сервер отдаёт пустой HTML-шаблон, весь рендеринг происходит в браузере через JavaScript. SEO-преимущества SSR отсутствуют.
// nuxt.config.ts
export default defineNuxtConfig({
ssr: false, // отключает SSR, включает SPA-режим
})
Когда использовать: внутренние инструменты, дашборды за авторизацией, где SEO не нужен.
ISR — Incremental Static Regeneration
Страница генерируется статически при первом запросе (или при сборке) и кэшируется. Через заданный интервал кэш инвалидируется и страница перегенерируется на следующий запрос. Это гибрид SSG (скорость) и SSR (актуальность данных).
// nuxt.config.ts — ISR через routeRules
export default defineNuxtConfig({
routeRules: {
'/blog/**': {
isr: 60 * 60, // перегенерировать раз в час (в секундах)
},
'/news': {
isr: true, // перегенерировать при каждом запросе после инвалидации
},
},
})
Когда использовать: блог, каталог товаров — контент меняется редко, но нужна актуальность.
Гибридный режим с routeRules
Это главное преимущество Nuxt 3 — разные маршруты одного приложения могут использовать разные стратегии рендеринга.
// nuxt.config.ts
export default defineNuxtConfig({
routeRules: {
// Главная — ISR, обновляется раз в 10 минут
'/': { isr: 600 },
// Блог — статические страницы, пресгенерируются
'/blog/**': { prerender: true },
// API — не кэшируется, всегда свежее
'/api/**': { cache: false },
// Дашборд — только клиент (SPA), нет SSR
'/dashboard/**': { ssr: false },
// Документация — кэш на CDN на 1 час
'/docs/**': { cache: { maxAge: 3600 } },
// Редирект
'/old-page': { redirect: '/new-page' },
},
})
Сравнительная таблица
- SSR: SEO хорошо, TTFB средний, требует сервер, данные всегда свежие.
- SSG: SEO отлично, TTFB отличный, не требует сервер, данные при сборке.
- SPA: SEO плохо, TTFB плохой, не требует сервер, данные в браузере.
- ISR: SEO отлично, TTFB отличный, требует сервер, данные периодически обновляются.
Подводные камни
- ISR не поддерживается на всех платформах — ISR работает только там, где Nitro может кэшировать ответы на сервере; Cloudflare Pages в базовом варианте не поддерживает ISR.
- SSG и динамические данные — при
nuxi generateданные «замораживаются» на момент сборки; для динамического контента нужны ISR или клиентский data fetching после гидратации. - routeRules.ssr: false не то же самое что глобальный SPA — при глобальном
ssr: falseсерверные API-маршруты всё равно работают; отдельныйrouteRulesотключает SSR только для рендеринга страниц. - Кэш ISR не инвалидируется по событию — по умолчанию ISR кэш живёт по времени; для инвалидации по событию (изменение данных в CMS) нужны вебхуки и ручной вызов
event.waitUntilили purge API CDN. - Смешанные стратегии усложняют деплой — гибридный режим с SSR + prerender требует запущенного сервера; деплой на чисто статический хостинг (GitHub Pages) невозможен.
- useFetch и prerender — при пресгенерации Nuxt выполняет fetch-запросы; если внешний API недоступен во время сборки, страница не сгенерируется и сборка упадёт.
Common mistakes
- Путать Nuxt rendering modes с похожим API из соседнего фреймворка.
- Не объяснять, где код выполняется: сервер, клиент, build step или runtime.
- Игнорировать влияние на hydration, cache, bundle size или безопасность.
What the interviewer is testing
- Точно объясняет назначение механизма «Nuxt rendering modes».
- Показывает корректный минимальный пример без выдуманных API.
- Называет ограничения, failure modes и production-компромиссы.