カスタム App コンポーネント
Next.js はページ初期化に App
コンポーネントを使用します。このコンポーネントをオーバーライドすることで、ページ初期化を制御し、以下のことが可能です:
- ページ遷移間で共有されるレイアウトを作成
- ページに追加データを注入
- グローバル CSS の追加
使用方法
デフォルトの App
をオーバーライドするには、以下のように pages/_app
ファイルを作成します:
import type { AppProps } from 'next/app'
export default function MyApp({ Component, pageProps }: AppProps) {
return <Component {...pageProps} />
}
export default function MyApp({ Component, pageProps }) {
return <Component {...pageProps} />
}
Component
プロパティは現在の page
を表すため、ルート間を移動するたびに Component
は新しい page
に変更されます。したがって、Component
に渡すすべてのプロパティは page
で受け取られます。
pageProps
は、データ取得方法のいずれかであらかじめ読み込まれたページの初期プロパティを含むオブジェクトです。それ以外の場合は空のオブジェクトになります。
補足
- アプリが実行中にカスタム
App
を追加した場合、開発サーバーを再起動する必要があります。これはpages/_app.js
が以前存在しなかった場合のみ必要です。App
コンポーネントはgetStaticProps
やgetServerSideProps
といった Next.js のデータ取得方法をサポートしていません。
App
での getInitialProps
の使用
App
で getInitialProps
を使用すると、getStaticProps
を持たないページの自動静的最適化が無効になります。
このパターンの使用は推奨しません。代わりに、ページとレイアウトのデータ取得を容易にする App Router への段階的な移行を検討してください。
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' }
}
import App from 'next/app'
export default function MyApp({ Component, pageProps, example }) {
return (
<>
<p>Data: {example}</p>
<Component {...pageProps} />
</>
)
}
MyApp.getInitialProps = async (context) => {
const ctx = await App.getInitialProps(context)
return { ...ctx, example: 'data' }
}