๐ค ์์งlog ๐ค
[NEXTJS ] getStaticProps( ) ์ getStaticPaths( ) ๋ณธ๋ฌธ
Next.js์ getStaticProps์ getStaticPaths api๋ฅผ ์ฌ์ฉํ๋ฉด static ํ์ด์ง๋ฅผ ์์ฑํ ์ ์๋ค.
- getStaticProps: ๋น๋ ์ ๋ฐ์ดํฐ๋ฅผ fetchํ์ฌ static ํ์ด์ง๋ฅผ ์์ฑ
- getStaticPaths: pages/**/[id].tsx ํํ์ ๋์ ๋ผ์ฐํ ํ์ด์ง ์ค, ๋น๋ ์์ staticํ๊ฒ ์์ฑํ ํ์ด์ง๋ฅผ ์ ํจ
๐ getStaticProps
<Page>.tsx์์ export async function getStaticProps(context) ํํ๋ก ์ฌ์ฉ.
context.params๋ก ๋์ ๋ผ์ฐํ ์ ๊ฒฝ๋ก ์ด๋ฆ์ ๊ฐ์ ธ์จ๋ค.
pages/posts/[id].tsx ํ์ด์ง๋ฅผ /posts/123์ผ๋ก ์ ๊ทผํ๋ค๋ฉด context.params๋ { id: "123" }์ด ๋๋ค.
{ props: object }๋ฅผ ๋ฆฌํดํ๋ฉด, export defaultํ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ์ parameter๋ก ๋๊ฒจ์ง๋ค.
import type { GetStaticProps, InferGetStaticPropsType } from "next";
// GetStaticProps๋ getStaticProps์ ํ์
// InferGetStaticPropsType์ ์ปดํฌ๋ํธ์ ์ฌ์ฉ๋๋ ์ ๋ค๋ฆญ ํ์
type Post = {
title: string;
}
export const getStaticProps: GetStaticProps = async (context) => {
// async์ฌ์ผ ํจ
const response = await fetch("https://example.com");
const post: Post = await response.json();
// Next.js๊ฐ ํด๋ฆฌํํ๋ Fetch API
// https://nextjs.org/docs/basic-features/supported-browsers-features#polyfills
return {
props: {
post
}
// props๋ ํ์ฌ ํ์ด์ง์ default export ์ปดํฌ๋ํธ์ parameter๋ก ๋๊ฒจ์ง
}
}
const function Blog = ({ post }: InferGetStaticPropsType<typeof getStaticProps>) => {
// { post: Post }๋ก ํ์
์ง์ ๋จ
return (
<div>{post.title}</div>
)
}
export default Blog;
getStaticProps๊ฐ ํ์ํ ๋
When should I use getstaticprops?
- ํ์ด์ง์ ํ์ํ ๋ฐ์ดํฐ๊ฐ ๋น๋ ์์ ์ฌ์ฉ ๊ฐ๋ฅํ ๋
- ๋ฐ์ดํฐ๋ฅผ headless CMS์์ ๊ฐ์ ธ์ฌ ๋
- ๋ชจ๋ ์ฌ์ฉ์์๊ฒ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ณด์ฌ์ค ๋
- SEO๋ฅผ ์ํด์ ์๋ ๋น ๋ฅธ ํ์ด์ง๊ฐ ํ์ํ ๋
- ๊ณต์ ๋ฌธ์์๋ ์์ง๋ง Node api(path, fs ๋ฑ)์ ์ฌ์ฉํด์ผ ํ ๋
import path from "path";
export const getStaticProps = () => {
const postDirectory = path.resolve(process.cwd(), '/posts');
// process.cwd()๋ Next.js ํด๋๋ฅผ ๊ฐ๋ฆฌํด(package.json์ด ์๋ ํด๋)
// ...
}
๐ getStaticPaths
๋์ ๋ผ์ฐํ ์ ์ฌ์ฉํ ๋, ์ด๋ค ํ์ด์ง๋ฅผ ๋ฏธ๋ฆฌ Static์ผ๋ก ๋น๋ํ ์ง ์ ํ๋ api
import type { GetStaticPaths } from "next";
// GetStaticPaths๋ getStaticPaths์ ํ์
export const getStaticPaths: GetStaticPaths = async () => {
// getStaticProps์ฒ๋ผ async
// ...
return {
paths: [
{ params: {} }
],
// { parmas: {} }[] ํํ๋ก paths ๋ฆฌํดํด์ผ ํจ
// ๋น๋ ์์ ํด๋น ํ์ด์ง๋ค์ static์ผ๋ก ์์ฑ
fallback: true | false | 'blocking'
// fallback์ ๋ฆฌํดํด์ผ ํจ
}
// ์์
return {
paths: [
{ params: { id: "1" }},
{ params: { id: "2" }}
]
// pages/posts/[id].tsx๋ผ๊ณ ๊ฐ์
// pages/posts/1๊ณผ pages/posts/2๋ฅผ static์ผ๋ก ์์ฑ
}
// ์์ 2
return {
paths: [
{
params: {
id: "1",
title: "first post"
}
},
{
params: {
id: "2",
title: "second post"
}
}
]
// pages/posts/[id]/[title].tsx๋ผ๊ณ ๊ฐ์
// pages/posts/1/first post์ pages/posts/2/second post/๋ฅผ static์ผ๋ก ์์ฑ
}
}
๐ fallback (required)์ ๋ฆฌํด ๊ฐ์ ๋ฐ๋ฅธ ์ฐจ์ด
fallback: false
: getStaticPaths์์ ๋ฆฌํดํ์ง ์์ ํ์ด์ง๋ ๋ชจ๋ 404๋ก ์ฐ๊ฒฐ
fallback: true
: getStaticPaths์์ ๋ฆฌํดํ์ง ์์ ํ์ด์ง์ ์ ์ ์,
- ๋จผ์ ์ฌ์ฉ์์๊ฒ fallback ํ์ด์ง๋ฅผ ๋ณด์ฌ์ค
- ์๋ฒ์์ staticํ๊ฒ ํ์ด์ง๋ฅผ ์์ฑํจ
- ํด๋น ํ์ด์ง๋ฅผ ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ค
- ๋ค์๋ถํฐ ํด๋น ํ์ด์ง๋ก ์ ์ํ๋ ์ฌ์ฉ์์๊ฒ๋ staticํ ํ์ด์ง๋ฅผ ๋ณด์ฌ์ค
// pages/posts/[id].tsx
import { useRouter } from "next/router";
// fallback ํ์ด์ง๋ฅผ ์ํ useRouter import
const Post = ({ post }) => {
cont router = useRouter();
if (router.isFallback) {
return <div>Loading...</div>
}
// fallback = true ์, ์ ์ํ ํ์ด์ง๋ฅผ ์์ฑํ ๋ ๋ณด์ฌ์ฃผ๋ ํ์ด์ง
return (
<div>{post.title}</div>
)
}
export default Post;
export const getStaticPaths = async () => {
return {
paths: [
{ params: { id: 1} }
],
fallback: true
}
}
export const getStaticProps = async ({ params }) => {
const response = await fetch(`https://example.com/${params.id}`);
const post = response.json();
return {
props: { post }
}
}
๋ง์ static ํ์ด์ง๋ฅผ ์์ฑํด์ผ ํ์ง๋ง ๋น๋ ์๊ฐ์ด ๋๋ฌด ์ค๋ ๊ฑธ๋ฆด ๋ ์ฌ์ฉ
-> fallback: "blocking"
getStaticPaths์์ ๋ฆฌํดํ์ง ์์ ํ์ด์ง์ ์ ์ ์,
- ์ฌ์ฉ์์๊ฒ server side renderingํ static ํ์ด์ง๋ฅผ ๋ณด์ฌ์ค
- ๋ค์๋ถํฐ ํด๋น ํ์ด์ง๋ก ์ ์ํ๋ ์ฌ์ฉ์์๊ฒ๋ server side renderingํ static ํ์ด์ง๋ฅผ ๋ณด์ฌ์ค
์ฆ, fallback ํ์ด์ง๋ ๋ก๋ฉ ํ๋ฉด์ด ์๋ค.
๋์ ๋ผ์ฐํ ํ์ด์ง๋ฅผ static ํ์ด์ง๋ก ์ ๊ณตํด์ผ ํ ๋ ์ฌ์ฉ
'๐ท Next JS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[NextJS] NextJS ์์ Material-ui์ Styled-components ์ฌ์ฉํ๊ธฐ (0) | 2023.03.24 |
---|---|
[NextJS] NextJS ์์ Material-Ui ์ฌ์ฉํ๊ธฐ (0) | 2023.03.24 |
[NEXTJS] ์๋ฒ์ฌ์ด๋ ๋ ๋๋ง์ ๋ฐ์ํ๋ html ๋งค์นญ ๋ฌธ์ (0) | 2023.02.21 |
[NextJS] NextJS ์์ window ๊ฐ์ฒด๊ฐ ์๋ค๊ณ ํ ๋ (0) | 2023.01.05 |
[NextJS] NextJS์์ ์ปดํฌ๋ํธํ์์ผ๋ก SVG์ฌ์ฉํ๊ธฐ (0) | 2022.12.05 |