동적 라우트를 사용하는 페이지에서 getStaticProps
를 사용하는 경우, 해당 페이지에서 정적으로 생성할 경로 목록을 정의해야 합니다.
동적 라우트를 사용하면서 getStaticProps
에서 getStaticPaths
(정적 사이트 생성)라는 함수를 내보낸 경우, Next.js는 getStaticPaths
에서 지정한 모든 경로를 정적으로 사전 렌더링합니다.
// pages/posts/[id].js
// `/posts/1`과 `/posts/2`를 생성합니다.
export async function getStaticPaths() {
return {
paths: [{ params: { id: '1' } }, { params: { id: '2' } }],
fallback: false, // true나 'blocking'으로 설정할 수도 있습니다.
};
}
// `getStaticPaths`는 `getStaticProps`를 사용해야 합니다.
export async function getStaticProps(context) {
return {
// 페이지 컴포넌트에 전달되는 props입니다.
props: { post: {} },
};
}
export default function Post({ post }) {
// 포스트를 렌더링합니다.
}
getStaticPaths
API 레퍼런스에서는 getStaticPaths
와 함께 사용할 수 있는 모든 매개변수와 props
를 다룹니다.
getStaticPaths
는 동적 라우트를 사용하는 정적 사전 렌더링 페이지를 생성할 때 다음과 같은 경우에 사용해야 합니다:
getStaticPaths
는 프로덕션에서 빌드 중에만 실행되며 런타임 중에는 호출되지 않습니다. getStaticPaths
에 작성된 코드가 클라이언트 측 번들에서 제거되는지 확인할 수 있는 도구도 있습니다.
getStaticProps
는 빌드 중 반환된 모든 경로에 대해 실행됩니다.fallback: true
를 사용할 경우 getStaticProps
는 백그라운드에서 실행됩니다.fallback: blocking
을 사용할 경우 getStaticProps
는 초기 렌더링 전에 호출됩니다.getStaticPaths
는 getStaticProps
와 함께 사용해야 합니다.getStaticPaths
를 함께 사용할 수 없습니다.getStaticProps
를 사용하는 동적 라우트에서 getStaticPaths
를 내보낼 수 있습니다.getStaticPaths
를 페이지 파일이 아닌 다른 파일(예: 컴포넌트 폴더)에서 내보낼 수 없습니다.getStaticPaths
를 페이지 컴포넌트의 속성으로 내보낼 수 없으며, 독립적인 함수로 내보내야 합니다.개발 모드에서(next dev
), getStaticPaths
는 매 요청마다 호출됩니다.
getStaticPaths
는 on-demand
로 페이지를 생성하는 대신 빌드 중 생성되는 페이지를 제어할 수 있도록 해줍니다. 더 많은 페이지를 빌드하는 것은 더 느린 빌드를 유발합니다.
빈 배열을 반환하여 on-demand
로 모든 페이지 생성을 지연할 수 있습니다. 이 기능은 Next.js
애플리케이션을 여러 환경에 배포할 때 특히 유용합니다.
예를 들어, 미리보기 환경에서는 모든 페이지를 on-demand
로 생성하여 더 빠른 빌드를 할 수 있지만(그러나 초기 페이지 로드는 더 느립니다), 프로덕션 빌드에서는 모든 페이지를 사전 렌더링합니다(빌드는 더 느리지만 초기 페이지 로드는 더 빠릅니다).
이 기능은 수백/수천 개의 정적 페이지가 있는 사이트에서 유용합니다.
// pages/posts/[id].js
export async function getStaticPaths() {
// When this is true (in preview environments) don't
// prerender any static pages
// (faster builds, but slower initial page load)
if (process.env.SKIP_BUILD_STATIC_GENERATION) {
return {
paths: [],
fallback: 'blocking',
};
}
// Call an external API endpoint to get posts
const res = await fetch('https://.../posts');
const posts = await res.json();
// Get the paths we want to prerender based on posts
// In production environments, prerender all pages
// (slower builds, but faster initial page load)
const paths = posts.map((post) => ({
params: { id: post.id },
}));
// { fallback: false } means other routes should 404
return { paths, fallback: false };
}