Reactでアプリを作りたいけど、React+ViteとNext.jsのどちらを選べばいいかわからない。そんな初心者エンジニアのために、それぞれの特徴と違いを図解と具体例でわかりやすく解説します。
🤔 こんな疑問を解決します:
- React+ViteとNext.jsって何が違うの?
- SPAとSSRって結局何?
- 私のプロジェクトにはどちらが合ってる?
- Next.jsの`use client`って何?
目次
そもそもReact+ViteとNext.jsって何が違うの?
まず、React+ViteとNext.jsの基本的な位置づけを理解しましょう。
React+Viteとは
- React:ユーザーインターフェース(UI)を作るためのライブラリ
- Vite:Reactアプリを開発・ビルドするためのツール
- 組み合わせ:React + Vite = 高速な開発環境でReactアプリを作る
Next.jsとは
- React フレームワーク:Reactをベースに機能を追加したもの
- オールインワン:ルーティング、API、SEO対策などが最初から含まれている
- 本格的:企業サイトや商用サービスに必要な機能が豊富
簡単な例え話
| 比較対象 | React + Vite | Next.js |
|---|---|---|
| 料理に例えると | 素材(React)+ 調理器具(Vite) | 完成されたレシピ本(全部入り) |
| 自由度 | 自分で好きに調理できる | 決まった手順で美味しく作れる |
| 難易度 | 料理スキルが必要 | レシピ通りにすればOK |
| 結果 | 自分好みの料理 | 安定して美味しい料理 |
SPAとSSRの基本的な仕組みを図解で理解しよう
React+ViteとNext.jsの最大の違いは、SPAとSSRというWebページの作り方の違いです。
SPA(Single Page Application)の仕組み
React+Viteの標準的な動作
- ユーザーがサイトにアクセス
- サーバーが空っぽのHTMLを送信(中身はほぼ``だけ)
- ブラウザがJavaScriptをダウンロード
- JavaScriptが実行されてページが表示
<!-- SPAで最初に送られるHTML(React+Vite) -->
<!DOCTYPE html>
<html>
<head>
<title>My App</title>
</head>
<body>
<div id="root"></div> <!-- 空っぽ! -->
<script src="/main.js"></script>
</body>
</html>
SSR(Server-Side Rendering)の仕組み
Next.jsの標準的な動作
- ユーザーがサイトにアクセス
- サーバーでReactアプリを実行
- 完成したHTMLをユーザーに送信
- ブラウザが即座にページを表示
- JavaScriptが読み込まれて操作可能になる(ハイドレーション)
<!-- SSRで最初に送られるHTML(Next.js) -->
<!DOCTYPE html>
<html>
<head>
<title>My App</title>
</head>
<body>
<div id="__next">
<h1>ようこそ!</h1>
<p>すでに内容が入ってる!</p>
<!-- たくさんのHTMLコンテンツ -->
</div>
<script src="/_next/static/chunks/main.js"></script>
</body>
</html>
わかりやすい比較表
| 項目 | SPA(React+Vite) | SSR(Next.js) |
|---|---|---|
| 最初の表示速度 | ⏳ 少し遅い(JSが読み込まれるまで白画面) | ⚡ 速い(すぐにHTMLが表示される) |
| SEO(検索エンジン対策) | ❌ やや不利(最初はHTMLが空) | ✅ 有利(検索エンジンがHTMLを読める) |
| サーバー負荷 | ✅ 軽い(静的ファイルを配信するだけ) | ⚠️ 重い(毎回HTMLを生成) |
| ページ遷移 | ✅ 高速(JavaScriptで画面切り替え) | ✅ 高速(同様にJavaScriptで処理) |
実際に触って感じる開発体験の違い
プロジェクト作成から開発までの体験を比較してみましょう。
プロジェクト作成の手順
# React + Vite でプロジェクト作成
npm create vite@latest my-react-app -- --template react
cd my-react-app
npm install
npm run dev # http://localhost:5173
# Next.js でプロジェクト作成
npx create-next-app@latest my-nextjs-app
cd my-nextjs-app
npm run dev # http://localhost:3000
開発サーバーの起動速度
| ツール | 起動時間 | ホットリロード | 感想 |
|---|---|---|---|
| Vite | 0.5秒 | ⚡ 超高速 | 「速すぎて気持ちいい!」 |
| Next.js | 2-3秒 | ✅ 高速 | 「十分速いけど、Viteには負ける」 |
ページ作成の違い
// React + Vite: 自分でルーティングを設定
// src/App.jsx
import { BrowserRouter, Routes, Route } from 'react-router-dom'
import Home from './pages/Home'
import About from './pages/About'
function App() {
return (
<BrowserRouter>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
</Routes>
</BrowserRouter>
)
}
// Next.js: ファイルを置くだけで自動的にページができる
// pages/index.js → https://example.com/
export default function Home() {
return <h1>ホームページ</h1>
}
// pages/about.js → https://example.com/about
export default function About() {
return <h1>アバウトページ</h1>
}
パフォーマンスとSEOの違いを具体例で比較
実際のWebサイトでどのような違いが現れるか見てみましょう。
JavaScriptを無効にした時の表示テスト
| 状況 | React+Vite(SPA) | Next.js(SSR) |
|---|---|---|
| JavaScript有効 | ✅ 正常に表示 | ✅ 正常に表示 |
| JavaScript無効 | ❌ 真っ白な画面 | ✅ コンテンツは表示される |
| 読み込み中 | ⏳ 白画面 → 突然表示 | ⚡ すぐに表示 → 操作可能 |
SEO(検索エンジン最適化)の影響
<!-- Googleのクローラーが見るもの -->
<!-- React+Vite の場合 -->
<div id="root"></div>
<!-- クローラー:「何も内容がない...」 -->
<!-- Next.js の場合 -->
<div>
<h1>美味しいラーメン店の紹介</h1>
<p>東京で一番美味しいラーメンを紹介します...</p>
</div>
<!-- クローラー:「お、良いコンテンツだ!検索結果に表示しよう」 -->
実際のパフォーマンス指標
| 指標 | React+Vite | Next.js | 説明 |
|---|---|---|---|
| FCP(First Contentful Paint) | 1.5-3秒 | 0.5-1秒 | 最初にコンテンツが表示されるまで |
| LCP(Largest Contentful Paint) | 2-4秒 | 1-2秒 | メインコンテンツが表示されるまで |
| TTI(Time to Interactive) | 2-4秒 | 1.5-3秒 | 操作可能になるまで |
Next.jsの`use client`でSPA的に作る時の注意点
Next.js 13以降では、use clientディレクティブを使ってSPA的な作り方もできますが、注意点があります。
Next.jsの新しい仕組み(App Router)
// Next.js 13+ App Router
// app/page.js - デフォルトはサーバーコンポーネント
export default function HomePage() {
// ❌ useState や onClick は使えない(サーバーで実行されるため)
return <h1>これはサーバーで生成されます</h1>
}
// app/client-page.js - クライアントコンポーネント
'use client' // これを付けると...
import { useState } from 'react'
export default function ClientPage() {
// ✅ useState や onClick が使える(ブラウザで実行される)
const [count, setCount] = useState(0)
return (
<div>
<p>カウント: {count}</p>
<button onClick={() => setCount(count + 1)}>
クリック
</button>
</div>
)
}
注意点とデメリット
| 注意点 | 説明 | 対策 |
|---|---|---|
| 過度な`use client` | 全部クライアントにするとNext.jsの利点が消える | 本当に必要な部分だけ使用 |
| バンドルサイズ増加 | クライアントコンポーネントはJSバンドルに含まれる | サーバーコンポーネントと適切に使い分け |
| 初期表示の遅延 | クライアントコンポーネントは最初空で表示される | ローディング状態を適切に処理 |
| 複雑性の増加 | サーバーとクライアントの境界を意識する必要 | シンプルな構成から始める |
適切な使い分けの例
// ✅ 良い例:必要最小限でクライアントコンポーネントを使用
// app/page.js
import ClientCounter from './ClientCounter'
export default function HomePage() {
return (
<div>
<h1>私のブログ</h1> {/* サーバーで生成 */}
<p>最新の記事一覧</p> {/* サーバーで生成 */}
{/* インタラクティブな部分だけクライアント */}
<ClientCounter />
</div>
)
}
// app/ClientCounter.js
'use client'
import { useState } from 'react'
export default function ClientCounter() {
const [count, setCount] = useState(0)
return <button onClick={() => setCount(count + 1)}>{count}</button>
}
あなたのプロジェクトにはどちらが最適?選択指針
プロジェクトの特徴に応じて、最適な選択肢を見つけましょう。
React+Viteを選ぶべきプロジェクト
- 管理画面・ダッシュボード:ログイン後に使う内部ツール
- プロトタイプ・MVP:とにかく早く作りたい
- 学習目的:Reactの基本を理解したい
- 小〜中規模アプリ:複雑な機能が不要
- 開発速度重視:Viteの高速開発を活かしたい
Next.jsを選ぶべきプロジェクト
- 企業サイト・ブログ:SEO対策が重要
- ECサイト:検索エンジンからの集客が必要
- ニュースサイト:初回表示速度が重要
- 大規模アプリ:長期的な保守性が必要
- フルスタック開発:API も一緒に作りたい
判断フローチャート
🤔 あなたのプロジェクトはどっち?
1. SEO対策は必要?
YES → Next.js寄り
NO → どちらでもOK
2. 初回表示速度は重要?
YES → Next.js寄り
NO → どちらでもOK
3. 開発速度を最優先したい?
YES → React+Vite寄り
NO → どちらでもOK
4. Reactの学習が目的?
YES → React+Vite推奨
NO → Next.js推奨
5. 将来的にAPI機能も追加したい?
YES → Next.js推奨
NO → React+Vite推奨
実際のコード例で理解する使い分け
同じ機能を実装する場合の具体的なコード例を比較してみましょう。
シンプルなブログ一覧の実装
// React + Vite の場合
// src/components/BlogList.jsx
import { useState, useEffect } from 'react'
function BlogList() {
const [posts, setPosts] = useState([])
const [loading, setLoading] = useState(true)
useEffect(() => {
// クライアントサイドでAPI呼び出し
fetch('/api/posts')
.then(res => res.json())
.then(data => {
setPosts(data)
setLoading(false)
})
}, [])
if (loading) return <div>読み込み中...</div>
return (
<div>
{posts.map(post => (
<article key={post.id}>
<h2>{post.title}</h2>
<p>{post.excerpt}</p>
</article>
))}
</div>
)
}
// Next.js の場合
// pages/blog.js (または app/blog/page.js)
// サーバーサイドでデータ取得
export async function getServerSideProps() {
const posts = await fetch('https://api.example.com/posts').then(r => r.json())
return {
props: { posts }
}
}
function BlogPage({ posts }) {
// データは既に取得済み、すぐに表示
return (
<div>
{posts.map(post => (
<article key={post.id}>
<h2>{post.title}</h2>
<p>{post.excerpt}</p>
</article>
))}
</div>
)
}
export default BlogPage
実装の違いと影響
| 項目 | React+Vite | Next.js |
|---|---|---|
| 初回表示 | 「読み込み中…」→ 記事一覧 | すぐに記事一覧表示 |
| SEO | 検索エンジンには空っぽに見える | 検索エンジンが記事内容を認識 |
| コード量 | useEffect、ローディング状態の管理 | シンプル(サーバーで処理済み) |
| サーバー負荷 | 軽い(静的ファイル配信のみ) | 重い(毎回API呼び出し+HTML生成) |
どちらも学ぶべき?
- 初心者の場合:React+Viteから始めて、Reactの基本を理解
- 基本理解後:Next.jsでSSRやSEOについて学習
- 実際の開発:プロジェクトの要件に応じて選択
- キャリア的には:両方できると市場価値が高い
まとめ:React+ViteとNext.jsの正しい選び方
React+ViteとNext.jsの違いが理解できたでしょうか?最後に重要なポイントをまとめます。
🎯 重要なポイント
- React+Vite = 高速開発 + SPA + 自由度高
- Next.js = SEO対策 + SSR + 機能豊富
- どちらも正解:プロジェクトの要件次第
- 学習順序:React+Vite → Next.js がおすすめ
迷った時のシンプルな判断基準
| 質問 | YES | NO |
|---|---|---|
| Google検索からの流入が重要? | Next.js | React+Vite |
| 初回表示速度が重要? | Next.js | React+Vite |
| とにかく早く作りたい? | React+Vite | Next.js |
| Reactの学習が目的? | React+Vite | Next.js |
次のステップ
- まずは試してみる:両方とも5分でプロジェクト作成可能
- 小さなアプリを作る:Todo アプリなど簡単なものから
- 違いを体感する:実際に触って理解を深める
- プロジェクトに応用:学んだ知識を実際の開発に活用
重要なリンク集
React+ViteとNext.jsは、どちらもモダンなWeb開発には欠かせないツールです。プロジェクトの要件を理解し、適切な選択をすることで、効率的で高品質なアプリケーションを開発できるようになります。まずは両方試してみて、違いを体感してみてください!

