デプロイ前に確認すべき項目を優先度別にまとめました。完了した項目にチェックを入れましょう。
next/image を使っている
画像は <img> ではなく next/image を使い、自動最適化・WebP変換・遅延ロードを有効にする
priority 属性を LCP 要素(ヒーロー画像など)に付ける。width/height を指定して CLS を防ぐ。
next/font を使っている
Google Fonts や外部フォントは next/font で読み込みレイアウトシフトを防ぐ
フォントのサブセット指定(subsets: ["latin", "latin-ext"])でファイルサイズを削減。
Serverコンポーネントを最大限活用している
"use client" は必要最小限に。インタラクティブな部分のみ Client Component にする
データ取得・静的コンテンツは Server Component で。バンドルサイズに影響する。
重いコンポーネントを dynamic() で遅延読み込みしている
Monaco Editor・Chart ライブラリなど初期表示に不要なものは動的インポートを使う
import dynamic from "next/dynamic" を使い、loading プロパティでフォールバックを指定。
Lighthouse スコアを確認している
Performance・Accessibility・Best Practices・SEO それぞれ 90点以上を目標にする
Chrome DevTools > Lighthouse タブ、または PageSpeed Insights で計測。
セキュリティヘッダーを設定している
X-Frame-Options・X-Content-Type-Options・Referrer-Policy などを next.config.ts の headers() で設定
// next.config.ts
async headers() {
return [{
source: '/(.*)',
headers: [
{ key: 'X-Frame-Options', value: 'SAMEORIGIN' },
{ key: 'X-Content-Type-Options', value: 'nosniff' },
{ key: 'Referrer-Policy', value: 'strict-origin-when-cross-origin' },
],
}];
}環境変数をクライアントに漏らしていない
NEXT_PUBLIC_ プレフィックスのない変数はサーバーサイドのみ。シークレットキーを公開しない
NEXT_PUBLIC_ がついた変数はバンドルに含まれブラウザで見えることを意識する。
Server Actions の入力をバリデーションしている
クライアントからの入力は信用しない。Zod などでサーバーサイドでバリデーションを行う
zodのschema.parse() や schema.safeParse() で型と値の両方を検証する。
CSRF 対策をしている
Next.js の Server Actions は組み込みの CSRF 対策があるが、Route Handlers は別途対策が必要
カスタム Route Handler でフォーム送信を受け取る場合は Origin ヘッダーの確認が必要。
dangerouslySetInnerHTML を使っていない(または DOMPurify でサニタイズ済み)
ユーザー入力を innerHTML に直接入れると XSS のリスクがある
どうしても必要な場合は dompurify でサニタイズしてから使う。
各ページの title と description を設定している
generateMetadata() または export const metadata でページ固有のメタデータを設定
title は 50〜60文字、description は 150〜160文字が推奨。
OGP(Open Graph Protocol)画像を設定している
SNSシェア時のサムネイル。opengraph-image.png を app/ に配置か ImageResponse で動的生成
og:image の推奨サイズは 1200×630px。
robots.txt と sitemap.xml を設定している
app/robots.ts と app/sitemap.ts で自動生成。クロール制御とインデックス促進
動的ルートは generateSitemaps() で全パスを列挙する。
構造化データ(JSON-LD)を追加している
Google の リッチリザルトに対応するため Article・BreadcrumbList・FAQ などのスキーマを設定
<script type="application/ld+json"> タグで head に追加する。
全ての画像に alt テキストがある
意味のある画像は説明的な alt を。装飾画像は alt=""
next/image の alt は必須プロパティなので書き忘れない。
キーボードのみで全機能を操作できる
Tab・Enter・Escape でフォーム送信・モーダル操作ができることを確認
onClick のみのカスタム要素には role と onKeyDown も追加する。
色だけで情報を伝えていない
エラーを赤色だけでなくアイコン・テキストでも表現する
カラーコントラスト比は WCAG AA 基準(4.5:1 以上)を満たす。
Lighthouse のアクセシビリティスコアが90点以上
aria 属性・フォームラベル・見出しの階層構造などを確認
axe DevTools 拡張機能で詳細な問題点を特定できる。
error.tsx を配置している
予期しないエラーが起きたときのフォールバックUIを設定する
"use client" が必須。reset() でリトライボタンも実装する。
not-found.tsx を配置している
404ページをブランドデザインに合わせてカスタマイズする
notFound() 関数を呼ぶと not-found.tsx が表示される。
API エラーを適切にハンドリングしている
fetch の res.ok チェック・エラーログ・ユーザーへのフィードバックを実装
Server Actions のエラーは return { error: "..." } で伝える(throw は避ける)。
本番環境の環境変数を設定している
API キー・DB 接続文字列など本番用の値を CI/CD・ホスティングサービスに設定
.env.local は Git に含めない(.gitignore に追加済みか確認)。
npm run build がエラーなく完了する
TypeScript エラー・ESLint エラーがないことを本番ビルドで確認
CI に npm run build を含めると自動で検出できる。
依存パッケージに known vulnerability がない
npm audit または Dependabot で脆弱性のあるパッケージをチェック
npm audit fix で修正可能なものは自動修正。
Core Web Vitals を本番環境で計測している
Search Console・PageSpeed Insights・Vercel Analytics などで実ユーザーのデータを確認
LCP ≤ 2.5s・INP ≤ 200ms・CLS ≤ 0.1 を目標にする。