カスタムApp
Next.js は、ページを初期化するために App コンポーネントを使用します。これをオーバーライドして、ページの初期化を制御し、
- ページ遷移間の共通レイアウトを作成する
- ページにデータを追加する
- グローバル CSS を追加する
使用方法
デフォルトの App をオーバーライドするには、以下のように pages/_app ファイルを作成します。
pages/_app.tsx
import type { AppProps } from 'next/app'
export default function MyApp({ Component, pageProps }: AppProps) {
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 を段階的に採用することを検討してください。
pages/_app.tsx
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' }
}役に立ちましたか?