カスタム App
Next.jsは App コンポーネントを使用してページを初期化します。これをオーバーライドしてページの初期化を制御し、以下を実現できます:
- ページ遷移間で共有されるレイアウトを作成する
- ページに追加のデータを挿入する
- グローバルCSSを追加する
使用方法
デフォルトの App をオーバーライドするには、以下のように pages/_app ファイルを作成します:
pages/_app.tsx
TypeScript
import type { AppProps } from 'next/app'
 
export default function MyApp({ Component, pageProps }: AppProps) {
  return <Component {...pageProps} />
}Component プロップはアクティブな page です。ルート間をナビゲートするたびに、Component は新しい page に変更されます。したがって、Component に送信するプロップはすべてそのページで受け取られます。
pageProps は、データ取得メソッドの1つによってページに対してプリロードされた初期プロップを含むオブジェクトです。そうでない場合は、空のオブジェクトです。
補足:
- アプリが実行中にカスタム
Appを追加した場合、開発サーバーを再起動する必要があります。これはpages/_app.jsが以前に存在しなかった場合にのみ必要です。
AppはgetStaticPropsまたはgetServerSidePropsのような Next.js データ取得メソッドをサポートしていません。
App での getInitialProps
App で getInitialProps を使用すると、getStaticProps のない pages の自動静的最適化が無効になります。
このパターンの使用はお勧めしません。 代わりに、段階的に App Router を採用することを検討してください。これにより、ページとレイアウトのデータ取得をより簡単に実行できます。
pages/_app.tsx
TypeScript
import App, { AppContext, AppInitialProps, AppProps } from 'next/app'
 
type AppOwnProps = { example: string }
 
export default function MyApp({
  Component,
  pageProps,
  example,
}: AppProps & AppOwnProps) {
  return (
    <>
      <p>Data: {example}</p>
      <Component {...pageProps} />
    </>
  )
}
 
MyApp.getInitialProps = async (
  context: AppContext
): Promise<AppOwnProps & AppInitialProps> => {
  const ctx = await App.getInitialProps(context)
 
  return { ...ctx, example: 'data' }
}