getStaticProps
getStaticProps
と呼ばれる関数を export すると、関数から返された props を使用して、build 時間にページをプレレンダリングします。
import type { InferGetStaticPropsType, GetStaticProps } from 'next'
type Repo = {
name: string
stargazers_count: number
}
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
}
export async function getStaticProps() {
const res = await fetch('https://api.github.com/repos/vercel/next.js')
const repo = await res.json()
return { props: { repo } }
}
export default function Page({ repo }) {
return repo.stargazers_count
}
getStaticProps
内で使用するために、トップレベルの scope で import modules することができます。使用される import は、クライアントサイドにはバンドルされません。これは、あなたがgetStaticProps
内で直接** server-side code を書くことができる**ということを意味します、データベースからのデータの取得を含む。
Context parameter
The context
parameter is an object containing the following keys:
Name | Description |
---|---|
params | dynamic routesを使用しているページの route パラメータを格納します。例えば、ページ名が [id].js の場合、params は { id:... } のようになります。これは後で説明するgetStaticPaths と一緒に使用するべきです。 |
preview | (draftMode に非推奨) preview は、ページがPreview Modeにある場合true 、そうでなければfalse となります。 |
previewData | (draftMode 用に非推奨) setPreviewData によって設定されたpreviewデータセット。 |
draftMode | ページがドラフトモードにある場合、draftMode はtrue となり、それ以外の場合はfalse となります。 |
locale | アクティブな locale (有効になっている場合)を含みます。 |
locales | すべてのサポートされている locales (有効にした場合)が含まれています。 |
defaultLocale | 設定された default locale (有効にした場合)が含まれます。 |
getStaticProps return values
getStaticProps
関数は、props
、redirect
、またはnotFound
のいずれかを含む object を返すべきであり、その後には任意のrevalidate
プロパティが続くべきです。
props
props
object はキーと value のペアで、各 value はページの component によって受け取られます。それはシリアライザブルな object であるべきで、渡された任意の props がJSON.stringify
でシリアライズできるようにするためです。
export async function getStaticProps(context) {
return {
props: { message: `Next.js is awesome` }, // will be passed to the page component as props
};
}
revalidate
revalidate
プロパティは、ページの再生成が可能になる秒数です(default はfalse
または再検証なし)。
// This function gets called at build time on server-side.
// It may be called again, on a serverless function, if
// revalidation is enabled and a new request comes in
export async function getStaticProps() {
const res = await fetch("https://.../posts");
const posts = await res.json();
return {
props: {
posts,
},
// Next.js will attempt to re-generate the page:
// - When a request comes in
// - At most once every 10 seconds
revalidate: 10, // In seconds
};
}
Incremental Static Regenerationについてさらに学びましょう。
ISR を活用したページの cache 状況は、x-nextjs-cache
の value を読むことで判断できます。response header が取り得る値は以下の通りです:
MISS
- the path is not in the cache (occurs at most once, on the first visit)STALE
- the path is in the cache but exceeded the revalidate time so it will be updated in the backgroundHIT
- the path is in the cache and has not exceeded the revalidate time
notFound
notFound
の boolean は、ページが 404
ステータスと404 ページを返すことを可能にします。notFound: true
の場合、前に正常に生成されたページがあったとしても、ページは 404
を返します。これは、ユーザー生成のコンテンツがその著者によって削除されるといったユースケースをサポートすることを意図したものです。なお、notFound
は同じrevalidate
の振舞いを追従します。ここで説明されています。
export async function getStaticProps(context) {
const res = await fetch(`https://.../data`);
const data = await res.json();
if (!data) {
return {
notFound: true,
};
}
return {
props: { data }, // will be passed to the page component as props
};
}
Good to know:
fallback: false
モードでは、getStaticPaths
から返される paths だけが事前にレンダリングされるため、notFound
は必要ありません。
redirect
redirect
object は、内部または外部リソースへのリダイレクトを可能にします。それは{ destination: string, permanent: boolean }
の形状と一致するべきです。
まれに、古いHTTP
Client が正しく redirect するためにカスタムステータス code を割り当てる必要があるかもしれません。そのような場合、permanent
プロパティの代わりにstatusCode
プロパティを使用できますが、両方とも使用することはできません。また、next.config.js
の redirects と同様にbasePath: false
を設定することもできます。
export async function getStaticProps(context) {
const res = await fetch(`https://...`);
const data = await res.json();
if (!data) {
return {
redirect: {
destination: "/",
permanent: false,
// statusCode: 301
},
};
}
return {
props: { data }, // will be passed to the page component as props
};
}
もし redirects が build 時に既知であれば、それらは代わりに next.config.js
に追加すべきです。
Reading files: Use process.cwd()
getStaticProps
内でファイルシステムから直接ファイルを読むことができます。
それを行うためには、ファイルへの完全な path を取得する必要があります。
Next.js があなたの code を別のディレクトリにコンパイルするため、__dirname
を使うことはできません。なぜなら、それが返す path は Pages Router とは異なるからです。
代わりに、process.cwd()
を使用できます。これにより、Next.js が実行されているディレクトリが表示されます。
import { promises as fs } from "fs";
import path from "path";
// posts will be populated at build time by getStaticProps()
function Blog({ posts }) {
return (
<ul>
{posts.map((post) => (
<li>
<h3>{post.filename}</h3>
<p>{post.content}</p>
</li>
))}
</ul>
);
}
// This function gets called at build time on server-side.
// It won't be called on client-side, so you can even do
// direct database queries.
export async function getStaticProps() {
const postsDirectory = path.join(process.cwd(), "posts");
const filenames = await fs.readdir(postsDirectory);
const posts = filenames.map(async (filename) => {
const filePath = path.join(postsDirectory, filename);
const fileContents = await fs.readFile(filePath, "utf8");
// Generally you would parse/transform the contents
// For example you can transform markdown to HTML here
return {
filename,
content: fileContents,
};
});
// By returning { props: { posts } }, the Blog component
// will receive `posts` as a prop at build time
return {
props: {
posts: await Promise.all(posts),
},
};
}
export default Blog;
Version History
Version | Changes |
---|---|
v13.4.0 | App Router is now stable with simplified data fetching |
v12.2.0 | On-Demand Incremental Static Regeneration is stable. |
v12.1.0 | On-Demand Incremental Static Regeneration added (beta). |
v10.0.0 | locale , locales , defaultLocale , and notFound options added. |
v10.0.0 | fallback: 'blocking' リターンオプションが追加されました。 |
v9.5.0 | Stable Incremental Static Regeneration |
v9.3.0 | getStaticProps が導入されました。 |