Nexeed Lab

v0でUIコンポーネントをAI生成してNext.jsに組み込む実践ガイド

v0でUIコンポーネントをAI生成してNext.jsに組み込む実践ガイド

フロントエンド開発における最大の悩みのひとつが、「UIコンポーネントの実装に時間がかかりすぎる」という問題です。デザインカンプを渡されて、それをReactコンポーネントに落とし込む作業——TailwindCSSのクラスを手で書き、レスポンシブ対応を施し、shadcn/uiのAPIを調べながら組み合わせる……このプロセスに1〜2時間消耗することも珍しくありません。

そんな状況を劇的に変えるツールが、Vercelが提供する v0(ブイゼロ)です。v0はテキストプロンプトや画像を入力するだけで、即座にReactコンポーネントのコードを生成してくれるAIツール。しかもそのコードはTailwindCSSとshadcn/uiをベースにしており、Next.jsプロジェクトとの親和性が非常に高いのが特長です。

この記事では、v0の基本的な使い方から生成したコンポーネントをNext.jsプロジェクトに実際に組み込むまでの手順を、コード例を交えながら丁寧に解説します。「AIが生成したコードって実際に使えるの?」という疑問にも、実践的な視点でお答えします。


v0とは何か:VercelのAI UIジェネレーター

v0 はVercelが2023年に公開したAIベースのUIコンポーネント生成ツールです。2024年以降、急速に機能が拡充され、現在では多くのフロントエンド開発者の間で実戦投入されています。

v0の主な特徴

生成物の品質が高い v0が生成するコードは、shadcn/ui のコンポーネントライブラリと TailwindCSS をベースにしています。shadcn/uiはRadix UIをベースにしたアクセシビリティ対応のコンポーネント集であり、v0が出力するコードはそのままプロダクションに使えるレベルのクオリティを持っています。

対話的に改善できる ChatGPTのようなチャットインターフェースで「もっとシンプルに」「カラーをブランドカラーに合わせて」「ダークモード対応を追加」といった追加指示ができます。生成→確認→修正のサイクルを素早く回せるのが強みです。

コードをそのままコピー・インストールできる v0はコードのコピーだけでなく、CLIを使ったコンポーネントの直接インストール機能(npx v0@latest add)も提供しています。これにより、生成したコンポーネントを手作業でファイルに貼り付ける手間も省けます。

料金体系 v0は無料プランと有料プランが存在します。無料プランでも月ごとに一定のメッセージ数(クレジット)が使用でき、個人開発やプロトタイピングには十分です。より多くの生成や高度な機能を使う場合は有料プラン(月額$20〜)を検討しましょう。最新の料金はv0公式サイトで確認してください。


事前準備:Next.jsプロジェクトとshadcn/uiのセットアップ

v0が生成するコンポーネントを最大限活用するためには、プロジェクト側にshadcn/uiがセットアップされている必要があります。まだの方は以下の手順で準備してください。

Next.jsプロジェクトの作成

# Next.jsプロジェクトを作成(TypeScript + Tailwind CSS + App Router を選択)
npx create-next-app@latest my-v0-app

# 選択肢の推奨設定:
# ✔ 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 the `src/` directory? → No(好みで)
# ✔ Would you like to use App Router? → Yes
# ✔ Would you like to customize the default import alias? → No

cd my-v0-app

shadcn/uiの初期化

# shadcn/uiを初期化
npx shadcn@latest init

# 選択肢の推奨設定:
# ✔ Which style would you like to use? → Default
# ✔ Which color would you like to use as the base color? → Slate
# ✔ Would you like to use CSS variables for theming? → Yes

この初期化により、components/ui/ ディレクトリと lib/utils.ts(cn関数)が自動生成され、tailwind.config.ts および globals.css も適切に更新されます。これでv0が生成するコンポーネントを受け入れる準備が整いました。

公式ドキュメント参照: shadcn/uiの詳細なセットアップ手順は shadcn/ui Installation for Next.js を参照してください。


v0でコンポーネントを生成する:実践手順

それでは実際にv0を使ってコンポーネントを生成してみましょう。今回は「ダッシュボードのKPIカード」を例に取り上げます。

STEP 1:v0にアクセスしてプロンプトを入力する

v0.dev にアクセスし、Vercelアカウントでログインします(GitHubアカウントでサインインが簡単です)。

チャット欄に以下のようなプロンプトを入力してみましょう:

Create a KPI dashboard card component with the following features:
- Shows a metric title (e.g., "Total Revenue")
- Displays a large number value with a currency prefix
- Shows a percentage change indicator (positive = green, negative = red)
- Includes a small trend icon (arrow up or down)
- Uses a clean, minimal design with a white card and subtle shadow
- Fully responsive and built with shadcn/ui and Tailwind CSS

