Next.jsで始める環境構築の基本

はじめに

Next.jsは、Reactをベースにしたフレームワークです。 ただ単にページを表示するだけでなく、サーバーサイドレンダリングや静的サイト生成にも対応しています。

プログラミングの経験がない場合や、React自体をまだ触ったことがない皆さんにとっては、どうやって環境を整えるのかが最初のハードルになりがちです。 実は必要な手順そのものはそれほど複雑ではありません。

ここでは、環境構築に必要なステップを一つひとつ解説していきます。 あわせて、エラーが起きたときの対処法や実務的な活用シーンについても触れていきます。

これからNext.jsに触れてみようと考えている方や、Reactでの開発に不安を感じている方にも役立つ内容になっています。 どうぞ最後までご覧ください。

この記事を読むとわかること

  • Next.jsの基本的な仕組みとReactとの関係
  • 開発環境を整えるための具体的な手順
  • サーバーサイドレンダリングや静的サイト生成を活用するメリット
  • 実務での利用シーンや、よくあるトラブルへの対処方法

Next.jsとは何か

Next.jsは、Reactをベースにしたフレームワークの一つです。 Reactだけでは実現しにくいサーバーサイドレンダリング(SSR)や、ビルド時に静的サイトを生成する(SSG)機能を手軽に使えるようにしています。

Reactだけを使ってアプリケーションを作る場合、クライアントサイドでDOMを生成する形になります。 一方でNext.jsでは、サーバー側でHTMLを生成し、レスポンスとして返すことも可能です。 この仕組みによって、ページ表示までの速度やSEOの改善に役立つケースが増えます。

さらに、静的サイト生成を使えば、ビルド時にあらかじめHTMLを用意することもできます。 これにより、表示速度の向上やサーバー負荷の軽減を期待しやすくなります。 まとめると、Next.jsはReactの利点をそのまま活かしつつ、SSRやSSGを簡単に導入できるよう設計されているのが特徴です。

Reactのプロジェクトとの違い

Next.jsはReactを内部的に活用しますが、プロジェクト構成が少し異なります。 通常のReactアプリでは、create-react-appを利用してプロジェクトを初期化するのが一般的です。

Next.jsでは、create-next-appという公式のCLIツールを使用します。 また、ディレクトリ構造もReactとは異なり、pagesディレクトリ内に各ページを配置するだけでルーティングが行われるのが特徴です。

この仕組みのおかげで、ルーティング設定に関してはReact Routerを明示的に追加する必要がなく、簡単な構成で始めることができます。 一方で、ユニークなディレクトリ構成に合わせたファイルの配置が必要なので、最初は少し戸惑うかもしれませんね。

なぜNext.jsが注目されているのか

Next.jsが注目される理由の一つは、SSRやSSGなどのレンダリング手法を柔軟に選べることです。 データ取得が必要なページではSSRを使い、更新頻度が低いコンテンツにはSSGを使う、というように必要に応じて方式を切り替えることができます。

これにより、パフォーマンス面やSEO対策にメリットがあり、実際の業務プロジェクトでも取り入れられる例が増えています。 また、Reactをベースとしているため、既にReactに慣れている方であれば学習コストを抑えられるのも魅力の一つでしょう。

加えて、比較的シンプルな構成でスタートできる点も魅力です。 初期段階で必要な設定やプラグインが少なく、エラーが起こったときも公式ドキュメントなどを参考に解決しやすくなっています。

Next.jsの環境構築に必要なもの

Next.jsのプロジェクトを作成するためには、Node.jsnpmもしくはYarnがあれば十分です。 環境変数設定やバージョン管理、テストなどの追加ツールは後からでも導入可能なので、まずは最低限の環境を整えましょう。

Node.jsは、JavaScriptの実行環境です。 Windowsの方はインストーラーを使って手軽に導入できますし、MacやLinuxの方はターミナルからパッケージマネージャを使ってインストールする方法が多いでしょう。

