SVGオプティマイザ
コメント、メタデータ、不要なスペースを削除してSVGファイルを最適化およびミニファイします。
プレビュー
SVG最適化について
Illustrator、Figma、InkscapeからエクスポートされたSVGファイルには、視覚的なレンダリングに影響を与えずにファイルサイズを増やすメタデータ、コメント、エディター固有の属性、不要なスペースが含まれていることがよくあります。SVGを最適化すると、サイズを20〜60%削減でき、読み込み時間が改善されます。このツールは、視覚的な外観を保持する安全な最適化を適用します。
仕組み
- SVGを貼り付けまたはアップロード: SVGマークアップを直接入力するか、Illustrator、Figma、Sketchからエクスポートされた.svgファイルをアップロードします。
- 最適化パスを構成: 適用する最適化を選択, コメントの削除、メタデータの削除、パスの簡素化、viewBoxの正規化。
- 最適化: ツールは選択されたパスを実行し、サイズ削減のパーセンテージを表示します。
- ダウンロードまたはコピー: 最適化されたSVGを保存するか、コードに貼り付けるためにマークアップをコピーします。
なぜSVGを最適化するのか?
デザインツールからエクスポートされたSVGファイルは、不要なデータでいっぱいです, エディタメタデータ、デフォルト値を持つインラインスタイル宣言、空のグループ、冗長な変換属性、コメント。この余分なものは、レンダリングを変更せずにサイズを増やします。SVGO(ここで使用される業界標準のSVGオプティマイザー)は通常、ピクセル単位のレンダリングを保持しながらサイズを50〜80%削減できます。より小さいSVGは、より速く読み込まれ、HTMLにより速くインライン化され、帯域幅を削減します, 1ページに数十のSVGを読み込むアイコンシステムには特に重要です。
適用される最適化
- コメント削除, ジェネレーターとエディターのコメントが削除されます
- メタデータ削除, title、desc、XMP要素
- 空のグループのマージ, 不要なラッパー
<g>要素が削除されます - パスの簡素化, 冗長なパスコマンドがマージおよび短縮されます
- 属性のクリーンアップ, デフォルト値とプレゼンテーション属性が削除されます
- ViewBoxの正規化, 一貫した座標系
SVG と SVGO の短い歴史
Scalable Vector Graphics は、2つの W3C 提案の競争として始まりました:Adobe、IBM、Netscape、Sun による Precision Graphics Markup Language(PGML)、および Microsoft による Vector Markup Language(VML)です。両方とも 1998年に提出されました。W3C の妥協は SVG となり、2001年9月に SVG 1.0 として勧告されました。Internet Explorer は IE9(2011年)まで悪名高くも SVG サポートを出荷することを拒否しましたが、Firefox、Safari、Opera は 2000 年代半ばからサポートしていました。SVG 1.1 は 2003年に登場し、2011年に第二版が出ました。SVG Tiny 1.2 は 2008年にモバイルデバイスをターゲットにしました。SVG 2 は 2016年頃にドラフトを開始しましたが停滞しました。今日も Candidate Recommendation Draft(最終更新は 2018 年)のままで、ブラウザは個別に部分を出荷しています。最適化は後から登場しました。SVGO は Kir Belevich(svg-go)によって作成され、2012年10月に JavaScript で書かれて GitHub に初公開されました。webpack-loader、Vite、Sketch、Figma エクスポートプラグイン、および 2015年に立ち上げられた Jake Archibald(Chrome チーム)による SVGOMG Web UI に統合され、デファクト標準となりました。SVGO 3(2023年リリース)はコードベースを近代化しました。このツールは、SVGO の最も影響力のあるプラグインの安全なサブセットを実装し、完全にブラウザで実行されます。
SVG オプティマイザが実際に行うこと
- 小数精度の削減。Illustrator は
M127.348293のような 6 桁の小数でパスをエクスポートします。典型的なアイコンサイズには 3 桁の小数で視覚的に同一で、1 桁または 2 桁で十分なことが多いです。SVGO はcleanupNumericValuesプラグイン経由でデフォルトで 3 桁の小数を使用します。精度が低い = ファイルが小さい。 - 無駄なグループを折りたたむ。デザインツールはあらゆる操作を
<g>要素でラップします。多くは簡略化後に空になります。collapseGroupsプラグインは単一子グループを親にマージします。 - メタデータの削除。Illustrator は XMP パケットを含む
<metadata>...</metadata>ブロックですべてのエクスポートにスタンプを押し、Inkscape はsodipodi名前空間属性で、Figma はエディタ ID でスタンプします。これらはレンダリングに影響しません。removeMetadata、removeEditorsNSData、およびremoveXMLProcInstがこれらを処理します。 - パスコマンドの最適化。絶対座標を相対に変換(多くの場合短い)、連続する線分をマージ(
l 5,0 l 0,5は 2 つのまま;L 5,0 L 5,5はv 5になる)、zの後の無駄なZを削除。convertPathDataプラグインはパス文字列で 30-50% を節約できます。 - デフォルト属性の削除。
fill="black"、stroke="none"、stroke-width="1"はデフォルトです。SVGO はそれらを削除します。mergeStylesと組み合わせると、インラインスタイル付きエクスポートを半分にカットすることがよくあります。 - 色の短縮。
#ffffff→#fff;rgb(255,255,255)→#fff;名前付きカラー(aliceblue)→ 短い場合は hex。convertColorsプラグイン。 - 未使用 ID の削除。
id="path-7423"のようなエディタ生成 ID は通常参照されません。SVGO のcleanupIdsは孤立 ID を削除し、残りをa、b、c... に最小化します。
SVG の最適化が重要な場所
- アイコンシステム。各 2 KB の 30 個の SVG アイコンを持つページは 60 KB です。各 800 バイトに最適化すれば 36 KB 節約できます。Heroicons、Lucide、Phosphor、Feather はすべて事前最適化された SVG を出荷します。デザインファイルから抽出した場合、自分で行う必要があります。
- ロゴとブランド資産。クライアントに配信されるロゴは多くの場合 Illustrator から 50-100 KB です。最適化されると 5-10 KB です。同じ視覚的忠実度、低い帯域幅、より速いページロード。Wikipedia のロゴ SVG は、一回の最適化パス後に 39 KB から 11 KB に減少しました。
- HTML 内のインライン SVG。SVG をインライン化すると(追加の HTTP リクエストなし)、SVG のすべてのバイトがブラウザのパーサーをブロックする HTML ペイロードを膨張させます。200 バイトのアイコン vs 2 KB は最初のペイントタイミングに重要です。
- データ可視化。D3.js、Observable、ECharts SVG 出力、および React-vis は、数千の要素を持つ大きな SVG を生成します。5,000 ポイントの散布図は簡単に 500 KB の生サイズです。最適化すれば、同じ状態を維持しながら 150 KB に下げることができます。
- アイコンフォント生成。IcoMoon、Fontello、Fontastic などのツールは SVG をアイコンフォントに変換します。ソース SVG を事前最適化することで、クリーンなフォント出力と小さいフォントファイルが保証されます。
- 印刷と PDF 資産。SVG を PDF に埋め込む(Puppeteer、wkhtmltopdf などの web-to-PDF ツール経由)ことは、SVG の膨張が最終 PDF に組み込まれることを意味します。先に最適化してください。
- メールセーフな SVG。多くのメールクライアント(Outlook、一部の Gmail アプリ)は SVG をまったくレンダリングしません。レンダリングするもの(Apple Mail、Gmail ウェブ)については、より小さいインライン SVG はメールを Gmail の 102 KB クリッピングしきい値未満に保ちます。
SVG を壊す最適化ミス
- 参照されている ID を削除する。SVG は多くの場合、fill または stroke 内の
url(#gradient-1)を介して参照される ID を持つ<defs>を使用します。積極的な ID 削除は、グラデーション、マスク、クリップパス、フィルタを壊します。参照を追跡するツールを使用し、盲目的な正規表現は使用しないでください。 - width/height 属性を盲目的に削除する。自然なアスペクト比を失います。結果:
<img src="icon.svg">は本質的なサイズなしでコンテナに合わせて伸び、CLS(累積レイアウトシフト)を引き起こします。少なくともviewBoxを保持してください。望ましくは width/height も保持してください。 - 過度に積極的な小数削減。小さなアイコンで 0 小数に削減するとパスが目に見えてギザギザになります。3 小数は安全なデフォルトです。64×64 より大きいアイコンまたはピクセルパーフェクトが必要でない場合のみ 1 に下げます。
- インライン化時の xmlns 削除。スタンドアロン SVG ファイルには
xmlns="http://www.w3.org/2000/svg"が必要です。HTML 内のインライン SVG は不要(HTML5 パーサが処理)ですが、後で SVG をファイルに抽出する可能性がある場合は xmlns を保持してください。ここでの混乱は Safari の SVG レンダリングを壊します。 currentColorをハードコードされた fill に置換する。fill="currentColor"は強力な CSS フックです:アイコンはテキストの色を継承します。積極的なオプティマイザはこれを計算値で置き換え、ダークモードとテーマアイコンシステムを壊します。- 分離されたままにすべきパスをマージする。一部のアニメーションは特定のパス ID をターゲットにします。一部のアクセシビリティツールは、個別の
<title>テキストを持つ複数の<path>要素に依存します。mergePathsプラグインはこれらを破壊します。アニメーションまたはアクセシブルな SVG の場合は無効にしてください。 - アクセシブルな
<title>と<desc>を取り除く。スタンドアロン画像として、または<img>タグで使用される SVG は、スクリーンリーダー(alt テキストに類似)に<title>が必要です。積極的なメタデータ削除はこれを取り除きます。タイトルを保持するか、インライン SVG 要素にaria-labelを追加してください。
その他のよくある質問
SVG の最適化は実際にどれくらい節約できますか?
ソースに大きく依存します。Adobe Illustrator のエクスポートは、最初のパスで主にメタデータ、エディタ名前空間、小数精度削減から 60-80% 縮小することが多いです。Figma のエクスポートは箱から出してより清潔です(通常 20-40% 節約)。開発者が手で書いた SVG ですか?削除するものがあまりないため、しばしば 5-15% です。Wikipedia のロゴ、Illustrator 膨張の極端な例は、39 KB から 11 KB になりました。Figma の典型的な 24×24 アイコンは 1.4 KB から 0.6 KB に下がります。
SVG をインライン化するか、外部ファイルとして使用するかはいつ決めますか?
インライン(HTML 内の <svg>...</svg>)は、小さなアイコン(2 KB 未満)、重要なファーストビューコンテンツ、および SVG をスタイル設定する CSS が必要な場所(例:currentColor、ホバー状態、ダークモード)用。外部ファイル(<img src="icon.svg"> または CSS background-image)は、繰り返し使用される同一のアイコン(ブラウザがキャッシュ)、より大きなイラスト、CSS テーマが必要ないコンテンツ用。SVG スプライト(<use> で参照される複数の <symbol> 要素を持つ単一ファイル)は 2014-2019 年のアイコンシステムパターンで、現在は React/Vue/Svelte のインライン svg コンポーネントによって主に置き換えられています。
最適化されていない SVG にセキュリティリスクはありますか?
はい。SVG は <script> タグおよび onload、onclick イベントハンドラを埋め込むことができます。ユーザーがアップロードした SVG は XSS ベクトルです。SVG は <image href="..."> を介して外部リソースを参照でき、ビューアの IP を漏洩します。SVG フォント(非推奨ですが解析可能)には歴史的にバッファオーバーフローがありました。良いオプティマイザはクリーンアップの一部として <script> とイベントハンドラを取り除きます。ユーザーの SVG アップロードを受け入れる場合は、提供する前に強化された衛生化ツール(SVG プロファイル付きの DOMPurify)を通してください。
コマンドラインを使用して SVG を最適化できますか?
はい。npx svgo input.svg -o output.svg は標準の SVGO ライブラリを使用します。svgo.config.js でプラグインを設定します。CI 統合:webpack の imagemin-svgo、vite-plugin-svgo、GitHub アクション antfu/svg-opt。バッチ最適化用:svgo -f ./icons -o ./icons-optimised。ここでのブラウザツールは一回限りのケースで高速で、Node がインストールされていなくても動作します。
ここで最適化するとき、私の SVG はサーバーに送信されますか?
いいえ。最適化は、貼り付けた SVG マークアップで JavaScript を介してブラウザで完全に実行されます。最適化中に DevTools で Network タブを開きます。アウトバウンドリクエストはゼロです。独自のロゴ、未公開のアイコンデザイン、内部企業 SVG、および NDA に基づくものに安全です。