- HOME >
- Jamstack用語集 >
- getStaticProps
getStaticProps
「静的サイト生成(SSG)」を実現するための、Next.js の機能
getStaticProps を分かりやすく?
「getStaticProps」とは、「静的サイト生成(SSG)」を実現するための、Next.js の機能の 1 つです。この機能は、Next.js や TypeScript を使った Web 開発において、動的なコンテンツを含む Web ページを生成するために重要な役割を果たしています。
あなたが、自分のブログの Web サイトを作りたいと思っているとします。ブログのコンテンツは、記事のタイトルと本文が含まれる HTML ページの集合です。このようなサイトを作るために、静的サイト生成と getStaticProps を利用することができます。
posts.ts に記事のデータを定義する
具体的には、まず、TypeScript と Next.js を使って、ブログの記事のデータを配列で定義します。以下は、posts.ts
というファイルに記事のデータを定義する例です。
export const posts = [
{
id: 'post1',
title: 'はじめてのブログ',
content: 'これは、はじめて書いたブログです。',
},
{
id: 'post2',
title: '2回目のブログ',
content: 'これは、2回目に書いたブログです。',
},
{
id: 'post3',
title: '3回目のブログ',
content: 'これは、3回目に書いたブログです。',
},
// 以下、ブログ記事のデータが続く
]
GetStaticPaths
型とGetStaticProps
型
次に、このデータをもとに、各記事の HTML ページを生成します。ここで、getStaticProps を利用すると、動的なコンテンツを含む Web ページを一括で生成することができます。以下は、pages/posts/[id].tsx
というファイルに、getStaticProps と HTML ページの生成のためのコードを記述した例です。
import { GetStaticPaths, GetStaticProps } from 'next'
import { posts } from '../../posts'
type Post = {
id: string
title: string
content: string
}
type PostProps = {
post: Post
}
export default function Post({ post }: PostProps) {
return (
<div>
<h1>{post.title}</h1>
<p>{post.content}</p>
</div>
)
}
export const getStaticPaths: GetStaticPaths = async () => {
const paths = posts.map((post) => ({
params: { id: post.id },
}))
return { paths, fallback: false }
}
export const getStaticProps: GetStaticProps<PostProps> = async ({ params }) => {
const post = posts.find((post) => post.id === params?.id)
if (!post) {
return { notFound: true }
}
return { props: { post } }
}
上述したコードでは、GetStaticPaths
型とGetStaticProps
型を使って、getStaticProps と getStaticPaths の 2 つの関数を定義しています。
getStaticPaths
関数では、paths
という変数に、各記事の ID をもとに生成したパスを配列で格納しています。fallback
にはfalse
を指定しているため、存在しないパスにアクセスされた場合は 404 ページを表示するようになっています。
getStaticProps
関数では、パラメーターとして渡された記事の ID をもとに、該当する記事を検索しています。もし該当する記事が存在しない場合は、notFound: true
を返して、404 ページを表示します。記事が存在する場合は、props
に記事のデータを格納して返します。
最後に、各記事の HTML ページを生成するためのコードを書きます。以下は、pages/posts/[id].tsx
ファイルに記述したコードの続きです。
export default function Post({ post }: PostProps) {
return (
<div>
<h1>{post.title}</h1>
<p>{post.content}</p>
</div>
)
}
このコードでは、getStaticProps で取得した記事のデータを、Post
コンポーネントのpost
というプロパティに渡しています。post
を使って、記事のタイトルと本文を画面に表示することができます。
Next.js 13 の新機能 Data Fetching
Next.js 13 の新機能として、React Suspense を利用した app/ディレクトリでは、getStaticProps や getServerSideProps といったこれまでの Next.js API を置き換える新しい usehook が導入されています。この新しい方法を利用すると、データをフェッチすることができます。以下は、getStaticProps の代わりに fetchData 関数を使用する例です。
//app/page.tsx
async function fetchData() {
const response = await fetch('https://...`)
const data = await response.json()
return data
}
export default function Page() {
const data = fetchData()
return <div>{data}</div>
}
以上のように、Next.js と TypeScript を使った getStaticProps の例を紹介しました。このように、getStaticProps を利用することで、動的なコンテンツを含む Web ページを静的サイト生成することができます。