インストールが完了したら、ターミナルで次のコマンドを実行してバージョン確認をしておきます。 バージョンのチェックは、今後のトラブルシュートにも役立つことがあるので覚えておくと安心です。

node -v
npm -v

バージョンが表示されればインストールは完了しています。 Yarnを使う場合はyarn -vで確認できます。

Node.jsのバージョンは複数のプロジェクトを並行して扱うときに問題になる場合があります。 そのようなときは、nvmなどのバージョン管理ツールを利用すると切り替えが楽になります。

Next.jsプロジェクトの初期化手順

まずはプロジェクトのディレクトリを新しく用意しましょう。 その上で以下のようにcreate-next-appコマンドを使ってプロジェクトを作成します。

npx create-next-app nextjs-sample

上の例では、nextjs-sampleという名前のディレクトリが作成され、その中にNext.jsの基本的な構成ファイルが配置されます。 続いて、そのディレクトリに移動して依存関係をインストールしてください。

cd nextjs-sample
npm install

もしYarnを使う場合は、npm installの代わりにyarnを実行すると依存関係がインストールされます。 インストールが完了したら、次のコマンドで開発サーバーを起動してみましょう。

npm run dev

実行後に表示されるURLをブラウザで開くと、デフォルトのNext.jsウェルカムページが表示されるはずです。 これでNext.jsのプロジェクトが正常に動くことが確認できます。

ディレクトリ構造と基本的なファイル

Next.jsの標準的なディレクトリ構造は、Reactに慣れている方でも初めて見るとやや新鮮に感じるかもしれません。 基本的には、pagesディレクトリがルーティングの中心となります。

下記のような構造になっているのを一度確認してみてください。

nextjs-sample/
├─ pages/
│   ├─ api/
│   │   └─ hello.js
│   └─ index.js
├─ public/
├─ styles/
├─ .gitignore
├─ package.json
├─ README.md
└─ next.config.js

pagesディレクトリの中にindex.jsがあれば、それがルートパス("/")として扱われます。 apiディレクトリの中はAPIエンドポイントを定義する場所です。 APIはフロントエンドと同じプロジェクト内で定義できるので、小規模な開発から始める場合にも便利です。

ページの追加例

新しいページを追加したい場合は、pagesディレクトリ直下に対応するファイルを作るだけです。 例えば、about.jsというファイルを作ると、URLのパスとしては/aboutが自動的に割り当てられます。

// pages/about.js
export default function AboutPage() {
  return (
    <div>
      <h2>このサイトについて</h2>
      <p>ここにサイトの概要を自由に書いてみましょう。</p>
    </div>
  );
}

ブラウザでhttp://localhost:3000/aboutにアクセスすると、このコンポーネントが表示されるはずです。 React Routerなどを別途用意しなくても、ディレクトリやファイルの構成だけでルーティングが完結するのがNext.jsの魅力です。

サーバーサイドレンダリング(SSR)とは

Next.jsの大きな特徴の一つが、SSR(サーバーサイドレンダリング)を簡単に導入できることです。 通常のReactアプリはクライアントサイドでJavaScriptを実行し、ブラウザでレンダリングを行います。

一方、SSRではサーバーがHTMLを組み立ててレスポンスとして返すため、ブラウザに送信される時点で基本的なHTML構造が出来上がっています。 これにより、最初の表示速度の向上や検索エンジンへのクローラビリティが向上することが期待できます。

たとえば、getServerSidePropsという関数をページコンポーネントで定義すれば、リクエストがあるたびにサーバーサイドでデータを取得してページを生成できます。 この関数が返した値は、ページコンポーネントのpropsとして受け取れます。

// pages/server-side-example.js
export async function getServerSideProps() {
  const data = { message: "サーバーサイドで取得したデータです" };
  return { props: { data } };
}

export default function ServerSideExample({ data }) {
  return (
    <div>
      <h2>SSRのサンプルページ</h2>
      <p>{data.message}</p>
    </div>
  );
}

