feather-icons、feather-icons-react、lucide-react、remixicon-react は、いずれも Web アプリケーションでアイコンを表示するためのライブラリですが、実装アプローチとメンテナンス状況に大きな違いがあります。feather-icons は元の JavaScript ライブラリであり、React で使用する場合は追加のラッパーが必要です。feather-icons-react はそれを React 用にラップしたコミュニティ製パッケージですが、現在はメンテナンスが停滞している可能性があります。一方、lucide-react は Feather Icons のフォークとして誕生し、より多くのアイコンと優れたツリーシェイキングサポートを提供する、現在推奨されるモダンな選択肢です。remixicon-react は Remix Icon セットを React コンポーネントとして利用するためのラッパーで、異なるデザインシステムを必要とする場合に有効です。
現代のフロントエンド開発において、アイコンの扱いは単なる「画像の表示」ではなく、パフォーマンス、アクセシビリティ、そしてメンテナンス性に直結する重要なアーキテクチャ決定です。feather-icons、feather-icons-react、lucide-react、remixicon-react は、それぞれ異なる歴史と技術的アプローチを持っています。これらがどのように動作し、なぜ lucide-react が現在のデファクトスタンダードになりつつあるのか、技術的な観点から深掘りします。
アイコンライブラリを選ぶ際、最も重要な違いは「どのようにアイコンをレンダリングするか」です。
feather-icons は、本来 Vanilla JavaScript 向けに設計されており、DOM 要素に data-feather 属性を追加し、スクリプトで SVG に置換する方式を採用しています。
// feather-icons: 本来の使い方 (Vanilla JS)
import feather from 'feather-icons';
// DOM 内の <i data-feather="camera"></i> を SVG に置換
feather.replace();
feather-icons-react は、これを React コンポーネントとしてラップしたものです。しかし、内部では依然として元のライブラリに依存しているため、React のライフサイクルと完全に統合されているわけではありません。
// feather-icons-react: ラッパー使用
import Icon from 'feather-icons-react';
function App() {
return <Icon name="camera" size={24} color="#000" />;
}
lucide-react は、最初から React 用に設計されており、各アイコンが個別のコンポーネントとしてエクスポートされています。これにより、DOM 操作は不要になり、React のレンダリングサイクルに完全に統合されます。
// lucide-react: ネイティブ React コンポーネント
import { Camera } from 'lucide-react';
function App() {
return <Camera size={24} color="#000" />;
}
remixicon-react も同様に、各アイコンを個別のコンポーネントとして提供しますが、Remix Icon のデザインシステムに基づいています。
// remixicon-react: ネイティブ React コンポーネント
import { RiCameraLine } from 'remixicon-react';
function App() {
return <RiCameraLine size={24} color="#000" />;
}
バンドルサイズを最適化する上で、ツリーシェイキング(不要なコードを削除する機能)のサポートは決定的な違いを生みます。
feather-icons と feather-icons-react は、すべてのアイコンデータを含む単一のオブジェクトまたはコンポーネントをインポートする傾向があります。これにより、1 つのアイコンしか使わなくても、すべてのアイコンデータがバンドルに含まれてしまうリスクがあります。
// feather-icons-react: 全アイコンがインポートされる可能性あり
import Icon from 'feather-icons-react';
// 内部で全アイコンデータを読み込んでいる場合、ツリーシェイキングが効きにくい
lucide-react と remixicon-react は、ES Modules の Named Exports を採用しています。これにより、使用したアイコンだけがバンドルに含まれます。
// lucide-react: 使用したアイコンのみがバンドルされる
import { Camera, User } from 'lucide-react';
// 'Camera' と 'User' 以外のアイコンコードは削除される
// remixicon-react: 同様にツリーシェイキング対応
import { RiCameraLine, RiUserLine } from 'remixicon-react';
ライブラリのメンテナンス状況は、長期プロジェクトにおいて最も重要な要素の一つです。
feather-icons は元の作成者によってメンテナンスが停滞しており、新しいアイコンの追加やバグ修正が頻繁に行われていません。これに伴い、feather-icons-react もコミュニティによるメンテナンスに依存しており、React の新しい機能(例えば Server Components など)への対応が遅れる可能性があります。
lucide-react は、Feather Icons のコミュニティフォークとして始まりました。Feather のデザイン哲学を継承しつつ、不足していたアイコンを補充し、活発にメンテナンスされています。現在、多くのモダンなフレームワーク(Next.js, Remix, Vite など)でデファクトとして推奨されています。
remixicon-react は、Remix Icon という大規模なアイコンセットを元にしています。アイコンの数は豊富ですが、ラッパーパッケージのメンテナンスはコミュニティに依存します。公式の Remix Icon は Web フォントや SVG スプライトを主としており、React 用ラッパーはサードパーティ製である点を理解しておく必要があります。
アイコンの視覚的なスタイルも選定基準になります。
feather-icons と lucide-react は、同じルーツを持つため、非常に似た「線画(アウトライン)」スタイルを持っています。Lucide は Feather よりもストロークの調整が行き届いており、より一貫性があります。
// lucide-react: プロパティによる簡単なカスタマイズ
<Camera
size={32}
color="currentColor"
strokeWidth={1.5}
className="custom-class"
/>
remixicon-react は、線画(Line)と塗りつぶし(Fill)の両方を用意しており、より表現の幅が広いです。ただし、スタイルの一貫性を保つためには、Line か Fill かを統一する設計判断が必要です。
// remixicon-react: Line と Fill から選択可能
import { RiCameraLine, RiCameraFill } from 'remixicon-react';
// 文脈に応じて使い分け
<RiCameraLine /> // 通常状態
<RiCameraFill /> // アクティブ状態
技術的な観点から、feather-icons および feather-icons-react は新規プロジェクトでの使用を推奨しません。理由は以下の通りです:
feather-icons の replace() メソッドは直接 DOM を操作するため、React の仮想 DOM と競合する可能性があります。代わりに、lucide-react への移行を強く推奨します。API が非常に似ているため、移行コストは低く抑えられます。
// 移行例:feather-icons-react から lucide-react へ
// Before (feather-icons-react)
import Icon from 'feather-icons-react';
<Icon name="camera" />
// After (lucide-react)
import { Camera } from 'lucide-react';
<Camera />
| 特徴 | feather-icons | feather-icons-react | lucide-react | remixicon-react |
|---|---|---|---|---|
| 主な用途 | Vanilla JS | React (レガシー) | React (モダン) | React (多様性) |
| 実装方式 | DOM 操作 (replace) | ラッパーコンポーネント | ネイティブコンポーネント | ネイティブコンポーネント |
| ツリーシェイキング | ❌ 困難 | ⚠️ 限定的 | ✅ 完全対応 | ✅ 完全対応 |
| メンテナンス | 🔴 停滞 | 🟡 コミュニティ | 🟢 活発 | 🟡 コミュニティ |
| アイコン数 | 280+ | 280+ | 1000+ | 2000+ |
| デザイン | アウトライン | アウトライン | アウトライン | 線画 & 塗りつぶし |
lucide-react が現在のベストチョイスです。Feather Icons のシンプルさを保ちつつ、モダンな React 開発に必要なパフォーマンスとメンテナンス性を備えています。新規プロジェクトでは迷わずこれを選ぶべきです。
remixicon-react は、より多くのアイコンバリエーションや、塗りつぶしスタイルが必要な場合に有効な代替案です。ただし、ラッパーパッケージのメンテナンス状況を定期的に確認することをお勧めします。
feather-icons および feather-icons-react は、既存のレガシーコードを維持する場合を除き、新規採用は避けるべきです。技術的負債を増やすことなく、将来を見据えた選定が求められます。
新規プロジェクト、または既存の Feather Icons からの移行を検討している場合に最も推奨される選択肢です。完全なツリーシェイキングサポート、活発なメンテナンス、そして Feather と互換性のあるデザインを持ちながら、より豊富なアイコンセットを提供します。
プロジェクトでレガシーなコードベースを維持する必要があり、既存の feather-icons 実装に依存している場合にのみ選択してください。新規プロジェクトでは、DOM 操作を必要とするこのアプローチは React の宣言型モデルと相性が悪く、非推奨と考えるべきです。
既存の Feather アイコンセットを React で使う必要があるが、Lucide への移行が即座に不可能な場合に限定して使用します。ただし、メンテナンス状況が不明確なため、長期的には lucide-react への移行を計画すべきです。
Feather や Lucide とは異なる、より多様で詳細なアイコンデザイン(Remix Icon)を必要とする場合に選択します。特定のブランドガイドラインやデザインシステムが Remix Icon を指定しているプロジェクトに適しています。
Lucide icon library for React applications.
About · Icons · Documentation · License
Implementation of the lucide icon library for React applications.
pnpm add lucide-react
npm install lucide-react
yarn add lucide-react
bun add lucide-react
For full documentation, visit lucide.dev
Join the Discord server to chat with the maintainers and other users.
Lucide is licensed under the ISC license. See LICENSE.
You can find all our past and non-recurring financial contributors at our Open Collective page.