PHPエンジニアのための Next.js 入門以前

以前 PHP エンジニア向けに、Next.js(>=13) を初めて学ぶ際、理解の助けとなることを意識しながら説明した内容をまとめました。

Next.js への理解

Next.js は、Node.js 上に構築されたオープンソースの Web アプリケーションフレームワークであり、サーバーサイドスクリプトや静的 Web サイトの生成などの、React ベースの Web アプリケーション機能を有効にする。

Wikipedia より引用

以下では、上記内容をより細分化して解説していきます。


「Node.js」とは

JavaScript の実行環境には大きく分けて以下の 2 種類があります。

  1. クライアントサイド

    • 実行環境: Web ブラウザ
    • Web ブラウザに組み込まれた JavaScript エンジン(例: Chrome の V8 エンジン)で実行される
    • 例: 動的な HTML 要素の変更、Ajax 通信など
  2. サーバーサイド

    • 実行環境: サーバー(またはローカル PC)
    • Node.js などの JavaScript ランタイムによって実行される
    • 例: API の処理、静的ファイルの生成など

Node.js は、この「サーバーサイド JavaScript の実行環境」を提供するツールです。Web ブラウザの外で JavaScript を動かすことが可能になり、PHP や Python のように、サーバーサイドでのスクリプト実行やファイル操作、データベース接続が行えます。


「Web アプリケーションフレームワーク」とは

Web アプリケーションを効率的に開発するために、あらかじめ一般的な機能(ルーティング、データベース操作、テンプレートエンジンなど)を備えた開発ツールを指します。
Next.js は、React を基盤としつつ、サーバーサイドレンダリング(SSR)や静的サイト生成(SSG)といった、React 単体では提供されない高度な機能を追加したフレームワークです。


「React ベースの Web アプリケーション機能」とは

React は SPA(Single Page Application)を効率的に開発するための JavaScript ライブラリです。
以下のポイントが重要です:

  1. SPA の特性
    React は、ページ遷移なしでページコンテンツの動的な書き換えが可能です。しかし、React 単体では URL ごとのページレンダリング(ルーティング)機能がないため、React Router などの補助ライブラリが必要です。

  2. React の構文
    React は JavaScript の拡張構文(JSX)を用いるため、そのままではブラウザで実行できません。Webpack や Babel を用いて、ブラウザが解釈可能な JavaScript コードに「コンパイル」されます。

  3. 効率化の目的
    React は「JavaScript で可能なこと」を効率化するためのツールであり、特別な新しい機能を提供するものではありません。


「サーバーサイドスクリプトや静的 Web サイトの生成」とは

Next.js は、React に以下の追加機能を提供します。

  1. サーバーサイドスクリプト(SSR: Server-Side Rendering)
    ページの HTML をリクエストごとにサーバーで生成します。PHP のように、サーバー上で処理を実行し、結果をクライアントに送信する仕組みです。

  2. 静的 Web サイトの生成(SSG: Static Site Generation)
    ビルド時に HTML ファイルを事前に生成し、リクエスト時にはそれを直接返します。これにより、読み込み速度が向上し、サーバー負荷も軽減されます。


Next.js 上のコードはどのように利用されるのか

Next.js プロジェクトのディレクトリ構成は以下の通りです:

  • app: App Router を使用する場合のコンポーネントとルート
  • pages: Pages Router を使用する場合のルート
  • public: 静的アセット(画像や CSS)を配置
  • src: (任意)ソースコードを配置

Next.js では、開発者が記述した React コードはそのまま実行されるのではなく、ビルドプロセスを経て、以下のように変換されます。

  1. クライアントサイド

    • コンパイル後のコードは.next/static配下に配置され、ブラウザで実行されます。これには CSS や JavaScript ファイルが含まれます。
  2. サーバーサイド

    • サーバー側の処理は.next/server配下に配置され、Node.js で実行されます。例えば、SSR の場合、リクエストを受けて HTML を生成する処理が行われます。

Next.jsのコンパイル後のフォルダ構造には、Laravelのpublicディレクトリやサーバーサイド処理が格納されたappディレクトリといった要素に類似する部分があります。ただし、Laravelがインタプリタ型のPHPで動作するのに対し、Next.jsは事前ビルド型であり、開発時の構造と運用時の構造が異なるという特徴があります。この点で、Next.jsはPHPフレームワークをそのままNode.jsに置き換えたものではなく、クライアントサイドとサーバーサイドを統合する特有の設計を持ったフレームワークです。


Next.js の特徴

Next.js は、クライアントサイド(React)とサーバーサイド(Node.js)を統合的に扱えるフレームワークです。この統合性により、React 構文を用いて効率的に Web アプリケーションを構築できる点が最大の特徴です。

特に、以下の点で他のフレームワークやライブラリと一線を画します:

  1. クライアントサイドとサーバーサイドの統合

    • Laravel などの PHP フレームワークとは異なり、同じコードベースでクライアントサイドとサーバーサイドを管理可能です。
  2. 柔軟なレンダリング方式

    • 静的生成(SSG)、サーバーサイドレンダリング(SSR)、クライアントサイドレンダリング(CSR)を用途に応じて選択できます。
  3. React を拡張した効率的な開発環境

    • ルーティング、データフェッチング、ビルドプロセスなど、React 単体では不足している機能を補完しています。

以上の点から、Next.js は「React を基盤にサーバーサイドの処理を統合した高機能フレームワーク」として位置づけられます。