この記事の対象読者
- AIツール(v0, Bolt, Claude Artifacts等)でUIを生成したら絵文字だらけになって困っている人
- Reactプロジェクトで適切なアイコンライブラリを選びたい人
- JavaScript / TypeScript でフロントエンド開発をしている人
この記事で得られること
- AIが絵文字を多用する「構造的な理由」と、その解決策
- 2026年時点の主要Reactアイコンライブラリ6選の特徴・使い分け
- CDN / npm それぞれの導入方法とコード例
- プロジェクト規模別の選定フローチャート
この記事で扱わないこと
1. なぜAIは絵文字を貼りたがるのか
最近、v0やBolt、Claude ArtifactsなどのAIツールでUIを自動生成する機会が増えた。試しに「ダッシュボードを作って」と頼むと、こんな画面が出来上がる。
📊 売上レポート
📈 前月比 +15%
⚙️ 設定
👤 プロフィール
🔔 通知 (3)
📁 ファイル管理
...うん、情報は伝わるけど、なんか幼稚園の掲示板みたいだ。
これ、AIが悪いわけじゃない。構造的な理由がある。
AIコード生成ツールは「外部依存を最小限にする」という設計思想で動いている。npm パッケージのインストールが必要なアイコンライブラリを使うと、ユーザーの環境で動かない可能性が出てくる。一方、絵文字はUnicodeの一部なのでどんな環境でも確実に表示される。AIにとっては「安全牌」なのだ。
つまりこの問題を「看板」に例えると、こういうことだ。
絵文字 = 手書きのマジックペン看板。誰でも作れるし、どこでも読める。でもお店の雰囲気は伝わらない。
アイコンライブラリ = プロがデザインしたサインシステム。統一感があり、ブランドの信頼性が一気に上がる。
空港やショッピングモールの案内表示が手書きマジックペンだったら不安になるだろう。UIも同じだ。
ではここから、手書きマジック看板をプロのサインシステムに置き換えていこう。
2. 主要アイコンライブラリ6選 ─ 一覧比較
読者が自分のプロジェクトに合ったライブラリを見つけられるよう、まず全体像を示す。以下の比較表は2026年4月時点のデータに基づいている。
| ライブラリ | アイコン数 | 週間DL数 | ウェイト | ライセンス | CDN | 特徴 |
|---|---|---|---|---|---|---|
| Lucide | 1,695+ | 5,300万+ | 1種 | ISC | 可 | shadcn/ui標準。軽量・Tree-shakable |
| Heroicons | 316 | - | 4種 | MIT | 可 | Tailwind CSS公式。少数精鋭 |
| Phosphor | 9,000+ | - | 6種 | MIT | 可 | Duotone対応。デザイン表現力が最強 |
| Tabler Icons | 5,900+ | - | 1種 | MIT | 可 | ダッシュボード特化。数も質も高い |
| React Icons | 40,000+ | - | 複数 | MIT | - | 複数ライブラリの統合パッケージ |
| Font Awesome | 63,000+ | - | 30種 | CC BY 4.0 / 商用 | 可 | 業界最古参。Pro版は有料 |
ウェイトとは? アイコンの線の太さや塗りのバリエーションのこと。例えば Phosphor なら Thin / Light / Regular / Bold / Fill / Duotone の6種類を提供しており、同じアイコンでもUIの雰囲気に合わせて使い分けられる。看板の例えで言えば「細字フォント」と「太字フォント」のように、1つのサインシステム内でトーンを調整できる仕組みだ。
では、各ライブラリを詳しく見ていこう。
3. 各ライブラリの詳細と導入方法
ここからは各ライブラリの特徴、導入コード、そして「どういうプロジェクトに向いているか」を1つずつ解説する。看板の例えを続けると、それぞれが「どんなお店に似合うサインシステムか」を意識しながら読んでほしい。
3.1 Lucide ─ 2026年のデファクトスタンダード
Feather Iconsのコミュニティフォークとして生まれたLucideは、2026年現在、Reactアイコンライブラリの中で週間ダウンロード数5,300万超という圧倒的な数字を叩き出している。shadcn/uiのデフォルトアイコンに採用されたことで、事実上の標準と言っていい。
看板で言えば、無印良品のサインシステム。シンプルで統一感があり、どんな空間にも馴染む。
npm導入:
npm install lucide-react
クリックでReactコード例を展開
import { Home, Settings, Bell, User, FileText, BarChart3 } from 'lucide-react';
function Dashboard() {
return (
<nav>
<NavItem icon={<BarChart3 size={20} />} label="売上レポート" />
<NavItem icon={<Settings size={20} />} label="設定" />
<NavItem icon={<User size={20} />} label="プロフィール" />
<NavItem icon={<Bell size={20} />} label="通知" />
<NavItem icon={<FileText size={20} />} label="ファイル管理" />
</nav>
);
}
function NavItem({ icon, label }: { icon: React.ReactNode; label: string }) {
return (
<div style={{ display: 'flex', alignItems: 'center', gap: 8, padding: '8px 12px' }}>
{icon}
<span>{label}</span>
</div>
);
}
CDN導入(非React環境向け):
<!-- unpkg経由 -->
<script src="https://unpkg.com/lucide@latest"></script>
<div>
<i data-lucide="home"></i>
<i data-lucide="settings"></i>
<i data-lucide="bell"></i>
</div>
<script>
lucide.createIcons();
</script>
また、lucide-static パッケージを使えば、imgタグで個別のSVGファイルを読み込むことも可能だ。
<img src="https://unpkg.com/lucide-static@latest/icons/home.svg" alt="Home" width="24" height="24">
Lucideはv1.0でブランドアイコン(GitHub, Twitter等のロゴ)を削除した。ブランドロゴが必要な場合は後述の Simple Icons や Font Awesome を併用する必要がある。
Lucideが向いているプロジェクト:
- shadcn/ui や Tailwind CSS ベースのプロジェクト
- バンドルサイズを極限まで絞りたいプロダクション環境
- 「迷ったらこれ」という安定択が欲しいとき
3.2 Heroicons ─ Tailwind公式の少数精鋭
Tailwind CSSの開発元であるTailwind Labs が作ったアイコンライブラリ。アイコン数はわずか316と少ないが、その分全アイコンのデザイン品質が高く、統一感が抜群だ。Outline / Solid / Mini(20x20)/ Micro(16x16)の4バリアントを提供する。
看板の例えなら、Apple Storeのサインシステム。数は少ないが、1つ1つが洗練されている。
npm導入:
npm install @heroicons/react
クリックでReactコード例を展開
// Outline(24x24、線のみ)
import { HomeIcon, Cog6ToothIcon, BellIcon } from '@heroicons/react/24/outline';
// Solid(24x24、塗りつぶし)
import { HomeIcon as HomeIconSolid } from '@heroicons/react/24/solid';
// Mini(20x20、コンパクト)
import { HomeIcon as HomeIconMini } from '@heroicons/react/20/solid';
function Sidebar() {
return (
<nav className="flex flex-col gap-2">
<SidebarItem icon={<HomeIcon className="w-5 h-5" />} label="ホーム" />
<SidebarItem icon={<Cog6ToothIcon className="w-5 h-5" />} label="設定" />
<SidebarItem icon={<BellIcon className="w-5 h-5" />} label="通知" />
</nav>
);
}
CDN導入:
HeroiconsはCDN向けの公式パッケージを提供していないが、SVGファイルを直接参照できる。
<!-- GitHub raw経由で個別SVGを読み込む -->
<img src="https://raw.githubusercontent.com/tailwindlabs/heroicons/master/optimized/24/outline/home.svg"
alt="Home" width="24" height="24">
Heroiconsが向いているプロジェクト:
- Tailwind CSSがメインのプロジェクト(デザイン言語が完全一致する)
- 316アイコンで足りるシンプルなUI
- 「この範囲内で作る」という制約が逆に品質を担保する場面
3.3 Phosphor Icons ─ デザイン表現力の王者
Phosphor は6種類のウェイト(Thin / Light / Regular / Bold / Fill / Duotone)を全9,000以上のアイコンで提供する、表現力の面で頭一つ抜けたライブラリだ。特にDuotoneスタイルは、2色を使い分けてアイコンに奥行きを出せるため、他のライブラリでは真似できないリッチな表現が可能になる。
看板の例えなら、高級ホテルのサインシステム。重厚感のあるものから軽やかなものまで、シーンに応じてトーンを変えられる。
npm導入:
npm install @phosphor-icons/react
クリックでReactコード例を展開
import { House, Gear, Bell, User, FileText } from '@phosphor-icons/react';
function Dashboard() {
return (
<nav>
{/* ウェイトを変えるだけで雰囲気が変わる */}
<House size={24} weight="regular" /> {/* 通常 */}
<Gear size={24} weight="duotone" /> {/* 2色のリッチ表現 */}
<Bell size={24} weight="fill" /> {/* 塗りつぶし */}
<User size={24} weight="thin" /> {/* 細い線画 */}
<FileText size={24} weight="bold" /> {/* 太字 */}
</nav>
);
}
CDN導入:
<script src="https://unpkg.com/@phosphor-icons/web@2"></script>
<!-- classで指定する方式 -->
<i class="ph ph-house"></i>
<i class="ph-duotone ph-gear"></i>
<i class="ph-fill ph-bell"></i>
PhosphorのDuotoneスタイルはCSSの --ph-duotone-primary と --ph-duotone-secondary カスタムプロパティで2色を個別制御できる。ブランドカラーに合わせた微調整が利くのが強みだ。
Phosphorが向いているプロジェクト:
- デザイン品質を最優先にするプロダクト
- 同一アイコンで「通常 / 選択中 / 無効」などの状態をウェイトで表現したいUI
- Duotoneでブランドカラーを活かしたい場面
3.4 Tabler Icons ─ ダッシュボードの味方
5,900以上のアイコンを全て24x24グリッド・2pxストロークで統一した、管理画面やダッシュボードに最適なライブラリ。MITライセンスで完全無料。数の多さと品質の高さを両立している。
看板の例えなら、大型商業施設のフロアガイド。膨大な情報量をわかりやすく整理するために設計されたシステムだ。
npm導入:
npm install @tabler/icons-react
クリックでReactコード例を展開
import {
IconHome, IconSettings, IconBell,
IconUser, IconFileText, IconChartBar
} from '@tabler/icons-react';
function AdminSidebar() {
return (
<nav>
<IconHome size={20} stroke={1.5} />
<IconSettings size={20} stroke={1.5} />
<IconBell size={20} stroke={1.5} />
<IconChartBar size={20} stroke={1.5} />
</nav>
);
}
CDN導入:
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@tabler/icons-webfont@latest/dist/tabler-icons.min.css">
<i class="ti ti-home"></i>
<i class="ti ti-settings"></i>
<i class="ti ti-bell"></i>
Tabler Iconsが向いているプロジェクト:
- 管理画面、ダッシュボード、データ表示系のUI
- アイコンの種類が大量に必要な大規模プロジェクト
- 無料で5,900種以上のアイコンが必要な場面
3.5 React Icons ─ 全部入りのスイスアーミーナイフ
React Iconsは自前のアイコンセットを持たない。代わりにFont Awesome、Material Design、Heroicons、Feather、Lucide、Bootstrap等の20以上のライブラリを1パッケージに統合し、統一的なAPIで使えるようにしたものだ。
看板の例えなら、フードコートの看板。和食もイタリアンも中華も全部1フロアに揃っている。便利だが、全体の統一感は各店舗任せだ。
npm導入:
npm install react-icons
クリックでReactコード例を展開
// Font Awesome から
import { FaHome, FaCog } from 'react-icons/fa';
// Material Design から
import { MdNotifications } from 'react-icons/md';
// Lucide(Feather系)から
import { LuUser, LuFileText } from 'react-icons/lu';
function MixedIconsExample() {
return (
<nav>
<FaHome size={20} />
<FaCog size={20} />
<MdNotifications size={20} />
<LuUser size={20} />
</nav>
);
}
React Iconsは便利だが、異なるライブラリのアイコンを混在させるとデザインの統一感が崩れる。Font Awesome のアイコンと Material Design のアイコンは線の太さやスタイルが異なるため、同じ画面に並べると違和感が出る。1プロジェクト内では1つのアイコンセットに統一するのが鉄則だ。
React Iconsが向いているプロジェクト:
- プロトタイピングや検証段階で「とりあえず何でも揃う」状態にしたいとき
- 複数のアイコンセットを比較検討しながら開発を進めたいとき
- 最終的にどのアイコンセットを使うか決まっていない初期フェーズ
3.6 Font Awesome ─ 最古参の巨塔
2012年から存在する業界最古参のアイコンライブラリ。v7.1時点でPro版は63,000以上、無料版でも2,089のアイコンを提供する。30種類のスタイル(Solid, Regular, Light, Thin, Sharp, Duotone等)は他を圧倒する。
看板の例えなら、国際空港のサインシステム。歴史が長く、世界中で認知されており、あらゆるユースケースをカバーする。ただし、システム全体は重厚で導入コストが高い。
CDN導入(最も手軽):
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.2/css/all.min.css">
<i class="fa-solid fa-house"></i>
<i class="fa-regular fa-bell"></i>
<i class="fa-brands fa-github"></i> <!-- ブランドアイコンも豊富 -->
npm導入(React向け):
npm install @fortawesome/fontawesome-svg-core @fortawesome/free-solid-svg-icons @fortawesome/react-fontawesome
クリックでReactコード例を展開
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { faHome, faCog, faBell } from '@fortawesome/free-solid-svg-icons';
function Navbar() {
return (
<nav>
<FontAwesomeIcon icon={faHome} />
<FontAwesomeIcon icon={faCog} />
<FontAwesomeIcon icon={faBell} />
</nav>
);
}
Font Awesomeの無料版アイコンは CC BY 4.0 ライセンスだが、Pro版は有料サブスクリプションが必要。商用利用する場合はライセンス体系を必ず確認すること。また、React向けのパッケージ構成が複雑で、必要なパッケージが3つに分かれている点も注意だ。
Font Awesomeが向いているプロジェクト:
- ブランドアイコン(GitHub, Twitter, Facebookなど)を大量に使う必要がある場面
- 既存プロジェクトで既にFont Awesomeが導入されている場合
- CDNだけで手軽にアイコンを使いたい非Reactプロジェクト
4. 選定フローチャート ─ 結局どれを使えばいいのか
ここまで6つのライブラリを紹介してきたが、「で、結局どれ?」という声が聞こえる。以下のフローチャートで判断してほしい。
迷ったらLucideを選んでおけば間違いない。2026年のReactエコシステムにおける標準的な選択肢であり、Tree-shakingのサポート、TypeScriptの型定義、バンドルサイズの軽さ、どれを取っても高水準だ。
ただし、Lucideは「どこでも見る」存在になりつつある。デザインの差別化を重視するならPhosphorのDuotoneスタイル、管理画面のアイコン量が必要ならTabler Icons、という使い分けを意識するとよい。
5. 実践: 絵文字UIをアイコンに置き換えるBefore / After
百聞は一見にしかず。冒頭の「絵文字だらけUI」をLucideで書き換えてみよう。
Before(絵文字版):
function DashboardBefore() {
return (
<div>
<h1>📊 売上レポート</h1>
<p>📈 前月比 +15%</p>
<button>⚙️ 設定</button>
<button>👤 プロフィール</button>
<button>🔔 通知 (3)</button>
</div>
);
}
After(Lucide版):
import { BarChart3, TrendingUp, Settings, User, Bell } from 'lucide-react';
function DashboardAfter() {
return (
<div>
<h1><BarChart3 size={24} className="inline mr-2" />売上レポート</h1>
<p><TrendingUp size={18} className="inline mr-1 text-green-500" />前月比 +15%</p>
<button><Settings size={18} className="mr-1" />設定</button>
<button><User size={18} className="mr-1" />プロフィール</button>
<button><Bell size={18} className="mr-1" />通知 (3)</button>
</div>
);
}
違いは明白だ。絵文字版は「とりあえず置いた」感が拭えないが、Lucide版は線の太さ・サイズ・色が統一されており、プロフェッショナルな印象になる。看板の比喩に戻れば、マジックペンの手書きが、統一されたピクトグラムに変わった瞬間だ。
6. よくあるトラブルと対処法
アイコンライブラリの導入時にハマりやすいポイントをまとめた。
| 症状 | 原因 | 対処法 |
|---|---|---|
| アイコンが表示されない(React) | Tree-shakingでimportが除去された | 名前付きimportで個別に読み込む。import * as Icons は避ける |
| アイコンがやたら大きい | SVGのデフォルトサイズが親要素に追従 |
size propまたは width / height を明示的に指定する |
Lucide CDN版で data-lucide が反映されない |
lucide.createIcons() の呼び出し忘れ |
スクリプト読み込み後に lucide.createIcons() を実行する |
| Font Awesome のアイコンが一部表示されない | 無料版に含まれないPro専用アイコンを使っている | 公式サイトでアイコン検索時に「Free」フィルターをかける |
| 異なるライブラリのアイコンでスタイルがバラバラ | ライブラリごとにストローク幅・グリッドサイズが異なる | 1プロジェクト内では1ライブラリに統一する |
Next.js App Routerで "use client" エラー |
サーバーコンポーネントでアイコンをimportした | アイコンを使うコンポーネントに "use client" を付与する。Phosphorは React Server Component をサポート済み |
7. 学習ロードマップ
アイコンライブラリの活用レベルを3段階で示す。
初級: まずは1つのライブラリを導入する
- Lucideをインストールして、プロジェクトの絵文字を全てアイコンに置き換える
-
sizeとcolorの基本的なカスタマイズを覚える
中級: デザインシステムにアイコンを組み込む
- アイコンサイズ・ストローク幅のルールを定義する(例: ナビゲーション=20px、見出し=24px)
- アクセシビリティ対応を入れる(
aria-label、decorativeなアイコンにはaria-hidden="true") - Phosphorのウェイト切り替えで「通常/アクティブ/無効」状態を表現する
上級: パフォーマンス最適化とカスタムアイコン
- SVGスプライトを使ったバンドルサイズの最適化
- 自社ブランド用のカスタムアイコンをLucide Labに統合する
-
@iconify/reactを使って複数ライブラリのアイコンを統一APIで扱う
まとめ
AIが生成するUIの「絵文字だらけ感」は、AIの限界ではなく、外部依存を避けるという合理的な設計判断の副作用だ。解決策は単純で、適切なアイコンライブラリを導入すればいい。
2026年の選択肢を整理すると:
- 迷ったらLucide。 週間DL 5,300万超、shadcn/ui標準。Reactエコシステムの共通言語になっている
- デザインの差別化にはPhosphor。 6ウェイト + Duotoneは他にない武器
- Tailwind純正ならHeroicons。 316個で足りるなら最高のフィット感
- ダッシュボード大量アイコンならTabler Icons。 5,900個がMITライセンスで無料
- CDN一発で使いたいならFont Awesome。 歴史と実績は伊達じゃない
- 全部試したいならReact Icons。 ただし本番では1セットに絞ること
絵文字は「動けばいい」フェーズには便利だが、プロダクトとして世に出すなら看板をプロ仕様にアップグレードしよう。npm install lucide-react のたった1行で、UIの印象は劇的に変わる。
この記事が参考になったら、いいね・ストックしていただけると励みになります。
筆者X