😀
getStaticPropsとgetServerSidePropsの行方
みなさんこんにちは、TecSocです。
Next.jsのバージョンが12から13になったことに伴い、getStaticPropsとgetServerSidePropsは廃止されました。
なので、それぞれの用途をしたい場合にNext.js13以降ではどのように表記すれば良いかを調べ、まとめていきます。
Next.js12まで
getServerSideProps
import type { InferGetServerSidePropsType, GetServerSideProps } from 'next'
type Repo = {
name: string
stargazers_count: number
}
export const getServerSideProps = (async () => {
// Fetch data from external API
const res = await fetch('https://api.github.com/repos/vercel/next.js')
const repo: Repo = await res.json()
// Pass data to the page via props
return { props: { repo } }
}) satisfies GetServerSideProps<{ repo: Repo }>
export default function Page({
repo,
}: InferGetServerSidePropsType<typeof getServerSideProps>) {
return (
<main>
<p>{repo.stargazers_count}</p>
</main>
)
}
getStaticPropsとgetStaticPaths
import type {
InferGetStaticPropsType,
GetStaticProps,
GetStaticPaths,
} from 'next'
type Repo = {
name: string
stargazers_count: number
}
export const getStaticPaths = (async () => {
return {
paths: [
{
params: {
name: 'next.js',
},
}, // See the "paths" section below
],
}
}) satisfies GetStaticPaths
export const getStaticProps = (async (context) => {
const res = await fetch('https://api.github.com/repos/vercel/next.js')
const repo = await res.json()
return { props: { repo } }
}) satisfies GetStaticProps<{
repo: Repo
}>
export default function Page({
repo,
}: InferGetStaticPropsType<typeof getStaticProps>) {
return repo.stargazers_count
}
Next.js13以降
旧getServerSideProps
Server Componentに対応し、デフォルトがServer Componentになったことで
コンポーネント内でfetchをするとサーバー側で処理されます。
export default async function Page() {
let data = await fetch('https://api.vercel.app/blog')
let posts = await data.json()
return (
<ul>
{posts.map((post) => (
<li key={post.id}>{post.title}</li>
))}
</ul>
)
}
旧getStaticPropsとgetStaticPaths
getStaticPathsが廃止され、generateStaticParamsになりました。
また、generateStaticParamsを使うことによってコンポーネントが静的にビルドされるようになります。
// Return a list of `params` to populate the [slug] dynamic segment
export async function generateStaticParams() {
const posts = await fetch('https://.../posts').then((res) => res.json())
return posts.map((post) => ({
slug: post.slug,
}))
}
// Multiple versions of this page will be statically generated
// using the `params` returned by `generateStaticParams`
export default async function Page({ params }) {
const { slug } = await params
// ...
}
Discussion