プロンプトのコツ:英語で入力するほうが精度が高い傾向がありますが、日本語でも十分に機能します。「どんなコンポーネントか」「どんな要素を含むか」「どんなデザインテイストか」の3点を明確に伝えると良い結果が得られます。

STEP 2:生成されたコードを確認・調整する

v0が数秒でコンポーネントのプレビューとコードを生成します。プレビューを確認し、必要であれば追加の指示を与えましょう。

例えば:

  • 「カードの角をもう少し丸くして」
  • 「値の下にスパークラインのグラフを追加して」
  • 「ダークモードでも見やすいようにしてほしい」

このような自然言語での追加指示で、イメージ通りのコンポーネントに近づけていけます。

STEP 3:コードをプロジェクトに組み込む方法(2通り)

方法A:CLIでインストール(推奨)

v0のUIに表示される「Add to codebase」ボタンをクリックすると、以下のようなコマンドが表示されます:

npx v0@latest add [生成されたコンポーネントのID]

このコマンドをプロジェクトのルートで実行すると、必要なshadcn/uiコンポーネントの依存関係も含めて自動的にファイルが生成されます。非常に便利なので、こちらを優先的に使いましょう。

方法B:手動でコピー&ペースト

v0の「Code」タブからコードをコピーし、プロジェクトの components/ ディレクトリに新しいファイルとして保存します。

例として、v0が生成したKPIカードコンポーネントは以下のような構造になります:

// components/kpi-card.tsx
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"
import { TrendingUp, TrendingDown } from "lucide-react"
import { cn } from "@/lib/utils"

interface KpiCardProps {
  title: string
  value: string
  change: number
  prefix?: string
}

export function KpiCard({ title, value, change, prefix = "" }: KpiCardProps) {
  const isPositive = change >= 0

  return (
    <Card className="w-full">
      <CardHeader className="pb-2">
        <CardTitle className="text-sm font-medium text-muted-foreground">
          {title}
        </CardTitle>
      </CardHeader>
      <CardContent>
        <div className="text-2xl font-bold">
          {prefix}{value}
        </div>
        <div
          className={cn(
            "flex items-center gap-1 mt-2 text-sm font-medium",
            isPositive ? "text-emerald-600" : "text-red-600"
          )}
        >
          {isPositive ? (
            <TrendingUp className="h-4 w-4" />
          ) : (
            <TrendingDown className="h-4 w-4" />
          )}
          <span>{isPositive ? "+" : ""}{change}%</span>
          <span className="text-muted-foreground font-normal ml-1">vs 先月</span>
        </div>
      </CardContent>
    </Card>
  )
}

手動コピーの場合、必要なshadcn/uiコンポーネントが不足している場合があります。エラーが出たら以下のように追加インストールしましょう:

# 例:Cardコンポーネントが必要な場合
npx shadcn@latest add card

# lucide-reactが必要な場合
npm install lucide-react

生成コンポーネントをNext.jsのページに組み込む

コンポーネントの準備ができたら、実際のページに組み込んでみましょう。

ページへの実装例

// app/dashboard/page.tsx
import { KpiCard } from "@/components/kpi-card"

const kpiData = [
  {
    title: "総売上",
    value: "1,284,500",
    change: 12.5,
    prefix: "¥",
  },
  {
    title: "新規ユーザー",
    value: "3,842",
    change: 8.1,
    prefix: "",
  },
  {
    title: "解約率",
    value: "2.4",
    change: -0.3,
    prefix: "",
  },
  {
    title: "平均注文額",
    value: "15,200",
    change: 4.7,
    prefix: "¥",
  },
]

export default function DashboardPage() {
  return (
    <main className="container mx-auto py-8 px-4">
      <h1 className="text-2xl font-bold mb-6">ダッシュボード</h1>
      <div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4">
        {kpiData.map((kpi) => (
          <KpiCard
            key={kpi.title}
            title={kpi.title}
            value={kpi.value}
            change={kpi.change}
            prefix={kpi.prefix}
          />
        ))}
      </div>
    </main>
  )
}

npm run dev で開発サーバーを起動し、http://localhost:3000/dashboard にアクセスすれば、4つのKPIカードが並んだダッシュボードが表示されます。レスポンシブ対応も最初から組み込まれているので、スマートフォンでも崩れません。


v0活用のベストプラクティスと注意点

v0を実務で活用するうえで押さえておきたいポイントをまとめます。

