Contents
静的エクスポートの基本概念
Next.js 13 では output: 'export' を next.config.js に記述するだけで、ビルド時にページがすべて静的 HTML として出力されます。
- ビルドフロー
next buildがプロジェクト全体の依存関係解決・最適化を実行。-
同じプロセス内で自動的に
next exportが走り、生成物はデフォルトで.output(またはout)ディレクトリに書き出されます。 -
得られる成果物
- 完全な HTML ファイル(ページごとに 1 つ)
- CSS/JS のバンドルは
_next/static/*以下に配置 - 画像やフォントなどのアセットも同梱可能
この形態は CDN や静的ホスティングサービス(Vercel、Netlify、GitHub Pages 等)で高速配信が可能です。
|
1 2 3 4 |
# 推奨 npm スクリプト例 npm run build # => .next が生成される(内部で export も実行) # ビルド完了後に out ディレクトリが作成されます |
注:
output: 'export'を設定しない場合は従来通りサーバーレス関数が生成され、静的エクスポートは行われません。
next.config.js の推奨設定とローカルでの確認方法
1. 基本的な静的エクスポート設定
|
1 2 3 4 5 6 7 8 9 10 11 12 |
// next.config.js module.exports = { output: 'export', // 静的サイトとして出力 trailingSlash: true, // /about → /about/ のようにディレクトリ表記で生成 basePath: '/my-site', // サブパスにデプロイする場合は必ず設定 images: { remotePatterns: [ { protocol: 'https', hostname: 'cdn.example.com' }, ], }, }; |
| 項目 | 効果 | 注意点 |
|---|---|---|
trailingSlash |
ディレクトリ形式で HTML を出力し、GitHub Pages や Vercel のデフォルトと合致 | false にすると /about.html になる |
basePath |
サブディレクトリ配下にサイトを置く際の URL プレフィックス | デプロイ先がルートの場合は空文字列で OK |
images.remotePatterns |
外部画像ホストから取得した画像をビルド時に最適化(静的エクスポートでも有効) | 事前に許可リストに追加しないとエラーになる |
2. ローカルで生成物をプレビューする手順
- ビルド & エクスポート
bash
npm run build # 出力先はデフォルトで out ディレクトリ - 簡易サーバー起動(
serveパッケージを使用)
bash
npx serve out -l 5000 # http://localhost:5000 で確認
npm i -g serveが不要な場合は上記のように一時的に実行できます。
ポイント:ローカルサーバーは「ファイルベース」の静的配信を再現するため、リダイレクトやクリーン URL の挙動も同様に確認できます。
Vercel へのプロジェクト作成・GitHub 連携手順
1. プロジェクトの新規作成
| 手順 | 操作内容 |
|---|---|
| ① | Vercel にサインアップ(GitHub アカウントでログインが最も簡単) |
| ② | ダッシュボード左上の New Project をクリック |
| ③ | 「Import Git Repository」画面で GitHub タブを選択し、対象リポジトリを検索・選択 |
| ④ | アクセス権限(Read/Write)を承認すると Vercel が自動的にプロジェクトを作成 |
2. Framework Preset と Output Directory の設定
- Settings → General
-
Framework Preset:
Next.jsを選択(Vercel が自動でnext buildを実行) -
Build & Output Settings
- Output Directory:
out(静的エクスポートの出力先を明示) - Build Command: 省略可。デフォルトは
npm run build && npm run exportが実行されますが、output: 'export'が設定済みならnpm run buildのみで十分です。
注意:Vercel が自動的に
next exportを走らせるかどうかは、output: 'export'が 正しく認識されていること が前提です。公式ドキュメントでも「静的エクスポートを使用する場合はoutputオプションで明示してください」と記載されています。
3. GitHub Actions の位置付け
Vercel の自動ビルドだけでデプロイは完結しますが、以下のようなケースでは GitHub Actions が有用です。
- ビルド前にコード整形・テストを走らせたい
- カスタムスクリプト(例:画像圧縮や外部 API からのデータ取得)をビルドプロセスに組み込みたい
したがって「GitHub Actions が不要になる」という表現は過剰です。必要に応じて併用してください。
vercel.json による高度な URL 制御と環境変数の管理
1. 静的サイト向けのリライトルール例
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
// vercel.json { "cleanUrls": true, "trailingSlash": false, "rewrites": [ { "source": "/blog/:slug", "destination": "/posts/:slug.html" } ], "redirects": [ { "source": "/old-page", "destination": "/new-page", "statusCode": 301 } ] } |
| プロパティ | 効果 |
|---|---|
cleanUrls: true |
.html 拡張子を省略でき、URL がシンプルになる |
trailingSlash: false |
ディレクトリ表記(末尾スラッシュ)を無効化し、/about/ → /about に統一 |
rewrites |
静的ファイルのパスと外部からのアクセス URL をマッピング。動的ルーティングが不要になるので静的エクスポートでも機能する |
redirects |
永続(301)や一時(302)のリダイレクトを設定し、SEO 対策に活用できる |
2. 環境変数とシークレットの安全な扱い方
- Vercel ダッシュボード → Settings → Environment Variables
Name(例:NEXT_PUBLIC_API_URL)Value(実際のエンドポイント)-
Environment(Production / Preview / Development)を選択 -
コード側での参照
js
// 例: pages/api/client.js
const API_URL = process.env.NEXT_PUBLIC_API_URL;
export async function getStaticProps() {
const res = await fetch(${API_URL}/posts);
const posts = await res.json();
return { props: { posts } };
} -
シークレット変数(
NEXT_で始まらないもの)はクライアント側に露出しません。ビルド時のみ利用され、ランタイムでも Vercel Functions に渡すことが可能です。
ベストプラクティス:公開 API キーは
NEXT_PUBLIC_プレフィックスで明示的に公開する。一方、認証トークンや DB パスワードはシークレット変数として登録し、コード内ではprocess.env.<NAME>のみ使用してください。
ビルド失敗時の典型的な原因と対策
| 原因 | 具体例 | 解決策 |
|---|---|---|
| 動的ページが静的化できない | pages/[id].js に getStaticPaths が未実装、または fallback: true のまま |
getStaticPaths を正しく実装し、fallback: false で全パスを事前生成する |
| API Routes が残っている | pages/api/* がプロジェクトに存在し、output: 'export' と同時に使用した |
API が必要な場合は Hybrid モード(output: 'standalone' かデフォルト)へ切り替えるか、外部サーバーへ委譲 |
| 画像最適化が失敗 | next/image の loader が default のままで、ローカルに画像が存在しない |
images.unoptimized = true を設定するか、remotePatterns に対象ホストを追加 |
| ビルドコマンドの不整合 | Vercel の Build Command が npm run build && npm run export なのに、package.json に export スクリプトが無い |
scripts に "export": "next export" を追加、または Build Command を npm run build のみへ簡略化 |
| 環境変数未設定 | process.env.NEXT_PUBLIC_API_URL が undefined で API 呼び出しが失敗 |
Vercel の Environment Variables に必ず設定し、プレビュー・本番それぞれに適切な値を入れる |
Hybrid(静的+サーバーレス)構成の例
|
1 2 3 4 5 6 |
// next.config.js(Hybrid モード) module.exports = { // 静的エクスポートしたいページは個別に `export const getStaticProps` を記述 // API Routes はそのまま残す }; |
この方式なら、静的ページは高速 CDN 配信しつつ、動的処理は Vercel Functions が担う形になるため、柔軟性が向上します。
実運用で役立つ Tips とベストプラクティス
- CI/CD の分離
- 静的エクスポートだけなら Vercel の自動ビルドで完結。
-
それでもコード品質(ESLint、Jest)を保証したい場合は GitHub Actions にテストジョブのみ配置し、ビルドは Vercel 任せにするとシンプルです。
-
キャッシュ制御
vercel.jsonのheaders設定で HTML はCache-Control: no-cache, max-age=0、静的資産は長期キャッシュ(例:max-age=31536000, immutable)を付与すると、ブラウザ側の再取得が減少します。
json
{
"headers": [
{
"source": "/(.*).html",
"headers": [{ "key": "Cache-Control", "value": "no-cache" }]
},
{
"source": "/_next/static/(.*)",
"headers": [{ "key": "Cache-Control", "value": "public, max-age=31536000, immutable" }]
}
]
}
- プレビュー環境の活用
-
Vercel の Preview Deploy はブランチごとに自動生成され、
VERCEL_ENV=previewがセットされます。環境変数で API エンドポイントを切り替えるだけで、本番と同等の挙動をローカルに近い形で確認できます。 -
画像・フォントの最適化
next/fontと組み合わせてサブセット化したフォントをビルド時に埋め込む。-
静的エクスポートでも
next/imageが外部画像を自動圧縮するので、remotePatternsに対象ホストだけ追加すれば OK。 -
デプロイ後のモニタリング
- Vercel の Analytics(有料)または Google Analytics を組み込み、ページロード時間やエラーレートを定期的にチェック。
- エラーが頻出したら
vercel logsコマンドでサーバーログ(Functions が残っている場合)を取得し、原因を特定します。
まとめ
- 静的エクスポートの核は
output: 'export'とnext buildの組み合わせ。これだけで完全な HTML・CSS·JS がout/に出力されます。 - 推奨する
next.config.js設定はtrailingSlash,basePath,images.remotePatternsを加えることで、サブパスや外部画像の取り扱いが楽になります。 - Vercel では「Framework Preset = Next.js」「Output Directory = out」を設定すれば自動ビルドが走りますが、GitHub Actions が不要になるわけではなく、テストやカスタム処理が必要な場合は併用が推奨です。
vercel.jsonによる rewrites / redirects / cache ヘッダー の設定と、環境変数・シークレットの安全管理で、静的サイトでも柔軟かつセキュアに運用できます。- ビルド失敗は主に「動的ページが未定義」「API Routes が残っている」ことが原因です。
getStaticPathsの正しい実装や Hybrid 構成への切り替えで対処しましょう。
これらの手順とベストプラクティスを踏めば、Next.js 13 で作った静的サイトを Vercel にシームレスにデプロイし、パフォーマンス・保守性ともに高い Web プロダクトを実現できます。