Catalog
affaan-m/nuxt4-patterns

affaan-m

nuxt4-patterns

Nuxt 4 app patterns for hydration safety, performance, route rules, lazy loading, and SSR-safe data fetching with useFetch and useAsyncData.

global
origin:ECC
New~1.1k
v1.2Saved Jul 14, 2026

Nuxt 4 Patterns

Use when building or debugging Nuxt 4 apps with SSR, hybrid rendering, route rules, or page-level data fetching.

When to Activate

  • Hydration mismatches between server HTML and client state
  • Route-level rendering decisions such as prerender, SWR, ISR, or client-only sections
  • Performance work around lazy loading, lazy hydration, or payload size
  • Page or component data fetching with useFetch, useAsyncData, or $fetch
  • Nuxt routing issues tied to route params, middleware, or SSR/client differences

Hydration Safety

  • Keep the first render deterministic. Do not put Date.now(), Math.random(), browser-only APIs, or storage reads directly into SSR-rendered template state.
  • Move browser-only logic behind onMounted(), import.meta.client, ClientOnly, or a .client.vue component when the server cannot produce the same markup.
  • Use Nuxt's useRoute() composable, not the one from vue-router.
  • Do not use route.fullPath to drive SSR-rendered markup. URL fragments are client-only, which can create hydration mismatches.
  • Treat ssr: false as an escape hatch for truly browser-only areas, not a default fix for mismatches.

Data Fetching

  • Prefer await useFetch() for SSR-safe API reads in pages and components. It forwards server-fetched data into the Nuxt payload and avoids a second fetch on hydration.
  • Use useAsyncData() when the fetcher is not a simple $fetch() call, when you need a custom key, or when you are composing multiple async sources.
  • Give useAsyncData() a stable key for cache reuse and predictable refresh behavior.
  • Keep useAsyncData() handlers side-effect free. They can run during SSR and hydration.
  • Use $fetch() for user-triggered writes or client-only actions, not top-level page data that should be hydrated from SSR.
  • Use lazy: true, useLazyFetch(), or useLazyAsyncData() for non-critical data that should not block navigation. Handle status === 'pending' in the UI.
  • Use server: false only for data that is not needed for SEO or the first paint.
  • Trim payload size with pick and prefer shallower payloads when deep reactivity is unnecessary.
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

Prefer routeRules in nuxt.config.ts for rendering and caching strategy:

export default defineNuxtConfig({
  routeRules: {
    '/': { prerender: true },
    '/products/**': { swr: 3600 },
    '/blog/**': { isr: true },
    '/admin/**': { ssr: false },
    '/api/**': { cache: { maxAge: 60 * 60 } },
  },
})
  • prerender: static HTML at build time
  • swr: serve cached content and revalidate in the background
  • isr: incremental static regeneration on supported platforms
  • ssr: false: client-rendered route
  • cache or redirect: Nitro-level response behavior

Pick route rules per route group, not globally. Marketing pages, catalogs, dashboards, and APIs usually need different strategies.

Lazy Loading and Performance

  • Nuxt already code-splits pages by route. Keep route boundaries meaningful before micro-optimizing component splits.
  • Use the Lazy prefix to dynamically import non-critical components.
  • Conditionally render lazy components with v-if so the chunk is not loaded until the UI actually needs it.
  • Use lazy hydration for below-the-fold or non-critical interactive UI.
<template>
  <LazyRecommendations v-if="showRecommendations" />
  <LazyProductGallery hydrate-on-visible />
</template>
  • For custom strategies, use defineLazyHydrationComponent() with a visibility or idle strategy.
  • Nuxt lazy hydration works on single-file components. Passing new props to a lazily hydrated component will trigger hydration immediately.
  • Use NuxtLink for internal navigation so Nuxt can prefetch route components and generated payloads.

Review Checklist

  • First SSR render and hydrated client render produce the same markup
  • Page data uses useFetch or useAsyncData, not top-level $fetch
  • Non-critical data is lazy and has explicit loading UI
  • Route rules match the page's SEO and freshness requirements
  • Heavy interactive islands are lazy-loaded or lazily hydrated
Files1
1 files · 1.0 KB

Select a file to preview

Overall Score

89/100

Grade

A

Excellent

Safety

95

Quality

88

Clarity

92

Completeness

82

Summary

This skill provides comprehensive guidance on Nuxt 4 application patterns focusing on hydration safety, SSR-safe data fetching, route rules, and performance optimization. It teaches developers how to build isomorphic Nuxt 4 apps by identifying and preventing hydration mismatches, choosing appropriate data-fetching strategies (useFetch vs useAsyncData), configuring route-level rendering rules, and implementing efficient lazy loading patterns.

Detected Capabilities

code analysis and pattern recognitionconfiguration guidance (nuxt.config.ts)composable usage instructionrendering strategy selectiondebugging hydration issues

Trigger Keywords

Phrases that MCP clients use to match this skill to user intent.

nuxt 4 hydrationssr mismatchroute rules configusefetch asyncdatalazy hydrationnuxt performanceisomorphic rendering

Use Cases

  • Debugging hydration mismatches in Nuxt 4 SSR apps
  • Configuring route-level rendering strategies (prerender, SWR, ISR, client-only)
  • Implementing SSR-safe data fetching with useFetch and useAsyncData
  • Optimizing performance through lazy loading and lazy hydration
  • Preventing first-render determinism issues caused by browser-only APIs or random data
  • Setting up route rules in nuxt.config.ts for different content types
  • Choosing between useFetch, useAsyncData, and $fetch for different use cases

Quality Notes

  • Clear, well-organized structure with specific sections for each concern (hydration, data fetching, route rules, performance)
  • Includes practical code examples showing correct usage patterns (useFetch with async/await, route rules syntax, lazy component imports)
  • Provides concrete guardrails and anti-patterns (e.g., 'do not put Date.now() directly into SSR state', 'do not use route.fullPath for SSR markup')
  • Actionable review checklist at the end helps developers verify their implementations
  • Limits scope to Nuxt 4 patterns specifically, avoiding generic Vue guidance
  • Explains the rationale behind recommendations (e.g., why useFetch avoids double-fetches, when ssr:false is appropriate)
  • Edge cases addressed: lazy component re-renders triggering hydration, payload optimization with pick, lazy vs non-lazy data fetching tradeoffs
Model: claude-haiku-4-5-20251001Analyzed: Jul 14, 2026

Reviews

Add this skill to your library to leave a review.

No reviews yet

Be the first to share your experience.

Version History

v1.2

Content updated

2026-07-14

Latest
v1.1

Content updated

2026-04-20

v1.0

No changelog

2026-04-12

Use affaan-m/nuxt4-patterns in your dev environment

Command Palette

Search for a command to run...