推奨: getStaticProps
または getServerSideProps
getInitialProps
は、ページ内のサーバーサイドレンダリングを可能にし、初期データを追加出来るようになります。つまり、既にデータが追加されているページをサーバーから送信するということです。これは特に SEO 対策に有効です。
getInitialProps
は Automatic Static Optimization を無効化します。
getInitialProps
は、任意のページに静的メソッド
として追加できる非同期
関数です。次の例を見てみましょう:
function Page({ stars }) {
return <div>Next stars: {stars}</div>;
}
Page.getInitialProps = async ctx => {
const res = await fetch('https://api.github.com/repos/zeit/next.js');
const json = await res.json();
return { stars: json.stargazers_count };
};
export default Page;
もしくは、クラスコンポーネントを使って以下のように書くこともできます:
import React from 'react';
class Page extends React.Component {
static async getInitialProps(ctx) {
const res = await fetch('https://api.github.com/repos/zeit/next.js');
const json = await res.json();
return { stars: json.stargazers_count };
}
render() {
return <div>Next stars: {this.props.stars}</div>;
}
}
export default Page;
getInitialProps
は非同期にデータを取得して props
にデータを追加するために使われます。
getInitialProps
から返されるデータは、 JSON.stringify
が行うのと同じように、サーバーレンダリング時にシリアライズされます。 getInitialProps
から返されるオブジェクトがプレーンなオブジェクトで Date
、 Map
、 Set
を使用していないことを確認してください。
最初のページのロードでは、 getInitialProps
はサーバー上でのみ実行されます。getInitialProps
は、 next/link
コンポーネントを介して、または next/router
を使用して別のルートへ移動するときにクライアント上で実行されます。しかしもし getInitialProps
がカスタムの _app.js
の中で使われていて遷移先のページが getServerSideProps
を実装している場合、 getInitialProps
はサーバー上で実行されます。
getInitialProps
は context
という単一の引数を受け取り、この context
は以下のプロパティを持つオブジェクトです:
pathname
- 現在のルート。これは /pages にあるページのパスです。query
- オブジェクトとしてパース(解析)される URL のクエリ文字列セクションです。asPath
- ブラウザに表示される実際のパスの文字列です(クエリを含む)。req
- HTTP リクエストオブジェクトです(サーバのみ)。res
- HTTP レスポンスオブジェクトです(サーバのみ)。err
- レンダリング中にエラーが発生した場合のエラーオブジェクトです。getInitialProps
は各ページの export 部分のみで使用できます。子コンポーネントでは使用できません。getInitialProps
の中でサーバーサイドのみのモジュールを使用している場合は、それらを適切にインポートするようにしてください。そうしなければアプリが遅くなってしまうでしょう。もし TypeScript を使っているならば、関数コンポーネントに NextPage
型を使用できます:
import { NextPage } from 'next'
interface Props {
userAgent?: string;
}
const Page: NextPage<Props> = ({ userAgent }) => (
<main>Your user agent: {userAgent}</main>
)
Page.getInitialProps = async ({ req }) => {
const userAgent = req ? req.headers['user-agent'] : navigator.userAgent
return { userAgent }
}
export default Page
React.Component
には、 NextPageContext
を使用できます:
import React from 'react';
import { NextPageContext } from 'next';
interface Props {
userAgent?: string;
}
export default class Page extends React.Component<Props> {
static async getInitialProps({ req }: NextPageContext) {
const userAgent = req ? req.headers['user-agent'] : navigator.userAgent;
return { userAgent };
}
render() {
const { userAgent } = this.props;
return <main>Your user agent: {userAgent}</main>;
}
}
次にやるべきこととして、以下のセクションを読むことをお勧めします: