Next.jsにShadcn/uiを統合する:単なるコピペではなく、コンポーネントシステムをマスターしよう

Development tutorial - IT technology blog
Development tutorial - IT technology blog

Shadcn/uiは、あなたが普段使っているUIライブラリとは一線を画します

Material UI (MUI) や Ant Design を npm install でインストールすることに慣れているなら、Shadcn/uiは全く異なる体験をもたらすでしょう。実際、それは node_modules の中には存在しません。これは Radix UI と Tailwind CSS をベースに構築されたコンポーネントの集合体です。あなたは、そのソースコードを直接自分のプロジェクト内に所有することになります。

この違いが、絶対的なコントロール権をもたらします。MUIでは、内部の深いロジックをオーバーライドしようとすると、!important を多用したCSSの悪夢に陥ることがよくあります。対照的に、Shadcn/uiでは button.tsx ファイルが components/ui フォルダ内に直接置かれます。ローディングエフェクトを追加したり、DOM構造を変更したりしたいですか?ファイルを開いて直接修正するだけでいいのです。

Next.js UI:どの道を選ぶべきか?

コードを書く前に、なぜ Shadcn/ui が現在の「トレンド」になっているのか、全体像を把握しておきましょう。

  • 従来の UI Framework (MUI, AntD): プロトタイプを非常に素早く構築できます。しかし、Bundle Size が非常に重くなりがちで(gzippedで50-100KB追加されることも)、独自のデザインに合わせてUIをカスタマイズするのは苦行に近いものがあります。
  • Headless UI (Radix UI, Headless UI): 優れたロジックを提供しますが、CSSを100%自分で書く必要があります。これは独自の Design System を持つ大企業には適していますが、中小規模のプロジェクトでは時間がかかりすぎます。
  • Shadcn/ui: 理想的な交差点です。Radix UI の安定性と Tailwind CSS の柔軟性を兼ね備えています。整ったUIが最初から用意されていながら、コードの一行一行にまで介入することができます。

実案件でShadcn/uiを選ぶ理由

最近の5人の開発者によるSaaSプロジェクトでは、Shadcn/uiに切り替えたことで、UI制作時間を約30%削減できました。以下は、その3つの核心的な価値です。

  1. 絶対的な Bundle Size の制御: 本当に使うものだけを追加します。プロジェクトに Button と Input しか必要ない場合、フォルダにはその2つのコードだけが含まれます。巨大なライブラリを丸ごとユーザーのブラウザに読み込ませるようなことはもうありません。
  2. 無限のカスタマイズ性: コードがプロジェクト内にあるため、アニメーションのための framer-motion の統合や、react-hook-form との連携が非常にスムーズに行えます。
  3. Server Components への最適化: Shadcn/ui はクライアントロジックとサーバーロジックを明確に分離しています。これにより、アプリケーションは Lighthouse でより高いスコアを獲得でき、特に応答速度の指標が向上します。

実践的な導入:初期化からカスタマイズまで

Next.js プロジェクトに Shadcn/ui を導入するための標準的な手順は以下の通りです。

ステップ 1: プロジェクトの初期化

まずは、クリーンな Next.js プロジェクトから始めましょう(セットアップ中に Tailwind CSS を選択していることを確認してください)。

npx create-next-app@latest my-app --typescript --tailwind --eslint

ステップ 2: Shadcn/ui の設定

公式 CLI を使用して、tailwind.config.jscomponents.json ファイルの設定を自動化します:

npx shadcn-ui@latest init

私の経験上、よりモダンな外観にするにはスタイルに “New York” を選び、ベースカラーには後のブランドカラーと合わせやすい “Zinc” を選ぶのがおすすめです。

ステップ 3: コンポーネントの追加

コマンドを使って Button を追加してみましょう:

npx shadcn-ui@latest add button

すぐに components/ui/button.tsx ファイルが生成されます。この時点で、そのソースコードはあなたのものです。

実際の使用方法

コンポーネントの呼び出し方は非常に自然で簡潔です:

import { Button } from "@/components/ui/button"

export default function Page() {
  return (
    <main className="p-10">
      <Button variant="outline" size="default">
        今すぐチェック
      </Button>
    </main>
  )
}

よりクリーンなコードを書くための最適化のコツ

デフォルトのコンポーネントを使うだけで終わらせないでください。プロジェクトをよりプロフェッショナルにするために、以下のテクニックを適用しましょう。

1. CSS Variables によるテーマ変更

Shadcn/ui は globals.css 内の HSL 変数で色を管理しています。クライアントがメインカラーを青からオレンジに変更したいと言った場合、何百もの Tailwind クラスを探して置換する代わりに、一箇所で --primary 変数を更新するだけで済みます。

2. UI ファイルに複雑なロジックを直接書かない

ボタンをクリックするたびにロギングするロジックを追加したい場合、ui/button.tsx を直接修正するのは避けましょう。代わりに components/common/AppButton.tsx のようなラッパーを作成してください。こうすることで、将来 Shadcn CLI からソースコードをアップデートする際に、独自のロジックが上書きされる心配がなくなります。

3. Zod による超高速フォームバリデーション

Shadcn の Form コンポーネントは強力な武器です。react-hook-formzod が統合されています。エラーメッセージ完備の複雑な登録フォームを 10 分足らずで構築できます。

// 簡潔なスキーマ構造
const formSchema = z.object({
  email: z.string().email("無効なメールアドレスです"),
})

パフォーマンスとアクセシビリティ

よくある間違いは、必要もないのに大量のコンポーネントをプロジェクトに追加してしまうことです。黄金律は、「使うものだけを追加する」ことです。Radix UI をベースにしているため、これらのコンポーネントは最初からキーボードショートカットやスクリーンリーダーに対応しています。ソースコードを編集する際は、これらの重要な aria-* 属性を誤って削除しないよう注意してください。

実際、Shadcn のアクセシビリティ標準を維持しているプロジェクトは、Google の計測ツールで SEO と Accessibility の満点(100/100)を容易に達成できることが多いです。

おわりに

Shadcn/ui の統合は、単にツールをインストールすることではなく、柔軟な開発の考え方を選択することです。パッケージ化されたライブラリの制約から解放され、ビジネスロジックの解決に集中できるようになります。次のプロジェクトでぜひ試してみてください。開発スピードとコードの質の向上を実感できるはずです。

Share: