From ecc
hydration 안전성, 성능, route rules, lazy loading, `useFetch`와 `useAsyncData`를 활용한 SSR 안전 데이터 패칭을 다루는 Nuxt 4 앱 패턴입니다.
npx claudepluginhub sam42-lab/everything-claude-code-krThis skill uses the workspace's default tool permissions.
SSR, 하이브리드 렌더링, route rules, 페이지 단위 데이터 패칭이 포함된 Nuxt 4 앱을 만들거나 디버깅할 때 사용합니다.
Mandates invoking relevant skills via tools before any response in coding sessions. Covers access, priorities, and adaptations for Claude Code, Copilot CLI, Gemini CLI.
Share bugs, ideas, or general feedback.
SSR, 하이브리드 렌더링, route rules, 페이지 단위 데이터 패칭이 포함된 Nuxt 4 앱을 만들거나 디버깅할 때 사용합니다.
useFetch, useAsyncData, $fetch로 페이지/컴포넌트 데이터를 가져올 때Date.now(), Math.random(), 브라우저 전용 API, 저장소 읽기를 SSR 템플릿 상태에 직접 넣지 않습니다.onMounted(), import.meta.client, ClientOnly, .client.vue 뒤로 옮깁니다.vue-router의 것이 아니라 Nuxt의 useRoute() composable을 사용합니다.route.fullPath로 SSR 렌더링 마크업을 결정하지 않습니다. URL fragment는 클라이언트 전용이라 hydration mismatch를 만들 수 있습니다.ssr: false는 진짜 브라우저 전용 영역에만 쓰는 탈출구입니다. mismatch의 기본 해결책처럼 쓰지 않습니다.await useFetch()를 우선합니다. 서버에서 가져온 데이터를 Nuxt payload로 전달해 hydration 시 2차 fetch를 피합니다.$fetch()가 아니거나, 커스텀 키가 필요하거나, 여러 비동기 소스를 조합할 때는 useAsyncData()를 사용합니다.useAsyncData()에는 캐시 재사용과 예측 가능한 갱신을 위해 안정적인 키를 부여합니다.useAsyncData() 핸들러는 부수효과 없이 유지합니다. SSR과 hydration 중 모두 실행될 수 있습니다.$fetch()를 사용하고, SSR에서 수화돼야 하는 상단 페이지 데이터에는 쓰지 않습니다.lazy: true, useLazyFetch(), useLazyAsyncData()를 사용하고 UI에서 status === 'pending'를 처리합니다.server: false를 사용합니다.pick으로 payload를 줄이고, 깊은 반응성이 불필요하면 얕은 payload를 선호합니다.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,
})
렌더링과 캐싱 전략은 nuxt.config.ts의 routeRules를 우선합니다.
export default defineNuxtConfig({
routeRules: {
'/': { prerender: true },
'/products/**': { swr: 3600 },
'/blog/**': { isr: true },
'/admin/**': { ssr: false },
'/api/**': { cache: { maxAge: 60 * 60 } },
},
})
prerender: 빌드 시 정적 HTML 생성swr: 캐시된 콘텐츠를 제공하고 백그라운드에서 재검증isr: 지원 플랫폼에서 incremental static regenerationssr: false: 클라이언트 렌더링 라우트cache / redirect: Nitro 레벨 응답 동작route group별로 규칙을 고릅니다. 마케팅 페이지, 카탈로그, 대시보드, API는 대개 서로 다른 전략이 필요합니다.
Lazy 접두사로 동적 import합니다.v-if로 조건부 렌더링합니다.<template>
<LazyRecommendations v-if="showRecommendations" />
<LazyProductGallery hydrate-on-visible />
</template>
defineLazyHydrationComponent()와 visibility/idle 전략을 사용합니다.NuxtLink를 사용해 Nuxt가 라우트 컴포넌트와 생성된 payload를 prefetch할 수 있게 합니다.$fetch가 아니라 useFetch 또는 useAsyncData를 사용한다