프리렌더링
Nuxt는 애플리케이션의 선택된 페이지를 빌드 시 렌더링할 수 있도록 지원합니다. Nuxt는 요청 시마다 페이지를 동적으로 생성하는 대신, 미리 빌드된 페이지를 제공합니다.
크롤 기반 프리렌더링
nuxt generate 명령어를 사용하여 Nitro 크롤러로 애플리케이션을 빌드하고 프리렌더링할 수 있습니다. 이 명령어는 nitro.static 옵션이 true로 설정된 nuxt build와 유사하며, 또는 nuxt build --prerender를 실행하는 것과 같습니다.
이 명령어는 사이트를 빌드하고, nuxt 인스턴스를 실행한 뒤, 기본적으로 루트 페이지 /와 사이트에서 해당 페이지로 연결된 모든 페이지, 그리고 그 페이지에서 또 연결된 모든 페이지를 프리렌더링합니다.
npx nuxt generate
yarn nuxt generate
pnpm nuxt generate
bun x nuxt generate
이제 .output/public 디렉터리를 어떤 정적 호스팅 서비스에도 배포할 수 있으며, npx serve .output/public으로 로컬에서 미리보기할 수 있습니다.
Nitro 크롤러의 동작 방식:
- 애플리케이션의 루트 경로(
/),~/pages디렉터리 내의 비동적 페이지, 그리고nitro.prerender.routes배열에 있는 기타 경로의 HTML을 로드합니다. - HTML과
payload.json을~/.output/public/디렉터리에 저장하여 정적으로 서비스할 수 있도록 합니다. - HTML 내의 모든 앵커 태그(
<a href="...">)를 찾아 다른 경로로 이동합니다. - 더 이상 크롤링할 앵커 태그가 없을 때까지 1~3단계를 각 앵커 태그에 대해 반복합니다.
이는 연결된 페이지가 아닌, 발견 가능한 페이지에 연결되어 있지 않은 페이지는 자동으로 프리렌더링할 수 없으므로 중요합니다.
선택적 프리렌더링
빌드 중 Nitro가 가져와서 프리렌더링할 경로를 수동으로 지정하거나, 프리렌더링하지 않을 경로(/dynamic 등)를 nuxt.config 파일에서 무시할 수 있습니다:
export default defineNuxtConfig({
nitro: {
prerender: {
routes: ["/user/1", "/user/2"],
ignore: ["/dynamic"],
},
},
});
크롤러가 발견할 수 없는 /sitemap.xml이나 /robots.txt와 같은 경로를 프리렌더링하려면 crawlLinks 옵션과 결합할 수 있습니다:
export default defineNuxtConfig({
nitro: {
prerender: {
crawlLinks: true,
routes: ["/sitemap.xml", "/robots.txt"],
},
},
});
nitro.prerender를 true로 설정하는 것은 nitro.prerender.crawlLinks를 true로 설정하는 것과 유사합니다.
마지막으로, routeRules를 사용하여 수동으로 구성할 수도 있습니다.
export default defineNuxtConfig({
routeRules: {
// prerender를 true로 설정하여 프리렌더링되도록 구성
"/rss.xml": { prerender: true },
// false로 설정하여 프리렌더링에서 제외
"/this-DOES-NOT-get-prerendered": { prerender: false },
// /blog 하위의 모든 경로는
// 다른 페이지에서 연결되어 있다면 프리렌더링됨
"/blog/**": { prerender: true },
},
});
간단하게, defineRouteRules를 사용하여 페이지 파일에서 직접 구성할 수도 있습니다.
<script setup>
// 또는 페이지 레벨에서 설정
defineRouteRules({
prerender: true,
});
</script>
<template>
<div>
<h1>홈페이지</h1>
<p>빌드 시 프리렌더링됨</p>
</div>
</template>
이것은 다음과 같이 변환됩니다:
export default defineNuxtConfig({
routeRules: {
"/": { prerender: true },
},
});
런타임 프리렌더 구성
prerenderRoutes
Nuxt 컨텍스트 내에서 런타임에 Nitro가 프리렌더링할 추가 경로를 등록할 수 있습니다.
<script setup>
prerenderRoutes(["/some/other/url"]);
prerenderRoutes("/api/content/article/my-article");
</script>
<template>
<div>
<h1>프리렌더링 시 다른 경로도 등록됩니다</h1>
</div>
</template>
prerender:routes Nuxt 훅
프리렌더링 전에 추가 경로를 등록하기 위해 호출됩니다.
export default defineNuxtConfig({
hooks: {
async "prerender:routes"(ctx) {
const { pages } = await fetch("https://api.some-cms.com/pages").then(
(res) => res.json(),
);
for (const page of pages) {
ctx.routes.add(`/${page.name}`);
}
},
},
});
prerender:generate Nitro 훅
프리렌더링 중 각 경로에 대해 호출됩니다. 프리렌더링되는 각 경로를 세밀하게 제어할 때 사용할 수 있습니다.
export default defineNuxtConfig({
nitro: {
hooks: {
"prerender:generate"(route) {
if (route.route?.includes("private")) {
route.skip = true;
}
},
},
},
});