生成コードは必ずレビューする

v0が生成するコードは品質が高い一方で、以下の点には注意が必要です:

型安全性の確認:TypeScriptの型が緩く定義されている場合があります。特にpropsの型は必要に応じて厳密化しましょう。

アクセシビリティの確認:shadcn/ui自体はアクセシビリティに配慮していますが、v0が生成する文言やaria属性が適切かどうかは確認が必要です。

パフォーマンスの確認:画像を含むコンポーネントでは、Next.jsの <Image> コンポーネントが使われていない場合があります。<img> タグが使われている箇所は next/image に置き換えましょう。

プロンプトを具体的にするほど精度が上がる

「かっこいいナビゲーションバーを作って」よりも、「ロゴ(左側)、ナビリンク5個(中央)、ログインボタン(右側)を持つナビゲーションバー。スクロール時に背景をfrosted glassエフェクトにし、モバイルではハンバーガーメニューに切り替える」のように詳細を伝えるほど、意図に近いコードが生成されます。

既存のデザインシステムに合わせる

v0はshadcn/uiのCSSカスタム変数を使ってテーマを管理しています。globals.css のカスタム変数(--primary--background など)を自社のブランドカラーに設定しておけば、v0が生成したコンポーネントも自動的にブランドに沿ったカラーになります。

/* app/globals.css の :root 内を変更する例 */
:root {
  --primary: 217 91% 60%;     /* ブランドカラー(青系) */
  --primary-foreground: 0 0% 100%;
  --background: 0 0% 100%;
  --foreground: 222 47% 11%;
}

.dark {
  --primary: 217 91% 70%;
  --primary-foreground: 222 47% 11%;
  --background: 222 47% 11%;
  --foreground: 210 40% 98%;
}

複雑なロジックはコンポーネントの外に切り出す

v0が生成するコンポーネントにはUIのロジックが混在することがあります。APIフェッチやビジネスロジックはServer Componentsやカスタムフックに切り出し、v0生成コンポーネントはプレゼンテーションに徹させるアーキテクチャにすると保守性が高まります。

// hooks/use-kpi-data.ts(カスタムフックに分離)
import { useEffect, useState } from "react"

interface KpiData {
  title: string
  value: string
  change: number
  prefix: string
}

export function useKpiData() {
  const [data, setData] = useState<KpiData[]>([])
  const [isLoading, setIsLoading] = useState(true)

  useEffect(() => {
    // 実際のAPIからデータを取得
    fetch("/api/kpi")
      .then((res) => res.json())
      .then((json) => {
        setData(json)
        setIsLoading(false)
      })
  }, [])

  return { data, isLoading }
}

このようにUIとデータ取得を分離することで、v0でUIを再生成・更新する際にロジック部分への影響を最小限に抑えられます。


v0と他のAIコーディングツールとの使い分け

v0はUIコンポーネント生成に特化しており、用途に応じて他のツールと組み合わせるのが実務的なアプローチです。

ツール 得意なこと v0との組み合わせ方
v0 UIコンポーネントの生成・調整 ベースとなるUIを高速生成
Cursor / GitHub Copilot コード全般の補完・修正 v0生成コードの細かい調整・ロジック追加
Claude Code プロジェクト横断的なリファクタリング v0コードの品質向上・型整備
Bolt.new フルスタックアプリの試作 初期プロトタイプ段階

よくあるワークフローとしては:v0でUIコンポーネントを生成 → CursorやClaude Codeで微調整・ロジック実装 → Next.jsのApp Routerでページに組み込む という流れが効率的です。


まとめ:v0でフロントエンド開発のスピードを上げよう

v0はVercelが提供するAI UIジェネレーターで、テキストプロンプトからshadcn/ui + TailwindCSSベースの高品質なReactコンポーネントを瞬時に生成してくれます。Next.jsとの相性が抜群で、npx v0@latest add コマンドによるワンコマンドインストールにより、生成したコンポーネントをプロジェクトに取り込むまでの摩擦が極限まで下げられています。

今すぐ試せる次のアクション:

  1. v0.dev にアクセスして無料アカウントを作成する
  2. 既存のNext.jsプロジェクトにshadcn/uiをセットアップする(npx shadcn@latest init
  3. 業務で必要な任意のUIコンポーネントをv0に生成させてみる
  4. npx v0@latest add でプロジェクトに組み込み、実際に動かしてみる

UIコンポーネントの実装に費やしていた時間を、ビジネスロジックやユーザー体験の改善に回せるようになります。まずは小さなコンポーネントから試してみてください。


参考資料

この記事をシェア

XFacebookはてブ