Next.js: 環境構築とプロジェクト構造
最終更新:2026-08-26
Next.js 16 の開発環境をセットアップすることは、新しい家を改装するようなものです。スキャフォールドが基礎を築き、残りの構造、レイアウト、設定は必要に応じて調整できます。
1. 学ぶこと
create-next-appスキャフォールドを使用してプロジェクトを作成するapp/、public/、next.config.jsなどのコアディレクトリとファイルを理解する- 開発サーバーを起動し、Turbopack の即時ホットアップデートを体験する
package.jsonのキースクリプトを分析する- VS Code の推奨開発拡張機能を設定する
2. フロントエンド初心者の実話
(1) ペインポイント: 開発環境のセットアップに3日かかる
Charlie は React を学んだばかりのフロントエンド初心者で、Next.js を試してみたいと考えています。彼は公式ドキュメントを開きますが、十数の設定オプションと3つの異なるスキャフォールドコマンドに直面し、どれを選べばよいかわかりません:
「
create-react-appなら、1つのコマンドで実行できます。でも Next.js は、src/ディレクトリが必要?TypeScript が必要?ESLint が必要?Tailwind が必要?これらの選択肢を調べるだけで2日かかりました。」
彼は以下の問題にも遭遇しました:
| 問題 | 症状 |
|---|---|
| 設定の選択に苦労 | 7つの選択肢 — どれを有効にすればよいかわからない |
| ディレクトリ構造がわからない | app/、public/、styles/ の役割が不明瞭 |
| ホットリロードが遅すぎる | Webpack では、保存するたびに1〜2秒待たなければならない |
| VS Code に支援がない | ヒントも自動補完もなく、メモ帳で書いているようだ |
(2) create-next-app の解決策
create-next-appインタラクティブスキャフォールドを使用して、ベストプラクティスのプロジェクト構造をワンクリックで生成します。
# インタラクティブコマンド。いくつかの簡単な質問に答えるだけです
npx create-next-app@latest taskflow --ts --tailwind --app --src-dir --import-alias "@/*"
(3) 効果
| 次元 | 導入前 (手動設定) | 導入後 (create-next-app) |
|---|---|---|
| プロジェクト設定時間 | 2日間の調査 | 3分 |
| HMR 速度 | 1〜2秒 (Webpack) | 3〜10ms (Turbopack) |
| コードヒント | なし | JSX 自動補完 + Tailwind クラス名ヒント |
| 目次の理解 | 混乱 | 機能別に整理され、理解しやすい |
3. create-next-app スキャフォールド
(1) インタラクティブ作成
# スキャフォールドコマンドを実行
npx create-next-app@latest
以下のインタラクティブオプションが表示されます:
? What is your project named? taskflow
? Would you like to use TypeScript? Yes / No
? Would you like to use ESLint? Yes / No
? Would you like to use Tailwind CSS? Yes / No
? Would you like to use `src/` directory? Yes / No
? Would you like to use App Router? (recommended) Yes / No
? Would you like to customize the import alias (`@/*` by default)? No
(2) 推奨設定 (本チュートリアルで使用)
# 本コース推奨オプション (全プロジェクトでこの設定を使用)
npx create-next-app@latest taskflow ^
--typescript ^
--eslint ^
--tailwind ^
--src-dir ^
--app ^
--import-alias "@/*"
| オプション | 値 | 理由 |
|---|---|---|
| TypeScript | Yes | 本番レベルのプロジェクト標準、型安全性 |
| ESLint | Yes | コード品質保証 |
| Tailwind CSS | Yes | 本チュートリアル全体で使用 |
| src/ ディレクトリ | Yes | コードと設定の分離 |
| App Router | Yes | Next.js 16 デフォルトのルーティングシステム |
| インポートエイリアス | @/* | 簡潔なインポートパス |
▶ サンプル: スキャフォールド作成の完全なプロセス
# ============================================
# shophub という名前の新規プロジェクトを作成
# ============================================
npx create-next-app@latest shophub --ts --tailwind --app --src-dir
# コンソール出力
cd shophub
npm run dev
Creating a new Next.js project in C:\Users\Charlie\shophub.
✔ Would you like to use TypeScript? … Yes
✔ Would you like to use ESLint? … Yes
✔ Would you like to use Tailwind CSS? … Yes
✔ Would you like to use `src/` directory? … Yes
✔ Would you like to use App Router? (recommended) … Yes
✔ Would you like to customize the import alias? … @/*
Success! Created shophub at shophub
Inside that directory, you can run:
npm run dev # 開発サーバーを起動
npm run build # 本番バージョンをビルド
npm start # 本番サーバーを起動
(3) スキャフォールドが生成するプロジェクト構造
graph TB
A[shophub/] --> B[src/]
A --> C[public/]
A --> D[その他の設定ファイル]
B --> E[app/]
B --> F[app/globals.css]
B --> G[app/layout.tsx]
B --> H[app/page.tsx]
C --> I[favicon.ico]
C --> J[画像とその他の静的リソース]
D --> K[package.json]
D --> L[tsconfig.json]
D --> M[next.config.ts]
D --> N[tailwind.config.ts]
D --> O[postcss.config.mjs]
style B fill:#d4edda
style C fill:#f8d7da
style E fill:#cce5ff
4. プロジェクトディレクトリ構造の詳細解説
(1) src/app/ — アプリケーションコードの中核
| ファイル | 目的 | 必須? |
|---|---|---|
layout.tsx |
ルートレイアウト (全ページを囲む) | ✅ 必須 |
page.tsx |
ホーム (/ でルーティング) |
✅ 必須 |
globals.css |
グローバルスタイル | 推奨 |
favicon.ico |
Webサイトアイコン | 任意 |
▶ サンプル: デフォルトの app/page.tsx ファイル
Diagram: shophub/; src/; public/; Other Profiles; app/; app/globals.css.
// ============================================
// create-next-app デフォルトホームページ
// ============================================
import Image from "next/image";
export default function Home() {
return (
<div className="grid grid-rows-[20px_1fr_20px] items-center justify-items-center min-h-screen p-8 pb-20 gap-16 sm:p-20 font-[family-name:var(--font-geist-sans)]">
<main className="flex flex-col gap-8 row-start-2 items-center sm:items-start">
<Image
className="dark:invert"
src="/next.svg"
alt="Next.js logo"
width={180}
height={38}
priority
/>
<ol className="list-inside list-decimal text-sm text-center sm:text-left font-[family-name:var(--font-geist-mono)]">
<li className="mb-2">
Get started by editing{" "}
<code className="bg-black/[.05] dark:bg-white/[.06] px-1 py-0.5 rounded font-semibold">
src/app/page.tsx
</code>
</li>
<li>Save and see your changes instantly.</li>
</ol>
<div className="flex gap-4 items-center flex-col sm:flex-row">
<a className="...">Deploy now</a>
<a className="...">Read our docs</a>
</div>
</main>
</div>
);
}
Renders: Home component with described UI elements.
ブラウザで http://localhost:3000 を開くと、次のものが表示されます:
- Next.js 公式ロゴ
- "Get started by editing src/app/page.tsx" の表示
- "Deploy now" と "Read our docs" の2つのリンク
- ダーク/ライトテーマ対応
(2) public/ — 静的リソースディレクトリ
public/
├── favicon.ico # ブラウザタブアイコン
├── file.svg # ファイルタイプアイコン
├── globe.svg # 地球アイコン
├── next.svg # Next.js ロゴ
├── vercel.svg # Vercel ロゴ
└── window.svg # ウィンドウアイコン
public/ にあるすべてのファイルは、/ ルートパスから直接アクセスできます:
// コンポーネント内で public ディレクトリの画像を参照
<img src="/logo.png" alt="Logo" />
// または next/image コンポーネントを使用
import Image from 'next/image';
<Image src="/logo.png" alt="Logo" width={200} height={100} />
(3) ルート設定ファイル
| ファイル | 目的 | 変更頻度 |
|---|---|---|
next.config.ts |
Next.js コンパイル時設定 | 低 (プロジェクト開始時に設定) |
tsconfig.json |
TypeScript コンパイルオプション | 低 |
tailwind.config.ts |
Tailwind CSS テーマ/プラグイン | 中 (カスタムカラー追加時) |
postcss.config.mjs |
PostCSS プラグイン設定 | 非常に低 |
package.json |
プロジェクト依存関係 + NPM スクリプト | 中 (依存関係追加時) |
.eslintrc.json |
ESLint ルール | 低 |
▶ サンプル: next.config.ts の設定
TypeScript compiled.
// ============================================
// next.config.ts — Next.js コンパイル時設定
// ============================================
import type { NextConfig } from "next";
const nextConfig: NextConfig = {
// 外部画像を指定ドメインから読み込めるように許可
images: {
remotePatterns: [
{
protocol: "https",
hostname: "fakestoreapi.com",
},
{
protocol: "https",
hostname: "images.unsplash.com",
},
],
},
// PPR (部分プリレンダリング) を有効化
experimental: {
ppr: true,
},
};
export default nextConfig;
Component renders its UI.
設定が有効になった後:
1. <Image> コンポーネントは fakestoreapi.com と images.unsplash.com から画像を読み込める
2. ページ上の Suspense 境界以降のコンテンツは PPR ストリーミングレンダリングを使用する
3. npm run dev を再実行すると設定が反映される
5. 開発サーバーと Turbopack
(1) 開発サーバーの起動
# プロジェクトディレクトリに移動
cd shophub
# 開発サーバーを起動
npm run dev
▶ サンプル: Turbopack ライブホットリロード体験
▲ Next.js 16.0.0
- Local: http://localhost:3000
- Environments: .env.local
✓ Starting...
✓ Ready in 1.2s
# ============================================
# 開発サーバーを起動し、Turbopack の超高速 HMR を観察
# ============================================
npm run dev
# コンソール出力
> shophub@0.1.0 dev
> next dev
▲ ▲
▲ Next.js 16.2
▲ - Local: http://localhost:3000
▲ - Turbopack: ✓ loaded in 742ms
✔ Compiled /src/app/page.tsx in 142ms (modules: 523)
src/app/page.tsx を編集してテキストを変更し、保存します:
✔ Updated /src/app/page.tsx in 4ms ← 4ミリ秒!ほぼ瞬時に更新
▲ Next.js 16.2
- Local: http://localhost:3000
- Turbopack: ✓ loaded in 742ms
✔ Compiled /src/app/page.tsx in 142ms (modules: 523)
✔ Updated /src/app/page.tsx in 4ms ← 4ミリ秒!ほぼ瞬時に更新
Webpack との比較:
| 操作 | Webpack (v15) | Turbopack (v16) | パフォーマンス向上 |
|---|---|---|---|
| コールドスタート | 5〜10秒 | 0.7〜1.2秒 | 8倍 |
| 単一ファイルホットリロード | 50〜200ms | 2〜10ms | 20倍 |
| 大規模プロジェクトビルド | ベースライン | 10倍高速 | 10倍 |
(2) npm run build 本番ビルド
# 本番バージョンをビルド
npm run build
✓ Linting and checking validity of types
✓ Collecting page data
✓ Generating static pages (5/5)
✓ Collecting build traces
✓ Finalizing page optimization
Route (app) Size First Load JS
┌ ○ / 5.1 kB 89 kB
├ ○ /_not-found 152 B 84.1 kB
└ λ /api/hello 0 B 84.1 kB
+ First Load JS shared by all 84.1 kB
├ chunks/main-app ...
└ chunks/webpack ...
○ (Static) 静的生成 (SSG)
λ (Dynamic) 動的レンダリング (SSR)
▶ サンプル: "npm run build" でルートタイプを表示
(上記の出力を参照)
# ============================================
# 本番ビルド出力の解釈
# ============================================
# 2つのページが作成されたと仮定:
# app/about/page.tsx と app/dashboard/page.tsx
# そのうち dashboard は cookies() 動的関数を使用
npm run build
# 出力のシンボルの意味:
○ / # 静的ページ (動的関数なし)
○ /about # 静的ページ
λ /dashboard # 動的ページ (動的 API を使用)
○ /_not-found # 404 ページ
Route (app) Size First Load JS
┌ ○ / 5.1 kB 89 kB
├ ○ /about 3.2 kB 87 kB
├ λ /dashboard 6.8 kB 92 kB
└ ○ /_not-found 152 B 84.1 kB
Route (app) Size First Load JS
┌ ○ / 5.1 kB 89 kB
├ ○ /about 3.2 kB 87 kB
├ λ /dashboard 6.8 kB 92 kB
└ ○ /_not-found 152 B 84.1 kB
○ (Static) 静的生成 (SSG)
λ (Dynamic) 動的レンダリング (SSR)
(3) npm start 本番サーバー
# デプロイ後に本番サーバーを起動
npm run build
npm start
npm start は npm run build の後に実行する必要があります。最適化された本番バージョンを起動するもので、開発バージョンではありません。
6. package.json のスクリプトを理解する
(1) デフォルトスクリプト一覧
{
"name": "shophub",
"version": "0.1.0",
"private": true,
"scripts": {
"dev": "next dev",
"build": "next build",
"start": "next start",
"lint": "next lint"
},
"dependencies": {
"next": "^16.2.0",
"react": "^19.0.0",
"react-dom": "^19.0.0"
},
"devDependencies": {
"@types/node": "^22.0.0",
"@types/react": "^19.0.0",
"@types/react-dom": "^19.0.0",
"typescript": "^5.7.0",
"tailwindcss": "^4.0.0",
"eslint": "^9.0.0",
"@eslint/eslintrc": "^3.0.0"
}
}
| スクリプト | コマンド | 目的 |
|---|---|---|
npm run dev |
next dev |
開発サーバーを起動 (Turbopack) |
npm run build |
next build |
本番ビルド |
npm start |
next start |
本番サーバーを起動 |
npm run lint |
next lint |
コードスタイルチェック |
▶ サンプル: カスタムスクリプトの追加
JSON structure with scripts (dev, build, start, lint, type-check, format, preview) and their corresponding CLI commands.
// ============================================
// package.json によく使うカスタムスクリプトを追加
// ============================================
{
"scripts": {
"dev": "next dev",
"build": "next build",
"start": "next start",
"lint": "next lint",
"type-check": "tsc --noEmit",
"format": "prettier --write .",
"preview": "npm run build && npm start"
}
}
npm run type-check → TypeScript 型チェックを実行 (ファイル出力なし)
npm run format → 全コードを Prettier でフォーマット
npm run preview → ビルド後、本番サーバーを起動 (1コマンドで完了)
7. 推奨 VS Code 拡張機能
(1) コアプラグイン
| プラグイン名 | 目的 | インストール数 |
|---|---|---|
| Tailwind CSS IntelliSense | Tailwind クラス名の自動補完 + ホバープレビュー | 10M+ |
| ES7+ React/Redux/React-Native snippets | JSX スニペット (rafce → コンポーネントテンプレート) |
8M+ |
| Prettier - Code Formatter | 自動コードフォーマット | 40M+ |
| Error Lens | インラインエラーメッセージ | 5M+ |
| GitLens | Git 履歴の可視化 | 15M+ |
8. 完全な例: TaskFlow プロジェクトをゼロから構築
# ============================================
# 総合例: 完全な Next.js 16 プロジェクトをゼロから構築
# TaskFlow — プロジェクトコラボレーション管理プラットフォーム
# ============================================
# 1. プロジェクトを作成
npx create-next-app@latest taskflow ^
--typescript ^
--eslint ^
--tailwind ^
--src-dir ^
--app ^
--import-alias "@/*"
# 2. プロジェクトディレクトリに移動
cd taskflow
# 3. ディレクトリ構造を表示
tree . /F | findstr /r "^.*src" > nul && dir /s /b src
# 4. 開発サーバーを起動
npm run dev
# 5. 別のターミナルで、推奨 VS Code 設定を追加
mkdir .vscode
// .vscode/settings.json — プロジェクトレベル設定
{
"editor.formatOnSave": true,
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.codeActionsOnSave": {
"source.fixAll.eslint": "explicit"
},
"typescript.preferences.importModuleSpecifier": "non-relative"
}
// src/app/page.tsx — ホームページを TaskFlow ウェルカムページに変更
import Link from "next/link";
export default function Home() {
return (
<div className="min-h-screen bg-gradient-to-br from-blue-50 to-indigo-100">
<div className="container mx-auto px-4 py-16 text-center">
<h1 className="text-5xl font-bold text-gray-900 mb-4">
TaskFlow
</h1>
<p className="text-xl text-gray-600 mb-8 max-w-2xl mx-auto">
A collaborative project management platform built with Next.js 16.
Plan, track, and deliver projects together.
</p>
<div className="flex gap-4 justify-center">
<Link
href="/login"
className="px-6 py-3 bg-blue-600 text-white rounded-lg hover:bg-blue-700"
>
Get Started
</Link>
<Link
href="/about"
className="px-6 py-3 border border-gray-300 rounded-lg hover:bg-gray-50"
>
Learn More
</Link>
</div>
<div className="mt-16 grid grid-cols-3 gap-8 max-w-3xl mx-auto">
<div className="p-6 bg-white rounded-xl shadow-sm">
<h3 className="font-bold text-lg">Plan</h3>
<p className="text-gray-500 mt-2">Create projects and assign tasks</p>
</div>
<div className="p-6 bg-white rounded-xl shadow-sm">
<h3 className="font-bold text-lg">Track</h3>
<p className="text-gray-500 mt-2">Monitor progress in real-time</p>
</div>
<div className="p-6 bg-white rounded-xl shadow-sm">
<h3 className="font-bold text-lg">Deliver</h3>
<p className="text-gray-500 mt-2">Ship projects on schedule</p>
</div>
</div>
</div>
</div>
);
}
期待される出力:
ブラウザで http://localhost:3000 に表示:
[TaskFlow タイトル]
A collaborative project management platform built with Next.js 16.
Plan, track, and deliver projects together.
[Get Started] [Learn More]
┌──────┐ ┌──────┐ ┌──────┐
│ Plan │ │ Track│ │Deliver│
└──────┘ └──────┘ └──────┘
❓ よくある質問
create-next-app に --ts --tailwind のようなパラメータをつける必要はありますか?src/ ディレクトリ構造を使う利点は何ですか?必須ですか?src/ ディレクトリ構造はアプリケーションコード (src/) と設定ファイル (ルートディレクトリ) を分離し、プロジェクト構造をより明確にします。必須ではありませんが、本チュートリアルでは使用を推奨しています。使わない場合は、app/ ディレクトリをルートディレクトリに直接配置します。npm run dev (開発モード) を使用しているか確認してください。npm start を使用している場合、それは本番サーバーです。npm run build に切り替える必要があります。また、Turbopack はデフォルトでページ全体の更新ではなくホットリロードを使用するため、スタイルやタグの変更は即座に反映されます。experimental.turbopack: false を設定すると、Webpack にフォールバックします。ただし、Next.js 16 では公式に Turbopack の使用を推奨しており、将来のバージョンで Webpack サポートが削除される可能性があります。.vscode/settings.json を Git にコミットすべきですか?.vscode/launch.json (デバッグ設定) は人によって異なるため、コミットする必要はありません。package.json の Next.js バージョン番号の前にある ^ は何を意味しますか?^16.2.0 は、npm install が 16.x.x の範囲内で最新のマイナーバージョン (例: 16.3.0、16.4.0) をインストールすることを許可しますが、17.0.0 にはアップグレードしません。~16.2.0 は 16.2.x のみを許可します。バージョンを固定するには、プレフィックスなしの 16.2.0 を使用します。📖 まとめ
create-next-appは公式スキャフォールドツールです。1つのコマンドでベストプラクティスのプロジェクトを作成できます- 推奨設定: TypeScript + ESLint + Tailwind + App Router + src/ ディレクトリ
src/app/はルートページを格納し、public/は静的リソースを格納しますnext.config.tsはコア設定ファイルです (画像ドメイン、PPR 切り替えなど)npm run devは Turbopack によるホットリロードを使用し、Webpack より 10〜50倍高速ですnpm run build+npm startは本番環境のセットアップと起動のプロセスです- 推奨 VS Code 拡張機能: Tailwind CSS IntelliSense、ES7+ React snippets、Prettier
npm run devは開発のみに使用します。npm startはビルド後に使用する必要があります
📝 練習問題
-
基礎問題 (⭐):
create-next-appを使用してmy-next-appという名前の新規プロジェクトを作成し (TypeScript、Tailwind、App Router を有効にして)、開発サーバーを起動し、ブラウザでlocalhost:3000を開き、ホームページのスクリーンショットを撮ってください。 -
発展問題 (⭐⭐):
next.config.tsでremotePatternsを設定してimages.unsplash.comからの画像読み込みを許可し、app/page.tsxで<Image>コンポーネントを使用して Unsplash 画像 (幅 800、高さ 600) を読み込んでください。 -
チャレンジ (⭐⭐⭐):
app/about/page.tsxとapp/contact/page.tsxの2つのページを作成し、.vscode/settings.jsonで保存時に自動フォーマットするよう設定し、npm run buildを実行して出力の○とλシンボルを確認し、各ルートのタイプを解釈してください。