Lang x Lang

getStaticProps

getStaticPropsと呼ばれる関数を export すると、関数から返された props を使用して、build 時間にページをプレレンダリングします。

pages/index.tsx
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
}
pages/index.js
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:

NameDescription
paramsdynamic routesを使用しているページの route パラメータを格納します。例えば、ページ名が [id].jsの場合、params{ id:... } のようになります。これは後で説明するgetStaticPathsと一緒に使用するべきです。
preview(draftModeに非推奨) previewは、ページがPreview Modeにある場合true、そうでなければfalseとなります。
previewData(draftMode用に非推奨) setPreviewDataによって設定されたpreviewデータセット。
draftModeページがドラフトモードにある場合、draftModetrueとなり、それ以外の場合はfalseとなります。
localeアクティブな locale (有効になっている場合)を含みます。
localesすべてのサポートされている locales (有効にした場合)が含まれています。
defaultLocale設定された default locale (有効にした場合)が含まれます。

getStaticProps return values

getStaticProps関数は、propsredirect、または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 background
  • HIT - 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

redirectobject は、内部または外部リソースへのリダイレクトを可能にします。それは{ destination: string, permanent: boolean }の形状と一致するべきです。

まれに、古いHTTPClient が正しく 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

VersionChanges
v13.4.0App Router is now stable with simplified data fetching
v12.2.0On-Demand Incremental Static Regeneration is stable.
v12.1.0On-Demand Incremental Static Regeneration added (beta).
v10.0.0locale, locales, defaultLocale, and notFound options added.
v10.0.0fallback: 'blocking'リターンオプションが追加されました。
v9.5.0Stable Incremental Static Regeneration
v9.3.0getStaticPropsが導入されました。

当社サイトでは、Cookie を使用しています。各規約をご確認の上ご利用ください:
Cookie Policy, Privacy Policy および Terms of Use