nextjs static routing

2023-10-18 업데이트

본 방법은 page router에서 사용하던 방법으로 app route에서는 동작하지 않습니다.

getStaticPaths

Static Generation 전용 생략이 모든 route를 다 받습니다. paths는 아래와같은 형식을 따릅니다.

export interface UrlParams extends ParsedUrlQuery{
  slug: string //폴더나 파일중에 [slug]가 있어야합니다.
}

/**
 * @return {paths:{params:UrlParams}[]} 맵핑 가능한 URL paths
 * @return {fallback} 경로가 없을때 404 뿌려줄지 말지 여부
 */
export const getStaticPaths: GetStaticPaths<UrlParams> = async () => {
  return {paths: [{params: {slug: "aa"}}], fallback: false}
}

getStaticProps

각 페이지에 넘겨줄 데이터입니다.

export const getStaticProps: GetStaticProps<{ route: string }, UrlParams> = async (props) => {
  return {
    props: { route: 'wow' },
    // redirect:""
    // notFound:true
    // revalidate:1
  }
}

Page에서 데이터를 받습니다.

아래 옵션을 주면 처음에 페이지를 생성하고있지 않다고 요청이 들어올때 페이지를 생성합니다. 이 때문에 최초 접근 사용자는 매우 느린 loading타임을 가질 수 있음

  • fallback - true

요청된 함수에대해 바로 페이지가 호출되기때문에 분기처리를 해주어야합니다.

const FamousDetailPage: NextPage = (param: InferGetStaticPropsType<typeof getStaticProps>) => {
}

경로맵핑

일반적인 라우팅

pages/index.js → /
pages/blog/index.js → /blog
// router.query.page가 문자열로 받아집니다.
pages/blog/[page].js -> / blog/1
//router.query.slug에서 slug가 string[] 으로 받아집니다.
pages/blog/[...slug].js -> / blog/1/2/3/4

중첩라우팅

pages/blog/first-post.js → /blog/first-post
pages/dashboard/settings/username.js → /dashboard/settings/username

다이나믹 라우팅

pages/blog/[slug].js → /blog/:slug (/blog/hello-world)
pages/[username]/settings.js → /:username/settings (/foo/settings)
pages/post/[...all].js → /post/* (/post/2020/id/title)