1. はじめに
この記事で分かること
この記事では、ReactとNext.jsの違いについて初学者向けに解説します。具体的には以下の内容を学べます。
- ReactとNext.jsそれぞれの基本的な特徴
- 両者の技術的な違い
- プロジェクトに応じた使い分けの判断基準
- 簡単なコード例での比較
想定する読者
- HTML、CSS、JavaScriptの基礎知識がある方
- Reactを学び始めた、またはこれから学ぼうとしている方
- Next.jsという名前を聞いたことがあるが、違いが分からない方
2. Reactとは?
Reactの基本概念
ReactはMeta(旧Facebook)が開発したJavaScriptライブラリです。ユーザーインターフェース(UI)を構築するために使用され、特にシングルページアプリケーション(SPA:Single Page Application)の開発に適しています。
Reactはライブラリであり、UI構築に特化したツールという位置づけですね。フレームワークとは異なり、必要最小限の機能を提供し、他の部分は開発者が自由に選択できます。
Reactでできること
- インタラクティブなUIの構築
- 再利用可能なコンポーネントの作成
- 効率的な画面の更新と描画
- データの変化に応じた自動的なUI更新
Reactの特徴
コンポーネントベース
Reactではアプリケーションを小さな部品(コンポーネント)に分割して開発します。各コンポーネントは独立しており、再利用や保守が容易になります。
仮想DOM(Virtual DOM)
Reactは仮想DOMという仕組みを使用して、効率的に画面を更新します。実際のDOMを直接操作するのではなく、まず仮想的なDOM上で変更を計算し、必要な部分だけを実際のDOMに反映させます。これにより高速なUI更新が実現できます。
3. Next.jsとは?
Next.jsの基本概念
Next.jsはVercel社が開発したReactベースのフレームワークです。Reactの機能をベースに、本格的なWebアプリケーション開発に必要な機能を追加で提供しています。
ReactとNext.jsの関係性
Next.jsはReactの上に構築されているため、ReactなしではNext.jsは動作しません。つまり、Next.jsを使う場合も、Reactの知識が必要になります。
Next.jsが生まれた背景
Reactだけでアプリケーションを構築する場合、以下のような課題がありました。
- ルーティング機能を自分で実装または追加する必要がある
- SEO対策が難しい(クライアントサイドレンダリングのため)
- 初期表示が遅くなりがち
- ビルド設定やパフォーマンス最適化を自分で行う必要がある
Next.jsはこれらの課題を解決するために開発されました。
4. ReactとNext.jsの主な違い
4.1 ルーティング機能
React
Reactには標準のルーティング機能がありません。複数ページを持つアプリケーションを作る場合、React Router などの外部ライブラリを追加する必要があります。
// React + React Routerの例
import { BrowserRouter, Routes, Route } from 'react-router-dom';
function App() {
return (
<BrowserRouter>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
</Routes>
</BrowserRouter>
);
}
Next.js
Next.jsにはファイルベースのルーティングが組み込まれています。pagesディレクトリ(またはappディレクトリ)にファイルを配置するだけで、自動的にルートが生成されます。
pages/
├── index.js → /
├── about.js → /about
└── blog/
└── [id].js → /blog/:id
4.2 レンダリング方式
これが最も重要な違いの一つです。
React: クライアントサイドレンダリング(CSR)
Reactはデフォルトでクライアントサイドレンダリング(CSR: Client-Side Rendering)を使用します。
CSRでは、最初にほぼ空のHTMLが送られ、JavaScriptがブラウザ上で実行されて画面が描画されます。そのため、初期表示が遅くなりやすく、検索エンジンがコンテンツをクロールしにくいという課題があります。
Next.js: 複数のレンダリング方式
Next.jsでは用途に応じて以下のレンダリング方式を選択できます。
- SSR(Server-Side Rendering): リクエストごとにサーバーでHTMLを生成
- SSG(Static Site Generation): ビルド時に静的HTMLを生成
- ISR(Incremental Static Regeneration): 静的生成と動的更新の組み合わせ
- CSR: Reactと同じクライアントサイドレンダリング
4.3 開発環境のセットアップ
※現在はViteを使うことが推奨されます。
React
# Create React Appを使用
npx create-react-app my-app
cd my-app
npm start
基本的なReactアプリケーションが作成されますが、ルーティングやその他の機能は自分で追加する必要があります。
Next.js
# Next.jsプロジェクトを作成
npx create-next-app my-app
cd my-app
npm run dev
ルーティング、画像最適化、APIルートなど、多くの機能が最初から含まれています。
4.4 パフォーマンスとSEO
React
- 初期表示: JavaScriptの読み込みと実行が必要なため遅くなりがち
- SEO: 検索エンジンのクローラーがJavaScriptを実行しない場合、コンテンツを認識できない
- パフォーマンス最適化: 開発者が手動で設定
Next.js
- 初期表示: サーバーサイドレンダリングにより高速化が可能
- SEO: HTMLが最初から完成しているため、検索エンジンに優しい
- パフォーマンス最適化: 自動的なコード分割、画像最適化などが組み込まれている
4.5 画像最適化などの組み込み機能
React
画像最適化は手動で行うか、外部ライブラリを使用する必要があります。
<img src="/images/photo.jpg" alt="写真" />
Next.js
Imageコンポーネントを使用することで、自動的に画像を最適化できます。
import Image from 'next/image';
<Image
src="/images/photo.jpg"
alt="写真"
width={500}
height={300}
// 自動で最適化、遅延読み込みなどが適用される
/>
その他、Next.jsには以下のような機能が組み込まれています。
- APIルート(バックエンドAPIの構築)
- 環境変数の管理
- TypeScriptのサポート
- 国際化(i18n)のサポート
5. それぞれの使い分け
Reactを選ぶべきケース
以下のような場合はReactの使用を検討しましょう。
- SEOが重要ではないアプリケーション(ダッシュボード、管理画面など)
- 既存のバックエンドAPIと連携するフロントエンドのみを構築する場合
- シンプルなSPAを作りたい場合
- Reactの学習に集中したい場合
- 軽量で柔軟性の高い構成が必要な場合
Next.jsを選ぶべきケース
以下のような場合はNext.jsの使用を検討しましょう。
- SEOが重要なWebサイト(ブログ、ECサイト、コーポレートサイトなど)
- 初期表示速度が重要な場合
- 静的サイトと動的サイトの両方の機能が必要な場合
- フルスタックアプリケーションを構築したい場合
- パフォーマンス最適化を自動で行いたい場合
判断基準の整理
6. 簡単なコード例で比較
同じ機能を持つページをReactとNext.jsで作成してみましょう。
Reactでのページ作成
// App.js
import React, { useState, useEffect } from 'react';
function App() {
const [posts, setPosts] = useState([]);
const [loading, setLoading] = useState(true);
useEffect(() => {
// ブラウザ上でAPIを呼び出し
fetch('https://api.example.com/posts')
.then(res => res.json())
.then(data => {
setPosts(data);
setLoading(false);
});
}, []);
if (loading) return <div>読み込み中...</div>;
return (
<div>
<h1>ブログ記事一覧</h1>
<ul>
{posts.map(post => (
<li key={post.id}>
<h2>{post.title}</h2>
<p>{post.excerpt}</p>
</li>
))}
</ul>
</div>
);
}
export default App;
このコードでは、コンポーネントがマウントされた後にAPIを呼び出し、データを取得しています。ブラウザ上で実行されるため、初期表示時には「読み込み中...」が表示されます。
Next.jsでのページ作成
// pages/index.js
// サーバーサイドでデータを取得
export async function getServerSideProps() {
const res = await fetch('https://api.example.com/posts');
const posts = await res.json();
return {
props: { posts }
};
}
function Home({ posts }) {
return (
<div>
<h1>ブログ記事一覧</h1>
<ul>
{posts.map(post => (
<li key={post.id}>
<h2>{post.title}</h2>
<p>{post.excerpt}</p>
</li>
))}
</ul>
</div>
);
}
export default Home;
Next.jsでは、getServerSideProps関数を使用してサーバーサイドでデータを取得します。ページがブラウザに届く時点で、既にデータが含まれているため、「読み込み中...」の表示は不要です。
違いを実感する
上記の例から、以下の違いが分かります。
React
- データ取得がクライアントサイドで実行される
- 初期表示時にローディング状態が必要
- HTMLソースにはコンテンツが含まれない(SEOに不利)
Next.js
- データ取得がサーバーサイドで実行される
- 初期表示時に完成したコンテンツが表示される
- HTMLソースにコンテンツが含まれる(SEOに有利)
7. まとめ
重要なポイントの振り返り
ReactとNext.jsの関係性と違いをまとめると以下のようになります。
| 項目 | React | Next.js |
|---|---|---|
| 分類 | ライブラリ | フレームワーク |
| ルーティング | 外部ライブラリが必要 | 組み込み(ファイルベース) |
| レンダリング | CSRのみ | SSR、SSG、ISR、CSR |
| SEO | 対策が必要 | 標準で対応 |
| 初期表示 | 遅くなりがち | 高速化が可能 |
| 学習コスト | 低い | やや高い |
| 柔軟性 | 高い | 中程度 |
ReactとNext.jsは競合するものではなく、Next.jsはReactを拡張したフレームワークという関係性を理解しておきましょう。
次に学ぶべきこと
Reactを学ぶ場合
- コンポーネントの設計パターン
- Hooksの詳細な使い方
- 状態管理(Context API、Reduxなど)
- React Routerを使ったルーティング
Next.jsを学ぶ場合
- App RouterとPages Routerの違い
- データフェッチング戦略
- 動的ルーティングの実装
- APIルートの活用
- デプロイメント(Vercelなど)
どちらを選択する場合でも、まずReactの基礎をしっかり理解することが重要です。その上で、プロジェクトの要件に応じて適切なツールを選択していきましょう。