🧩 Что это
Навык Nuxt 4 Architecture Patterns — это набор проверенных практик и рекомендаций для разработки на Nuxt 4. Он помогает избежать типичных ошибок при серверном рендеринге (SSR), гибридном рендеринге, оптимизации производительности и организации получения данных. Навык ориентирован на разработчиков, которые уже знакомы с основами Nuxt и хотят глубже разобраться в тонкостях гидратации, маршрутизации, ленивой загрузки и кэширования.
⚙️ Как работает
🛡️ Безопасность гидратации (Hydration Safety)
Гидратация — это процесс, при котором Vue «оживляет» статический HTML, сгенерированный на сервере, добавляя интерактивность на клиенте. Если разметка сервера и клиента не совпадает, возникает ошибка гидратации. Чтобы её избежать:
- Не используйте в шаблонах SSR значения, которые могут отличаться на сервере и клиенте:
Date.now(), Math.random(), чтение localStorage, вызов browser-only API. Всё это должно быть вынесено в onMounted() или обёрнуто в ClientOnly / .client.vue компонент.
- Используйте
useRoute() из Nuxt, а не из vue-router. Не полагайтесь на route.fullPath в SSR-разметке — фрагменты URL (#hash) доступны только на клиенте.
- Опция
ssr: false — это крайнее средство для truly browser-only зон, а не универсальное решение проблем гидратации.
📦 Получение данных (Data Fetching)
Для загрузки данных на страницах и в компонентах используйте встроенные композаблы:
useFetch() — предпочтительный способ для простых API-запросов. Данные, полученные на сервере, автоматически передаются в payload и не запрашиваются повторно при гидратации.
useAsyncData() — когда нужен кастомный ключ, композиция нескольких источников или нестандартный fetcher (например, вызов GraphQL). Всегда задавайте стабильный ключ для кэширования и предсказуемого обновления.
$fetch() — используйте только для действий по инициативе пользователя (запись, отправка формы) или клиентских вызовов, не для данных, которые должны гидратироваться из SSR.
- Ленивая загрузка:
lazy: true, useLazyFetch(), useLazyAsyncData() — для некритичных данных, которые не должны блокировать навигацию. Обязательно обрабатывайте состояние status === 'pending' в UI.
server: false — только для данных, не нужных для SEO или первого отображения.
- Уменьшайте размер payload с помощью
pick и предпочитайте плоские структуры, если глубокая реактивность не требуется.
Пример типичного паттерна:
const route = useRoute()
const { data: article, status, error, refresh } = await useAsyncData(
`article:${route.params.slug}`,
() => $fetch(`/api/articles/${route.params.slug}`)
)
const { data: comments } = await useFetch(
`/api/articles/${route.params.slug}/comments`,
{ lazy: true, server: false }
)
🗺️ Правила маршрутов (Route Rules)
Вместо глобальных настроек рендеринга используйте routeRules в nuxt.config.ts. Это позволяет задать стратегию для каждой группы маршрутов:
export default defineNuxtConfig({
routeRules: {
'/': { prerender: true },
'/products/**': { swr: 3600 },
'/blog/**': { isr: true },
'/admin/**': { ssr: false },
'/api/**': { cache: { maxAge: 60 * 60 } }
}
})
prerender — статический HTML на этапе сборки.
swr — кэшированный контент с фоновой ревалидацией.
isr — инкрементальная статическая регенерация (на поддерживаемых платформах).
ssr: false — клиентский рендеринг для данного маршрута.
cache / redirect — низкоуровневые ответы Nitro.
Подбирайте правила под тип страницы: маркетинговые, каталоги, дашборды, API — у каждого свои требования к свежести и SEO.
🚀 Ленивая загрузка и производительность
Nuxt 4 автоматически делает код-сплит по страницам. Прежде чем оптимизировать компоненты, убедитесь, что границы маршрутов осмысленны.
- Префикс
Lazy — динамический импорт некритичных компонентов. Используйте v-if, чтобы чанк загружался только когда UI действительно нужен.
- Ленивая гидратация — для компонентов «ниже сгиба» или неинтерактивных:
hydrate-on-visible, hydrate-on-idle.
defineLazyHydrationComponent() — для кастомных стратегий (видимость, бездействие).
NuxtLink — для внутренней навигации: Nuxt автоматически предзагружает компоненты маршрута и payload.
Пример:
`template`
<LazyRecommendations v-if="showRecommendations" />
<LazyProductGallery hydrate-on-visible />
✅ Когда использовать
Этот навык пригодится в следующих ситуациях:
- Гидратационные ошибки — несоответствие HTML сервера и клиента (mismatch).
- Настройка рендеринга — нужно решить, какие страницы prerender, SWR, ISR или полностью клиентские.
- Оптимизация производительности — ленивая загрузка, ленивая гидратация, уменьшение размера payload.
- Получение данных — выбор между
useFetch, useAsyncData, $fetch, настройка кэширования и обработка состояний загрузки.
- Проблемы с маршрутизацией — параметры маршрута, middleware, различия SSR/клиент.
💡 Важно знать
ssr: false — не панацея. Используйте его только для truly browser-only зон, иначе вы теряете преимущества SSR (SEO, скорость первого отображения).
- Стабильные ключи для
useAsyncData — обязательны для предсказуемого кэширования и обновления. Используйте шаблонные строки с параметрами маршрута.
- Nuxt уже код-сплитит страницы — не создавайте микро-оптимизации до того, как убедитесь, что границы маршрутов оптимальны.
- Ленивая гидратация срабатывает при передаче новых пропсов — учитывайте это при проектировании компонентов.
- Правила маршрутов применяются к группам, а не глобально — это даёт гибкость и предсказуемость.
Комментарии
Комментариев пока нет. Будьте первым.