上記の例では、リクエストが来るたびにgetServerSidePropsが実行され、その結果がサーバーからHTMLに埋め込まれた状態で返されます。 SSRを使うときは、頻繁に変化するデータをリアルタイムで扱いたい場合や、ログインの判定をサーバーサイドで行いたいときなどに向いています。

クライアントサイドレンダリング(CSR)との比較

CSR(クライアントサイドレンダリング)は、ReactやVueなどでおなじみの方法です。 ページ表示時には最小限のHTMLとJavaScriptを受け取り、ブラウザ側で動的にページを構築します。

この方式はページ遷移が高速で、ユーザーの操作に応じて素早くUIを更新しやすい利点があります。 しかし、初回の読み込みにはJavaScriptのダウンロードと実行が必要なので、表示までに若干のタイムラグが生じることもあります。

Next.jsの場合は、SSRとCSRを併用することが可能です。 基本的にSSRで表示したページも、その後はクライアントサイドでの再レンダリングが行われるため、ReactらしいインタラクティブなUIを保ったままSEOにも配慮できる点が大きな強みです。

静的サイト生成(SSG)と運用の効率化

Next.jsでは、ビルド時にHTMLを生成してしまう 静的サイト生成 (SSG)も利用できます。 getStaticPropsという関数を使えば、ビルド時にデータを取得して静的ファイルとして出力してくれます。

頻繁に内容が変わらないページや、検索エンジン向けに迅速に表示できるページを作りたいときにSSGは便利です。 APIからのデータを定期的に更新するような運用シーンでも、ビルドを走らせるだけで最新の情報を静的ファイルとして用意できます。

例えば、特定の商品の情報ページなどが該当するでしょう。 これによって、サーバー側の負荷を軽減できるというメリットも得やすくなります。

SSRとSSGの使い分け

同じプロジェクト内でSSRとSSGを混在させる例も珍しくありません。 リアルタイム性が必要な箇所はSSRで、それ以外の部分はSSGでビルド時に作り込む、というアプローチです。

実際の業務でも、トップページやブログ記事などはSSGを使い、新着情報やダッシュボード的な画面はSSRを使う、ということが考えられます。 このように必要に応じてレンダリング方式を選べるのは、Next.jsの大きな利点です。

ISR(インクリメンタル静的再生成)

ISR(Incremental Static Regeneration)という仕組みを使うと、SSGで生成したページを一定の間隔で自動再生成できます。 時間経過や更新トリガーに応じて最新の状態を配信できるため、ユーザーに常に更新後の情報を届けやすくなります。

こうした機能は、静的サイト生成による高速性と、動的コンテンツの柔軟性を両立させる上で便利です。 ユーザーは最新のコンテンツを得られながら、サーバーの負荷もそこまで高くならないので、使いどころは幅広いでしょう。

TypeScriptの導入

JavaScriptよりも堅牢にコードを書きたい場合は、TypeScriptを導入する選択肢もあります。 Next.jsではTypeScriptを使うための設定が比較的スムーズです。

create-next-appを実行するときに、オプションでTypeScript対応のプロジェクトを作成できます。 もしくは、JavaScriptプロジェクトで始めて後からTypeScriptを導入することも可能です。

TypeScriptを使うと型エラーや不適切な変数の受け渡しが早期に検出されるため、大きめのプロジェクトでは保守性の向上が期待できるでしょう。 一方で、初学者にとっては最初はやや難しく感じるかもしれません。

環境変数の設定とセキュリティのポイント

プロジェクトの中でAPIキーや認証情報などを使う場合は、環境変数を管理することになります。 Next.jsでは、ルート直下に配置した.envファイルを利用するのが一般的です。

# .env
API_KEY=example123

このように.envファイルで定義しておき、クライアントに露出させるかどうかも含めて慎重に設計しましょう。 環境変数は漏れないように.gitignoreで管理から外すのが通常です。

