カスタム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
propsはアクティブなpage
であり、ルート間を移動するたびにComponent
は新しいpage
に変わります。したがって、Component
に送信するすべてのpropsはpage
によって受け取られます。
pageProps
は、当社のデータフェッチメソッドのいずれかによってページのためにプリロードされた初期propsを持つオブジェクトです。それ以外の場合は空のオブジェクトです。
知っておくと良いこと:
- アプリが実行中でカスタム
App
を追加した場合、開発サーバーを再起動する必要があります。これはpages/_app.js
が以前存在しなかった場合にのみ必要です。App
は、Next.jsのデータフェッチメソッドであるgetStaticProps
やgetServerSideProps
をサポートしていません。
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' }
}
この情報は役に立ちましたか?