Menu

getStaticProps

getStaticPropsという関数をエクスポートすると、関数から返されるpropsを使用してビルド時にページをプリレンダリングできます:

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

getStaticPropsで使用するためにトップレベルのスコープでモジュールをインポートできます。使用されたインポートはクライアントサイド用にバンドルされるありません。これは、データベースからデータをフェッチするなど、getStaticPropsで直接サーバーサイドのコードを記述できることを意味します。

コンテキストパラメーター

contextパラメーターは、以下のキーを含むオブジェクトです:

名前説明
params動的ルーティングを使用しているページのルートパラメーターを含みます。例えば、ページ名が[id].jsの場合、params{ id: ... }のようになります。これは後で説明するgetStaticPathsと一緒に使用する必要があります。
previewdraftModeで非推奨)ページがプレビューモードの場合はtrue、それ以外の場合はfalseとなります。
previewDatadraftModeで非推奨)setPreviewDataによって設定されたプレビューデータ。
draftModeページがドラフトモードの場合はtrue、それ以外の場合はfalseとなります。
localeアクティブなロケールを含みます(有効な場合)。
localesサポートされているすべてのロケールを含みます(有効な場合)。
defaultLocale設定されているデフォルトロケールを含みます(有効な場合)。
revalidateReason関数が呼び出された理由を提供します。以下のいずれかです:「build」(ビルド時に実行)、「stale」(再生成期間が期限切れ、または開発モードで実行)、「on-demand」(オンデマンド再生成によってトリガー)

getStaticPropsの戻り値

getStaticProps関数は、propsredirect、またはnotFoundのいずれかを含むオブジェクト、およびオプションのrevalidateプロパティを返す必要があります。

props

propsオブジェクトは、各値がページコンポーネントによって受け取られるキーと値のペアです。[JSON.stringify](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify)でシリアライズできる[シリアライザブルオブジェクト](https://developer.mozilla.org/docs/Glossary/Serialization)である必要があります。

export async function getStaticProps(context) {
  return {
    props: { message: `Next.jsは素晴らしい` }, // ページコンポーネントにpropsとして渡されます
  }
}

revalidate

revalidateプロパティは、ページの再生成が可能になるまでの秒数です(デフォルトはfalse、または再生成なし)。

// この関数はビルド時にサーバーサイドで呼び出されます。
// 再生成が有効で新しいリクエストが来た場合、
// サーバーレス関数で再度呼び出される可能性があります
export async function getStaticProps() {
  const res = await fetch('https://.../posts')
  const posts = await res.json()
 
  return {
    props: {
      posts,
    },
    // Next.jsは以下のタイミングでページの再生成を試みます:
    // - リクエストが来たとき
    // - 10秒に1回以上
    revalidate: 10, // 秒単位
  }
}

Incremental Static Regenerationの詳細をご覧ください。

ISRを活用するページのキャッシュステータスは、x-nextjs-cacheレスポンスヘッダーの値を読むことで判断できます。可能な値は以下のとおりです:

  • MISS - パスがキャッシュにない(最初の訪問時に最大1回発生)
  • STALE - パスがキャッシュにあるが、再検証時間を超過しているため、バックグラウンドで更新される
  • HIT - パスがキャッシュにあり、再検証時間を超過していない

notFound

notFound ブール値により、ページは 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 }, // ページコンポーネントにpropsとして渡される
  }
}

補足: fallback: false モードでは、notFound は不要です。getStaticPaths から返されたパスのみがプレレンダリングされるためです。

redirect

redirect オブジェクトにより、内部または外部リソースへのリダイレクトが可能です。{ destination: string, permanent: boolean } の形式に一致する必要があります。

まれに、古い HTTP クライアントが適切にリダイレクトするためにカスタムステータスコードを割り当てる必要がある場合があります。そのような場合、permanent プロパティの代わりに statusCode プロパティを使用できますが、両方は使用できません。また、next.config.js のリダイレクトと同様に、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 }, // ページコンポーネントにpropsとして渡される
  }
}

リダイレクトがビルド時に判明している場合は、代わりに next.config.js に追加する必要があります。

ファイル読み込み: process.cwd() を使用

getStaticProps では、ファイルシステムから直接ファイルを読み込むことができます。

そのためには、ファイルへの完全なパスを取得する必要があります。

Next.jsがコードを別のディレクトリにコンパイルするため、__dirname は Pages Router と異なるパスを返します。

代わりに、process.cwd() を使用できます。これは Next.js が実行されているディレクトリを提供します。

import { promises as fs } from 'fs'
import path from 'path'
 
// postsは getStaticProps() によりビルド時に設定されます
function Blog({ posts }) {
  return (
    <ul>
      {posts.map((post) => (
        <li>
          <h3>{post.filename}</h3>
          <p>{post.content}</p>
        </li>
      ))}
    </ul>
  )
}
 
// この関数はサーバー側のビルド時に呼び出されます。
// クライアント側では呼び出されないため、
// データベースへの直接クエリも可能です。
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')
 
    // 一般的には内容を解析/変換します
    // 例えば、ここでマークダウンをHTMLに変換できます
 
    return {
      filename,
      content: fileContents,
    }
  })
  // { props: { posts } } を返すことで、Blogコンポーネントは
  // ビルド時に `posts` をpropsとして受け取ります
  return {
    props: {
      posts: await Promise.all(posts),
    },
  }
}
 
export default Blog

バージョン履歴

バージョン変更点
v13.4.0App Router が簡略化されたデータフェッチと共に安定版になりました
v12.2.0オンデマンド増分静的再生成 が安定版になりました
v12.1.0オンデマンド増分静的再生成 が追加されました(ベータ版)。
v10.0.0localelocalesdefaultLocalenotFound オプションが追加されました。
v10.0.0fallback: 'blocking' 戻り値オプションが追加されました。
v9.5.0安定版 増分静的再生成
v9.3.0getStaticProps が導入されました。