作成日: 2023-6-4
更新日: 2023-10-9
App Routerとは「React Server Components(Server Components)」を含め、Reactの最新機能を使ったアプリケーション構築を簡単にできるようにした概念的なものです。
Next.js13でリリースされた機能であり、バージョン13.4のリリース時にstable版となりました。
App Routerはリポジトリ内の「app」ディレクトリ配下にあるコンポーネントをデフォルトで「Server Components」として扱うことができます。
App Routerを使うメリットは、React Server Components(Server Components)等のReactの最新技術を使うことでサイトパフォーマンスに優れたWebサイト構築が可能なことです。
このメリットを活かす上でNext.js13の非常に重要な仕組みである「Server Components」と「Client Components」について理解する必要がありますので、今回はこちらについて解説します。
Client Componentとは、JavaScriptの実行、HTML、CSSの組み立てがクライアントサイド(ユーザ側)で行われるコンポーネントを指しています。
Client Componentsでは上の画像のようにアプリケーションが動作します。
いわゆるSPA(シングルページアプリケーション)の動作になります。
最近では、主流となった画面表示の方法となりますが、デメリットがいくつかあります。
Client Componentsはユーザ側(ブラウザ)でJavaScriptの実行、HTML、CSSの組み立てが行われるため、サイトパフォーマンスはユーザのデバイスや環境に依存してしまいます。
Server Componentとは、JavaScriptの実行、HTML、CSSの組み立てがサーバ上で行われるコンポーネントを指しています。
Client Componentsでは、これらの動作はクライアント(ユーザのブラウザ等)で実行されていました。
Next.jsはサーバ機構を有しており、そのサーバでJavaScriptの実行、HTML、CSSの組み立てが可能になっています。
これにより、ユーザ環境に依存しないサイトパフォーマンスの最適化が実現可能になりました。
Server Componentsでは上の画像のようにアプリケーションが動作します。
(Client Components同様、ショッピングサイトを想定しています。また、画像の解説はDynamic Data Fetching及びDynamic Rendering時の挙動となります。)
これにより、ユーザ環境に依存しないサイトパフォーマンスの最適化が実現可能になりました。
Server Componnentは大きく3つのタイミングで生成が実行されます。
1. ビルド時
Next.jsアプリケーションをビルドするタイミング(npm run build
等)でServer Componentsの生成が行われます。ビルド時にサーバでHTML等の生成が行われるので、ユーザはすぐにコンテンツを見ることができます。ただし、ビルド時にデータ取得を行うので、リアルタイムなデータ反映はできません。
2. 一定時間経過後
該当ページに最初のリクエストが送られてから一定時間経過後にそのページのServer Componentsの生成が行われます。
リアルタイムなデータ反映とまではいきませんが、概ねパフォーマンスを維持したまま新しい情報の配信が可能となります。
3. リクエスト時
ユーザからリクエストを受け取ったタイミングでHTML等の生成がサーバで行われる。これにより、リアルタイムなコンテンツを提供が可能になります。ただしリクエストを受けてからデータ取得、HTML、CSSの組み立て等が行われるので、パフォーマンスは少し落ちます。
Next.js13では、1のビルド時にデータを取得することをStatic Data Fetching、ビルド時に生成したHTMLをユーザの画面上に表示することをStatic Renderingと定義しています。
2の一定時間経過後にServer Componentsが生成されるようにするにはStatic Data Fetchingのオプションであるrevalidateを設定する必要があります。
3のリクエスト時にサーバ上でデータの取得を行うことをDynamic Data Ferching、リクエスト時に生成したHTMLをユーザの画面上に表示することをDynamic Renderingと定義しています。
Client Componentsだけでもアプリケーションは作ることができます。
Server ComponentsはClient Componentsと比較して、以下のようなメリットが存在します。
- パフォーマンスが高い
- Googleのクローラーが認識できる
- SEOの向上につながる
パフォーマンスについては、先ほど解説したとおりで、ユーザの環境に依存しない画面表示ができるためです。
一般的にClient Componentsで構成されるアプリケーションをSPA(シングルページアプリケーション)と呼びます。
SPAはリアルタイムな更新が可能であったりUI(ユーザインターフェース)的に優れているのですが、Googleのクローラーからは正確に認識されづらいというデメリットがあります。
Googleのクローラーに正確に認識されることによって、Googleなどの検索エンジンの検索結果で上位に表示されるようになります。
しかし、Googleのクローラーはせっかちなところがあるので、HTML、CSSの組み立てまでは待ってくれますが、JavaScriptで取得したデータを展開させるところまでは待ってくれません。
そのため、Googleのクローラーはデータが入っていないHTMLをそのWebページのコンテンツとして認識するので、コンテンツが充実していないと判断し、検索結果で上位表示をしないようになります。
Server Componentsを使うことによって、これを避けることができます。
Next.js12以前にもNext.js13のServer Componentsのような仕組みはあります。
しかし、Server Componentsより柔軟性に欠けています。
上記のようにNext.js12以前は、ページ単位でのみサーバの処理を設定することができました。
そのため、ページ内の一部のみでリアルタイムな情報を反映させたいが、その他のページ全体はその必要性がないといったケースでも全体をSSR(Dynamic Rendering)させるしかなかったのです。
例えばですが、以下のようなケースです。
パフォーマンスで見るとSSGの方が優れているのですが、このようなケースでかつSEOを考慮したい場合は、SSRで対応するしかありません。
Next.js13のServer Componentsはコンポーネント単位でサーバの処理を設定することができるため、上記のようなケースに対応することができます。
今回は、App Routerを使う上で前提知識として求められる「Server Components」と「Client Components」について解説しました。