
Convert raw SVG into clean React & TypeScript components
Convert raw SVG code or files into clean, reusable React components with TypeScript types, camelCase attributes, and customizable props.
Scalable Vector Graphics (SVG) は、ウェブアイコン、イラスト、ロゴのデファクトスタンダードです。ピクセルベースのラスター画像とは異なり、パス、線、曲線の数学的記述であるため、4K Retinaディスプレイでも鮮明さを保ち、ネットワークの負荷もごくわずかです。
しかし、最新のシングルページアプリケーションやNext.jsアプリケーションでは、SVGがずさんな扱いを受けることがよくあります。フロントエンド開発者は、しばしば次のようなことをしています。
import { Heart } from 'react-icons/fa'のようなアイコンライブラリ全体をインポートし、解析されていないJavaScriptでクライアントのバンドルサイズを誤ってメガバイト単位で肥大化させる。#3B82F6のような16進数の塗りつぶしをベクターパスにハードコードし、ダークモードやテーマ切り替えへの対応を妨げる。このガイドでは、React 19におけるSVGレンダリングの仕組みを解き明かし、インラインコンポーネントとスプライトシートのトレードオフを検証し、currentColorのスーパーパワーを習得し、SVGパイプラインを自動化する方法を探ります。
生のベクターコードをすぐに本番環境レベルのReactコンポーネントに変換する必要がある場合は、付属のSVG to JSX / TSX Converter Toolをご覧ください。
SVGをコードベースに貼り付ける前に、レンダリングの選択がDOMノード、HTTPリクエスト、JavaScriptの実行時間にどのように影響するかを理解する必要があります。
| Rendering Strategy | Pros | Cons & Bottlenecks |
|---|---|---|
| Inline JSX / TSX Component | propsによる動的なテーマ設定、CSSのcurrentColor継承、瞬時のインライン遷移 | JSバンドルサイズが肥大化。各アイコンがJSの解析と実行時間を増加させる |
| External <img src='...'> | JSバンドルへの影響ゼロ、ブラウザのHTTPキャッシュ可能、高速な初期ページロード | CSSでパスをスタイルできない、currentColorを継承できない、ホバー時の色変更不可 |
| CSS background-image | 装飾的な繰り返しパターンやアイコンに最適、簡単にキャッシュ可能 | 個別の画像ファイルまたはノイズの多いdata-URIが必要、スクリーンリーダーでアクセス不可 |
| SVG Sprite Sheet (<use href='#id'>) | 単一のネットワークリクエスト、高いキャッシュ性、繰り返しアイコンのDOMフットプリントが小さい | 多色パスの操作が難しい。スプライト構築パイプラインの設定が必要 |
アイコンコンポーネントに施せる最も効果的なリファクタリングは、ハードコードされた色値(fill="#000000"、stroke="#1E293B")を標準のCSS値currentColorに置き換えることです。
currentColorは、SVGエンジンに最も近い親要素のテキストの色(colorプロパティ)を継承するように指示します。アプリがライトモードからダークモードに移行したり、ボタンがデフォルトの状態から:hoverに切り替わったりすると、再レンダリングや状態変更なしにSVGが自動的に更新されます!
肥大化したハードコードされたSVGが、アクセシブルでテーマに反応するコンポーネントにリファクタリングされる様子を以下に示します。
fill="currentColor"を使用すると、アイコンのスタイリングはTailwind CSSでテキストユーティリティクラスを設定するのと同じくらい簡単になります。
<button className="text-gray-400 hover:text-red-500 dark:text-gray-600 dark:hover:text-red-400">
<HeartIcon className="w-5 h-5" />
<span>Like</span>
</button>
アセットをReact JSXに変換する際には、以下の5つのエンジニアリング標準を念頭に置いてください。
SVG属性はXML kebab-case(clip-path、stroke-width、stop-color)で記述されます。Reactでは、これらをJavaScript camelCaseの同等物(clipPath、strokeWidth、stopColor)に変換する必要があります。
常に...propsをルートの<svg>タグに転送してください。これにより、呼び出し元はコンポーネントの内部を変更することなく、onClick、onMouseEnter、id、およびカスタムのaria-*アクセシビリティタグを適用できます。
width="400" height="300"を<svg>コンテナに直接ハードコードすることは避けてください。代わりに、viewBox="0 0 400 300"を設定し、CSSクラス(className="w-full h-auto"またはclassName="w-6 h-6")を介して寸法を制御します。
aria-hidden="true"でマークします。aria-labelを提供するか、SVG内に<title>タグを追加します。Next.jsのバンドルサイズが1MBを超える最も一般的な理由の1つは、アイコンライブラリからの無差別なインポートです。
// ⚠️ DANGEROUS: Some bundlers cannot tree-shake this properly!
import { FaUser, FaLock, FaCheck } from 'react-icons/fa';
舞台裏では、react-icons/faには1,500以上のアイコン定義が含まれています。最新のバンドラーはツリーシェイキングを試みますが、複雑な再エクスポートやCommonJSのフォールバックにより、ブラウザが何百もの不要なベクターコンポーネントを解析せざるを得なくなることがあります。
import FaUser from 'react-icons/fa/FaUser';
components/icons/フォルダーに保存することで、外部依存関係のオーバーヘッドをゼロにし、100%のツリーシェイキングを保証します。SVGのfill/strokeの16進数コードを'currentColor'に置き換える主な利点は何ですか?
AI CLIログの整形、Cron式の作成、JWTの解析、chmod権限の計算をオフラインで実行。

React19のactions、TanStack Queryのサーバーstate、Zustand、Jotai、Signalsを比較し、2026年のReactにおけるstate管理を包括的に解説します。
続きを読む
React Server Components Flightプロトコルのストリーミングワイヤーフォーマット、シリアライゼーション、選択的ハイドレーションについて、プロダクショングレードのアーキテクチャとコード例を交えて解説する包括的なガイド。
続きを読む
React Compilerをプロダクションで利用するための包括的なガイド。自動メモ化、ルール、パフォーマンスベンチマーク、プロダクショングレードのアーキテクチャ、コード例を網羅。
続きを読む