getInitialProps
スタティックメソッドは React のライフサイクルのメソッド群のようにサーバーサイドでもクライアントサイドでも呼び出されます。サーバーサイドで返した値はwindow.__NEXT_DATA__
から取得できるので、クライアントサイドではここから値を取得することで通信なしでいける場合があります。
req か res を使ってサーバーサイドでのみ実行される処理を書く
(追記@2019-05-26)
以下のような判定をしなくてもprocess.browser
という変数が設定されていました。名前から察せれるようにサーバー側ではfalse
でブラウザ側ではtrue
になるのでこれを使ったほうが楽です。next@^8.1.0
での確認です。
typescript process.browser にアクセスできる型定義
process
はNodeJS.Process
を見ているのでこれを拡張してあげます。
declare namespace NodeJS {
interface Process {
browser: boolean;
}
}
というよりnext@8
ぐらいからgetInitialProps
はサーバーでしか動かなくなったかもしれないので以下は不要かもしれません。
このgetInitialProps
に渡ってくるコンテキストのreq
とres
というプロパティはサーバーサイドだけでしか渡ってこない値です。ですのでこれを使ってサーバーサイド判定ができます。
以下は例コードです。req
がある場合はサーバーサイドなのでデータを取得する処理を行い、ない場合(クライアントサイド)ではサーバーサイドで返した値をただ渡すことでクライアントサイドでの通信を無くしています。。
class extends React.Component {
static async getInitialProps({req}) {
let data;
if (req) {
data = await axios.get('https://xxx.com/xxx')
} else {
data = window.__NEXT_DATA__.props.pageProps.data;
}
return {data};
}
}