Contents
1. Next.js 14 の主要機能とプロジェクト雛形
1‑1. app ディレクトリと Edge Runtime の概要
Next.js 14 では app ディレクトリ がデフォルトで有効化され、ページ単位で Server Component と Client Component を明示的に分離できます。これにより、データ取得ロジックはサーバー側だけで完結し、クライアントへ送る JavaScript の量を最小限に抑えることが可能です。
| 項目 | 説明 |
|---|---|
| Server Component | データベースや外部 API へのアクセスはサーバー側で完結。クライアントには HTML だけが送信される。 |
| Client Component | useState・useEffect などのインタラクティブロジックを実装するコンポーネント。 |
| Edge Runtime | Vercel のエッジネットワーク上でコードが実行され、Cold Start が数十ミリ秒程度に抑えられる。 |
Edge Runtime は「サーバー側」の処理でも高速化が期待できるため、API Route や画像最適化といった重たい処理をエッジへオフロードするのがおすすめです。
1‑2. プロジェクト作成コマンドと推奨設定
以下のコマンドで Next.js 14 のテンプレートを生成します。--experimental-app フラグは app ディレクトリ構造 を自動的に組み込み、TypeScript と ESLint も同時に有効化できます。
|
1 2 3 4 5 6 7 8 9 10 |
# プロジェクト作成(TypeScript・ESLint・Prettier 同時導入) npx create-next-app@latest my-next14-app \ --experimental-app \ --typescript \ --eslint \ --use-pnpm cd my-next14-app pnpm add -D @types/node # Node の型定義をインストール(TypeScript 開発に必須) |
生成された app/ ディレクトリには以下のファイルが自動配置されます。
layout.tsx– ルートレイアウト(全ページ共通の HTML 構造)page.tsx– デフォルトのトップページ
重要ポイント
- next.config.js に output: 'standalone' は自動で追加されません。必要に応じて手動で設定してください(Docker コンテナ化やサーバー外部デプロイ時に便利です)。
- Edge Runtime 用のページは個別に export const runtime = 'edge'; を付与することで有効になります。
2. Vercel CLI のインストールとローカル開発フロー
Vercel CLI はローカル環境で本番と同等のビルド・ランタイムを再現し、デプロイ作業をシンプルにします。以下ではインストールからローカルプレビューまでの手順を示します。
2‑1. インストールと認証
|
1 2 3 4 5 6 |
# グローバルインストール(Node 18+ 推奨) npm i -g vercel # GitHub アカウントでログイン vercel login |
- ログインに成功すると、トークンが
~/.config/vercelに保存されます。CI 環境では同ディレクトリの代わりに環境変数 VERCEL_TOKEN を設定すれば自動認証が可能です。
2‑2. プロジェクトと Vercel の紐付け
|
1 2 3 |
# 初回実行でプロジェクトを作成または既存プロジェクトにリンク vercel link |
vercel linkを実行すると.vercel/project.jsonが生成され、projectIdとorgIdが記録されます。以降のvercel dev/vercel deployはこの情報を基に対象プロジェクトを自動判別します。
2‑3. ローカルプレビュー(vercel dev)
|
1 2 3 |
# Edge Runtime や API Routes を本番に近い形でテスト vercel dev |
vercel devはnext.config.jsとvercel.jsonの設定をそのまま読み込み、.env.localも自動的に注入します。- エッジ関数はローカルでもエッジランタイムと同様のサンドボックスで実行されるため、デプロイ前に挙動確認が容易です。
3. デプロイ戦略:本番環境とプレビュー環境
Vercel では プレビュー環境 がデフォルトで有効化されています。GitHub の Pull Request と連携させるだけで、ブランチごとの一時デプロイが自動生成されます。
3‑1. 本番デプロイ
|
1 2 3 |
# 本番環境へデプロイ(Git にコミット済みのコードが対象) vercel deploy --prod |
--prodフラグを付与すると、Vercel は「Production」向けビルドとして扱い、vercel.jsonのproductionBranchが設定されている場合は自動的にそのブランチが対象になります。- デプロイ完了後に表示される URL(例:
https://my-next14-app.vercel.app)を共有すれば、本番リリースが完了です。
3‑2. プレビュー環境(自動生成)
- GitHub 連携
-
Vercel Dashboard → Git Integration → 対象リポジトリを選択し、Pull Request Preview を有効化。
-
プレビューデプロイの流れ
- PR が作成・更新されるたびに Vercel が自動でビルドし、
https://<branch>-my-next14-app.vercel.appのような一時 URL を生成します。 - 開発者はこのプレビュー URL で実際のエッジ環境と同様の挙動を確認できます。
注意:CLI に
--previewsオプションは存在しません。プレビューは上記のように Git 連携か、vercel deploy(フラグなし)だけで自動的に生成されます。
4. 環境変数・シークレットとカスタムドメイン
4‑1. 環境変数の管理方法
| 種類 | 保存場所 | アクセス例 |
|---|---|---|
公開環境変数 (NEXT_PUBLIC_ プレフィックス) |
Vercel Dashboard の Environment Variables と .env.local |
process.env.NEXT_PUBLIC_API_URL |
| シークレット(サーバー側のみ) | Dashboard の Secret に暗号化保存 | process.env.DATABASE_URL |
同期コマンド例
|
1 2 3 4 5 6 |
# 開発環境の変数をローカルに取得 vercel env pull .env.development --environment=development # 本番環境のシークレットを取得(注意:機密情報は .gitignore に追加) vercel env pull .env.production --environment=production |
- 取得した
.env.*ファイルは必ず .gitignore に列挙し、リポジトリに含めないようにします。
4‑2. カスタムドメインの設定手順
- Dashboard → Domains → Add Domain で
example.comを入力。 - DNS プロバイダ側に以下のレコードを追加(Vercel が提示する値は必ず確認)
| 種類 | ホスト名 | 値 |
|---|---|---|
| CNAME | www | cname.vercel-dns.com |
| A | @(ルートドメイン) | 76.76.21.21 |
- DNS が伝播したら Dashboard に Verified と表示され、Vercel が自動的に Let’s Encrypt の証明書を発行します。
- 必要に応じて
example.com → www.example.comのリダイレクト設定を追加し、統一された URL でアクセスできるようにします。
ポイント:HTTPS は自動で有効化され、証明書の更新も Vercel がバックグラウンドで行うため手作業は不要です。
5. パフォーマンス最適化とセキュリティベストプラクティス
5‑1. ISR・Static Generation・Edge Functions の使い分け
| 手法 | 主な利用シーン | ビルド/ランタイム特性 |
|---|---|---|
| Static Generation (SSG) | コンテンツが変更頻度低いページ(LP、ブログ一覧) | ビルド時に HTML が生成され CDN から即配信。最速レスポンス。 |
| Incremental Static Regeneration (ISR) | 定期的に更新したいページ(ニュース記事、商品情報) | revalidate 時間ごとにバックグラウンドで再ビルドし、最新データを保持。 |
| Edge Functions | 高速 API、認証・画像変換など低レイテンシが求められる処理 | エッジロケーションで実行され、数十ミリ秒の応答が可能。 |
実装例
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// app/blog/[slug]/page.tsx(ISR) export const revalidate = 60; // 1分ごとに再生成 import { fetchPost } from '@/lib/api'; export default async function Post({ params }: { params: { slug: string } }) { const post = await fetchPost(params.slug); return ( <article> <h1>{post.title}</h1> {/* コンテンツ */} </article> ); } |
|
1 2 3 4 5 6 7 8 9 |
// app/api/hello/route.ts(Edge Function) export const runtime = 'edge'; export async function GET() { return new Response(JSON.stringify({ now: Date.now() }), { headers: { 'content-type': 'application/json' }, }); } |
5‑2. ビルドキャッシュと画像最適化
- ビルドキャッシュ
Vercel は前回のnode_modulesや.next/cacheを自動的に保存します。特別な設定は不要ですが、vercel.jsonに明示的に有効化したい場合は以下を追加できます。
|
1 2 3 4 5 6 7 8 |
{ "build": { "env": { "NEXT_PRIVATE_BUILD_CACHE": "true" } } } |
- 画像最適化
Next.js のnext/imageコンポーネントだけで、WebP 変換やサイズリサイズが自動的に行われます。Vercel が CDN 経由で最適化画像を配信するため、ページ速度向上に直結します。
5‑3. セキュリティ対策
ヘッダー強化(CSP・HSTS 等)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// next.config.js module.exports = { async headers() { return [ { source: '/(.*)', headers: [ { key: 'Content-Security-Policy', value: "default-src 'self'; img-src https: data:;" }, { key: 'Strict-Transport-Security', value: 'max-age=63072000; includeSubDomains; preload' }, { key: 'X-Frame-Options', value: 'DENY' }, { key: 'X-Content-Type-Options', value: 'nosniff' }, ], }, ]; }, }; |
依存パッケージの自動更新
|
1 2 3 4 5 6 7 8 |
# .github/dependabot.yml version: 2 updates: - package-ecosystem: "npm" directory: "/" schedule: interval: "weekly" |
- Dependabot がプルリクエストを作成し、CI がテストを通過すれば自動的にマージできるフローを整えると、脆弱性の放置リスクが低減します。
Vercel のサンドボックス
Edge Function は各リクエストごとに分離されたコンテナで実行され、ファイルシステムへの書き込みや外部ネットワークへの無制限アクセスはできません。これだけでも多くの権限昇格攻撃を防げます。
6. エンドツーエンドまとめ
| 項目 | 推奨手順 |
|---|---|
| プロジェクト作成 | npx create-next-app@latest --experimental-app --typescript --eslint --use-pnpm |
| ローカル開発 | vercel login → vercel link → vercel dev でエッジ環境を再現 |
| 本番デプロイ | vercel deploy --prod |
| プレビュー | GitHub PR と連携すれば自動生成、CLI ではフラグ不要 |
| 環境変数 | Dashboard のシークレット+.env.* を vercel env pull で同期 |
| カスタムドメイン | DNS に CNAME/A レコードを設定し、Vercel が自動 HTTPS 発行 |
| パフォーマンス | ISR / SSG / Edge Functions の使い分け + ビルドキャッシュ・画像最適化 |
| セキュリティ | CSP/HSTS ヘッダー、Dependabot による定期更新、Edge サンドボックス活用 |
この手順に沿って設定すれば、高速・安全・スケーラブル な Next.js 14 アプリを Vercel 上で継続的にデリバリーできるようになります。チーム全体で同じテンプレートと CI/CD パイプラインを共有し、開発速度と品質の両立を目指してください。