Automatic Static Optimization
Next.js は、ページにブロッキングデータの要件がない場合、自動的にページが静的(先読み可能)であると判断します。この判断は、ページにgetServerSideProps
およびgetInitialProps
が存在しないことによって行われます。
この機能により、Next.js はserver 側でレンダリングされたページと静的に生成されたページの両方を含むハイブリッドアプリケーションを出力することができます。
静的に生成されたページもまだリアクティブです:Next.js は Client 側であなたのアプリケーションをハイドレートし、それに完全な対話型性を与えます。
この機能の主な利点の一つは、最適化されたページが requireserver 側の server-side 計算を必要とせず、複数の CDN ロケーションからエンドユーザーに即座に Streaming できることです。結果として、あなたのユーザーには超高速な loading 体験が提供されます。
How it works
ページにgetServerSideProps
またはgetInitialProps
が存在する場合、Next.js は、オンデマンドで、Request ごとにページを render するように切り替わります(つまりServer-Side Renderingを意味します)。
上記が話されている状況でない場合、Next.js は、ページを静的な HTML にプレレンダリングすることで、あなたのページを静的に最適化します。
プレ rendering 中、routers の query
object は、このフェーズ中に提供する query
情報がないため、empty になります。ハイドレーション後、Next.js はあなたのアプリケーションに更新をトリガーして、query
object の中に route パラメータを提供します。
hydration がトリガーされた後に query が更新されるケースで、もう一度 render がトリガーされるケースは以下の通りです:
- そのページはdynamic-routeです。
- そのページは URL 内に query の値を持っています。
- Rewritesはあなたの
next.config.js
に設定されています。これらはパースされ、query
で提供する必要がある可能性のあるパラメーターを持つことができます。
query が完全に更新され、使用の準備ができているかどうかを区別するために、 next/router
の isReady
フィールドを利用できます。
Good to know: dynamic routesでページに追加されたパラメータは、
getStaticProps
を使用しているページでも常にquery
object 内で利用可能です。
next build
は、静的に最適化されたページ用の.html
ファイルを出力します。例えば、ページpages/about.js
の結果は次のようになります:
.next/server/pages/about.html
そして、ページに getServerSideProps
を追加すると、それは次のように JavaScript になります。
.next/server/pages/about.js
Caveats
- もしcustom
App
を持っていて、getInitialProps
がある場合、この最適化はStatic Generationがないページではオフになります。 - あなたがカスタム
Document
を持っていて、getInitialProps
がある場合は、ページが server-side でレンダリングされていると想定する前にctx.req
が定義されているか確認してください。プレレンダリングされたページのctx.req
はundefined
になります。 - レンダリングツリーで
next/router
のasPath
value を使用するのは、router のisReady
フィールドがtrue
になるまで避けてください。静的に最適化されたページは、asPath
を client ではなく server でのみ認識するため、プロパティとして使用するとミスマッチ error を引き起こす可能性があります。active-class-name
example は、asPath
をプロパティとして使用する 1 つの方法を示しています。