Next.js: 環境構築とプロジェクト構造

最終更新:2026-08-26

Next.js 16 の開発環境をセットアップすることは、新しい家を改装するようなものです。スキャフォールドが基礎を築き、残りの構造、レイアウト、設定は必要に応じて調整できます。

1. 学ぶこと



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 インタラクティブスキャフォールドを使用して、ベストプラクティスのプロジェクト構造をワンクリックで生成します。

BASH
# インタラクティブコマンド。いくつかの簡単な質問に答えるだけです
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) インタラクティブ作成

BASH
# スキャフォールドコマンドを実行
npx create-next-app@latest

以下のインタラクティブオプションが表示されます:

TEXT 📖 参照専用
? 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) 推奨設定 (本チュートリアルで使用)

BASH
# 本コース推奨オプション (全プロジェクトでこの設定を使用)
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 デフォルトのルーティングシステム
インポートエイリアス @/* 簡潔なインポートパス

▶ サンプル: スキャフォールド作成の完全なプロセス

BASH
# ============================================
# shophub という名前の新規プロジェクトを作成
# ============================================

npx create-next-app@latest shophub --ts --tailwind --app --src-dir

# コンソール出力
cd shophub
npm run dev
💻 出力:

TEXT 📖 参照専用
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) スキャフォールドが生成するプロジェクト構造

100%
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 ファイル

💻 出力:

TEXT 📖 参照専用
Diagram: shophub/; src/; public/; Other Profiles; app/; app/globals.css.
TSX
// ============================================
// 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>
  );
}
💻 出力:

TEXT 📖 参照専用
Renders: Home component with described UI elements.
💻 出力:

TEXT 📖 参照専用
ブラウザで http://localhost:3000 を開くと、次のものが表示されます:
- Next.js 公式ロゴ
- "Get started by editing src/app/page.tsx" の表示
- "Deploy now" と "Read our docs" の2つのリンク
- ダーク/ライトテーマ対応

(2) public/ — 静的リソースディレクトリ

TEXT 📖 参照専用
public/
├── favicon.ico      # ブラウザタブアイコン
├── file.svg         # ファイルタイプアイコン
├── globe.svg        # 地球アイコン
├── next.svg         # Next.js ロゴ
├── vercel.svg       # Vercel ロゴ
└── window.svg       # ウィンドウアイコン

public/ にあるすべてのファイルは、/ ルートパスから直接アクセスできます:

TSX
// コンポーネント内で 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 の設定

💻 出力:

TEXT 📖 参照専用
TypeScript compiled.
TS
// ============================================
// 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;
💻 出力:

TEXT 📖 参照専用
Component renders its UI.
💻 出力:

TEXT 📖 参照専用
設定が有効になった後:
1. <Image> コンポーネントは fakestoreapi.com と images.unsplash.com から画像を読み込める
2. ページ上の Suspense 境界以降のコンテンツは PPR ストリーミングレンダリングを使用する
3. npm run dev を再実行すると設定が反映される


5. 開発サーバーと Turbopack

(1) 開発サーバーの起動

BASH
# プロジェクトディレクトリに移動
cd shophub

# 開発サーバーを起動
npm run dev

▶ サンプル: Turbopack ライブホットリロード体験

💻 出力:

TEXT 📖 参照専用
  ▲ Next.js 16.0.0
  - Local:        http://localhost:3000
  - Environments: .env.local

 ✓ Starting...
 ✓ Ready in 1.2s
BASH
# ============================================
# 開発サーバーを起動し、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 を編集してテキストを変更し、保存します:

TEXT 📖 参照専用
✔ Updated /src/app/page.tsx in 4ms    ← 4ミリ秒!ほぼ瞬時に更新
💻 出力:

TEXT 📖 参照専用
  ▲ 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 本番ビルド

BASH
# 本番バージョンをビルド
npm run build
💻 出力:

TEXT 📖 参照専用
✓ 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" でルートタイプを表示

💻 出力:

TEXT 📖 参照専用
(上記の出力を参照)
BASH
# ============================================
# 本番ビルド出力の解釈
# ============================================

# 2つのページが作成されたと仮定:
# app/about/page.tsx と app/dashboard/page.tsx
# そのうち dashboard は cookies() 動的関数を使用

npm run build

# 出力のシンボルの意味:
○  /              # 静的ページ (動的関数なし)
○  /about         # 静的ページ
λ  /dashboard     # 動的ページ (動的 API を使用)
○  /_not-found    # 404 ページ
💻 出力:

TEXT 📖 参照専用
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
💻 出力:

TEXT 📖 参照専用
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 本番サーバー

BASH
# デプロイ後に本番サーバーを起動
npm run build
npm start
💡 ヒント: npm startnpm run build の後に実行する必要があります。最適化された本番バージョンを起動するもので、開発バージョンではありません。



6. package.json のスクリプトを理解する

(1) デフォルトスクリプト一覧

JSON
{
  "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 コードスタイルチェック

▶ サンプル: カスタムスクリプトの追加

💻 出力:

TEXT 📖 参照専用
JSON structure with scripts (dev, build, start, lint, type-check, format, preview) and their corresponding CLI commands.
JSON
// ============================================
// 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"
  }
}
💻 出力:

TEXT 📖 参照専用
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 プロジェクトをゼロから構築

BASH
# ============================================
# 総合例: 完全な 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
JSON
// .vscode/settings.json — プロジェクトレベル設定
{
  "editor.formatOnSave": true,
  "editor.defaultFormatter": "esbenp.prettier-vscode",
  "editor.codeActionsOnSave": {
    "source.fixAll.eslint": "explicit"
  },
  "typescript.preferences.importModuleSpecifier": "non-relative"
}
TSX
// 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>
  );
}

期待される出力:

TEXT 📖 参照専用
ブラウザで 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│
└──────┘  └──────┘  └──────┘

❓ よくある質問

Q create-next-app--ts --tailwind のようなパラメータをつける必要はありますか?
A いいえ、つける必要はありません。パラメータを何もつけなければ、インタラクティブな Q&A モードに入り、各オプションを1つずつ尋ねられます。パラメータモードは CI/CD 自動化に適しています。どちらの方法でも結果は同じです。
Q src/ ディレクトリ構造を使う利点は何ですか?必須ですか?
A src/ ディレクトリ構造はアプリケーションコード (src/) と設定ファイル (ルートディレクトリ) を分離し、プロジェクト構造をより明確にします。必須ではありませんが、本チュートリアルでは使用を推奨しています。使わない場合は、app/ ディレクトリをルートディレクトリに直接配置します。
Q コードを変更してもブラウザが自動更新されないのはなぜですか?
A npm run dev (開発モード) を使用しているか確認してください。npm start を使用している場合、それは本番サーバーです。npm run build に切り替える必要があります。また、Turbopack はデフォルトでページ全体の更新ではなくホットリロードを使用するため、スタイルやタグの変更は即座に反映されます。
Q Turbopack を無効にできますか?
A はい。next.config.ts で experimental.turbopack: false を設定すると、Webpack にフォールバックします。ただし、Next.js 16 では公式に Turbopack の使用を推奨しており、将来のバージョンで Webpack サポートが削除される可能性があります。
Q .vscode/settings.json を Git にコミットすべきですか?
A コミットすることを推奨します。プロジェクト全体のフォーマットとコード品質の設定が含まれており、新規開発者を含む全チームメンバーが一貫した設定を使用できます。ただし、.vscode/launch.json (デバッグ設定) は人によって異なるため、コミットする必要はありません。
Q package.json の Next.js バージョン番号の前にある ^ は何を意味しますか?
A ^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 を使用します。

📖 まとめ


📝 練習問題

  1. 基礎問題 (⭐): create-next-app を使用して my-next-app という名前の新規プロジェクトを作成し (TypeScript、Tailwind、App Router を有効にして)、開発サーバーを起動し、ブラウザで localhost:3000 を開き、ホームページのスクリーンショットを撮ってください。

  2. 発展問題 (⭐⭐): next.config.tsremotePatterns を設定して images.unsplash.com からの画像読み込みを許可し、app/page.tsx<Image> コンポーネントを使用して Unsplash 画像 (幅 800、高さ 600) を読み込んでください。

  3. チャレンジ (⭐⭐⭐): app/about/page.tsxapp/contact/page.tsx の2つのページを作成し、.vscode/settings.json で保存時に自動フォーマットするよう設定し、npm run build を実行して出力の λ シンボルを確認し、各ルートのタイプを解釈してください。

Web-Tutorial.com

Web-Tutorial 技術チーム

複数の開発者によって共同維持されているプログラミングチュートリアルプラットフォーム。各チュートリアルは専門分野の開発者が執筆・レビューしています。正確で信頼性の高いコンテンツを目指しています — 問題を見つけた場合はお知らせください。

100%