ただし、サーバーサイドとクライアントサイドでの扱いには注意が必要です。 クライアントには機密情報を渡さない設計にするなど、セキュリティ面を意識してプロジェクトを進めることが大切です。

実務での活用シーン

Next.jsは、初期表示を早くしたいWebサービスや、SEO効果を高めたいオウンドメディアなどで活躍します。 たとえば、ユーザーが最初にアクセスするトップページをSSRで作り込み、表示速度を重視する手法が挙げられます。

また、ECサイトのように商品一覧や詳細を表示する部分については、SSGやISRで実装し、アクセス集中時でも安定して表示できる構成にするケースがあります。 これによって、サーバーコストを抑えながら高速な体験を提供しやすくなるのです。

バックエンドとフロントエンドを同じリポジトリ内で完結できる点も、開発効率を上げるのに役立ちます。 ページとAPIのコードが近い場所にあるので、管理がしやすく、ビルドやデプロイの工程もシンプルになりやすいです。

よくあるエラーやトラブルシューティング

環境構築直後や初期の開発段階では、いくつかエラーやトラブルが発生する場合があります。 ここでは、代表的なものと対処方法を簡単に整理してみます。

npm installが失敗する場合

Node.jsやnpmのバージョンが古い、あるいはネットワーク状況が悪いと、npm installyarnが失敗することがあります。 そのような時は、まずはNode.js自体のバージョン確認をしてみると良いでしょう。

Windowsでセキュリティソフトが有効になっていると、ネットワーク経由のインストールがブロックされるケースもあります。 インストールが何度も失敗する場合は、ファイアウォールなどの設定もチェックしてください。

Node.jsのバージョンを切り替える必要がある

複数のプロジェクトを並行して進めているときに、Node.jsのバージョンが原因でエラーが起きることがあります。 nvmなどのバージョン管理ツールを使えば、プロジェクトごとに異なるバージョンを切り替えられるので便利です。

Windows特有のパス問題

Windowsでは、ファイルパスの長さやフォルダ構成によってはエラーが発生することもあります。 できるだけ階層を浅くする、フォルダ名に特殊文字を使わないといった基本的な対策を確認してみましょう。

ESLintやPrettierの警告

Next.jsを初期化したときに、ESLintやPrettierが有効になっている場合があります。 自動整形やコードスタイルのチェックに慣れていないと、警告メッセージが多く表示されることがあるかもしれません。

しかし、コードの品質向上のためにも、どういったチェックを行っているのかを理解して慣れていくのがおすすめです。 不要な規則がある場合は、.eslintrc.prettierrcを編集してカスタマイズできます。

デプロイについて

ローカルで開発が進んだら、デプロイをして外部からアクセスできるようにしたい場面が出てくるでしょう。 Next.jsは静的ファイルを生成してデプロイする方法や、SSRを含めた状態でデプロイする方法があります。

たとえば、VercelやNetlify、AWSなどのホスティングサービスを利用するのが代表的です。 SSRを有効にしたNext.jsをデプロイするときは、Node.js環境のあるサーバーが必要なので、サービスの対応状況を確認して選ぶようにしましょう。

まとめ

ここまで、Next.jsの基本的な仕組みや環境構築の流れについて解説してきました。 ポイントは、Reactとの違いを踏まえつつ、SSRやSSGを活用できる点が魅力ということです。

環境構築自体はcreate-next-appを使えばさほど難しくありません。 あとは、実際にページを追加してみたり、SSRやSSGのコードを書いてみたりすると、Next.jsの柔軟さや便利さが体感できるでしょう。

それぞれのレンダリング手法をどう使い分けるかは、作りたいアプリの性質や運用スタイル次第です。 ぜひ本記事を参考に、皆さんのプロジェクトに合った方法を見つけてみてください。

Next.jsをマスターしよう

この記事で学んだNext.jsの知識をさらに伸ばしませんか?
Udemyには、現場ですぐ使えるスキルを身につけられる実践的な講座が揃っています。