2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

2025 年、なぜ私は Headless UI を選ぶのか

Posted at

はじめに

フロントエンド開発における大きな課題のひとつは、「開発スピード」と「デザインの自由度」をどう両立するか です。従来の UI ライブラリ(Material UI や Ant Design など)は、確かに開発効率を大きく向上させてくれました。しかし、その一方で次のような問題もあります。

  • 強いデフォルトスタイルにより、!important や CSS 上書きの泥沼にハマる
  • フレームワークの「見た目」に縛られ、ブランド独自のデザインを実現しづらい
  • 完全に使わない場合は、開発効率が大幅に低下

こうした背景の中で、Tailwind CSS の普及とともに注目されているのが Headless UI というアプローチです。
今回は、私が2025年に実際に試した Nuxt UIshadcn/ui の2つの選択肢を比較しながら、Headless UI の魅力を整理します。

Nuxt UI:設定ベースでの柔軟性

まず押さえておきたいのは、 Nuxt UI は Headless UI ライブラリではないという点です。
Nuxt UI は、Headless UI(※v3 以降は Reka UI に移行)と Tailwind CSS をベースにした「スキン付き(Skinned)」コンポーネントライブラリです。

従来との違い

  • 従来の UI ライブラリ:CSS を上書きしてデザインを変更
  • Nuxt UIapp.config.ts で Tailwind クラスを設定して変更

例:ボタンのスタイルを変更

// app.config.ts
export default defineAppConfig({
  ui: {
    button: {
      variant: {
        solid: 'shadow-sm bg-primary text-white hover:bg-primary-600',
        outline: 'ring-1 ring-inset ring-primary text-primary hover:bg-primary-50'
      }
    }
  }
})

もちろん、Nuxt UI は app.config.ts を編集してカスタマイズできるだけでなく、各コンポーネントには ui プロパティがあり、さらにすべてのコンポーネントに slot が用意されているので、子コンポーネントの内容を自由に差し替えることもできます。これもかなり便利なポイントです。

Nuxt UI は最近 4.0 にアップデートされ、コンポーネントの数が大幅に増えました。現在の Nuxt 4 との開発体験もとても良いです。以前は Nuxt.js プロジェクト専用でしたが、今では Vue プロジェクトでも利用できます。また、Nuxt UI は Figma との連携も可能です。もし UI のカスタマイズをそこまで必要としないなら、私は Nuxt UI を選ぶと思います。

shadcn/ui:コード所有権という自由

shadcn/ui は、Headless UI の理念を徹底的に体現しています。
npm install はできません。 代わりに、CLI でコンポーネントのソースコードをプロジェクトにコピーします。

構成要素

  • Radix UI:アクセシビリティや複雑な UI ロジックを担当
  • Tailwind CSS:スタイルを担当

特徴

  • コード所有権components/ui/button.tsx は完全に自分のもの
  • 設定不要rounded-mdrounded-full に変えるだけで OK
  • 抽象化の壁がない:React/Vue + Tailwind + Radix さえ理解していれば十分

なぜ Headless UI が未来なのか?

抽象化コストの排除

従来の UI ライブラリは、学習コストや「抽象の壁」が避けられません。shadcn/ui では、コード=自分の資産なので、その壁が存在しません。

責務の明確な分離

  • Radix UI:複雑な UI ロジックとアクセシビリティ
  • Tailwind CSS:スタイル定義
  • 開発者:ビジネスロジックとデザイン

この分離により、UI の見た目と動作を完全にコントロールできます。

チーム開発に強い

新しいメンバーは巨大なライブラリのドキュメントを読む必要がありません。components/ui ディレクトリを見れば、どのように実装されているか一目で理解できます。コンポーネント構造が明示的で、チーム全体の保守性が向上します。

パフォーマンス最適

  • 必要なコンポーネントだけをコピーするため、無駄なコードがない
  • Radix + Tailwind は軽量かつ高速に動作

結論

私はもともと Tailwind が大好きで、もう5年近く使っています(機会があれば、この話も記事にしたいと思っています)。
そして、Tailwind ベースの UI フレームワークは今後さらに人気が高まると信じています。

Nuxt UI も悪くない選択肢です。開発体験を大きく向上させてくれます。
ただ、shadcn/ui が示す Headless モデルは、より深いレベルの課題を解決していると感じます。
もし会社に専任の UI デザイナーがいて、自社のブランドに合った独自のデザインを実現したいなら、この Headless UI アプローチを使うことで、開発効率を維持しながらデザインの一貫性を保つことができます。

一方で、非 Headless UI は、作者が提供する API の範囲でしか変更できず、本当のソースコードは node_modules の中に隠れたままです。
しかし、shadcn のような Headless UI は、ソースコードを直接プロジェクトに取り込み、完全に自分たちでコントロールできます。

この違いによって、開発体験もプロダクト体験も、従来の UI コンポーネントモデルよりはるかに優れたものになります。
だからこそ、私は 2025 年の今も、Headless UI の発展に大きな期待を寄せています。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?