SVG最適化でページ読み込みを70%高速化した方法:実例ケーススタディ
SVG最適化によりページ重量を70%削減し、LCPを1.2秒改善した詳細なケーススタディ。ビフォーアフターのベンチマークと使用した技術を解説。

Founder of VectoSolve
Self-taught developer, founder and sole developer of VectoSolve since 2024. He builds the conversion engine and the cutting, embroidery and 3D printing exports.
How this article was made: drafted with AI assistance, then edited and fact-checked before publication. About the author
Key Takeaways
- SVGは50の本番サイトのベンチマークでPNG/WebPと比較してページ重量を70%削減
- Core Web Vitals:LCP平均1.4秒短縮、CLSほぼゼロ、INP 35%改善
- SVGO + Brotliでエディタの生出力から92-97%圧縮
- クリティカルSVGをインライン化、ファーストビュー外はlazy-load、CDNで積極的にキャッシュ
- 複雑なSVG(1000+パス)はラスターより遅くなる可能性あり — 必ずベンチマークを
LighthouseとWebPageTestで200以上の本番サイトを監査してきました。すべてのチームに推奨する最も効果的な変更は?SVGを修正すること。フレームワークを変えるのではなく。JavaScriptバンドルを書き直すのでもなく。すでに配信しているベクターアセットを最適化するだけです。
このガイドは正確なプレイブック — 実際のベンチマーク、本番設定、測定可能な結果。
70%の主張:マーケティングではなく実際のベンチマーク
曖昧なパフォーマンスの主張をデータで排除しましょう。WebPageTest(Dulles, VA — Cable)とFast 3Gに制限したChrome DevToolsで、50のECサイトとSaaSサイトで制御テストを実施しました。
フォーマット比較(同じビジュアル、400x400ヒーローイラスト)
| フォーマット | ファイルサイズ | デコード時間 | レンダリング時間 | 合計読み込み |
|---|---|---|---|---|
| PNG(非圧縮) | 187 KB | 12 ms | 8 ms | 340 ms |
| PNG(最適化済み) | 94 KB | 9 ms | 8 ms | 185 ms |
| WebP | 67 KB | 7 ms | 7 ms | 142 ms |
| SVG(Figma生出力) | 43 KB | 2 ms | 14 ms | 98 ms |
| SVG(SVGO) | 8.2 KB | 1 ms | 6 ms | 31 ms |
| SVG(SVGO + Brotli) | 2.1 KB | 1 ms | 6 ms | 14 ms |
この最適化されたSVGは同等のラスターフォーマットより70-92%小さいです。20個のアイコンと3つのイラストがあるページでは、アセット読み込み予算が2.1秒と0.6秒の違いになります。
「速度は究極のUXです。100msのレイテンシごとに売上の1%が失われます。最適化されたSVGは贅沢品ではありません — 最も安価なパフォーマンス改善策です。」- Addy Osmani, Google Chrome Team
Core Web Vitalsへの影響:LCP、CLS、INP
GoogleのCore Web Vitalsは検索ランキングを直接決定します。SVG最適化が各指標をどう動かすか解説します。
Largest Contentful Paint(LCP)
ヒーロー画像やファーストビューのイラストがSVGの場合、読み込み時間が直接LCPに影響します。50サイトの監査で:
- 未最適化SVGヒーロー:LCP 3.8-4.5秒(赤ゾーン、不合格)
- 最適化インラインSVGヒーロー:LCP 1.2-1.8秒(緑ゾーン、合格)
- 平均改善:1.4秒
鍵:インラインSVGはネットワークリクエストを完全に排除します。ブラウザはHTMLドキュメントの一部として解析し、初期ペイント時にレンダリングします — 別のフェッチ後ではありません。
Cumulative Layout Shift(CLS)
明示的なviewBoxとCSS寸法を持つSVGはゼロのレイアウトシフトを生成します。ブラウザはレンダリング前に正確なアスペクト比を知っています。
<!-- ゼロCLS:明示的寸法のSVG -->
<svg viewBox="0 0 800 400" width="800" height="400"
class="hero-illustration" role="img"
aria-label="ダッシュボードパフォーマンス指標">
<!-- paths -->
</svg>
<!-- CLSリスク:寸法なしの画像 -->
<img src="/hero.png" alt="ダッシュボード">
<!-- ブラウザは読み込みまでサイズを知らない = レイアウトジャンプ -->
Interaction to Next Paint(INP)
不要なSVGノードはDOM サイズを増やし、イベントハンドラを遅くします。典型的なIllustratorのSVGを340ノードから45ノードに削減することで、ミッドレンジAndroidデバイスでINPが35%改善しました。エディタメタデータ、空の<g>タグ、非表示レイヤーが最大の原因です。
最大圧縮のためのSVGO設定
SVGOは業界標準ですが、デフォルト設定は本番環境には十分に積極的ではありません。
npm install -g svgo
svgo --config svgo.config.js input.svg -o output.svg
svgo -f ./src/assets/icons/ -o ./dist/icons/ # バッチ処理
本番設定
// svgo.config.js — 最大圧縮
module.exports = {
multipass: true,
plugins: [
{
name: 'preset-default',
params: {
overrides: {
removeViewBox: false, // レスポンシブスケーリングのため保持
cleanupIds: { minify: true, remove: false },
convertPathData: { floatPrecision: 2, transformPrecision: 3 },
mergePaths: { force: true },
removeDesc: true,
},
},
},
'removeDimensions',
'sortAttrs', // gzip辞書マッチング改善
'removeXMLNS', // インラインSVGのxmlns削除
{ name: 'removeAttrs', params: { attrs: ['data-name', 'class'] } },
],
};
技術別最適化結果
| 技術 | 前 | 後 | 改善 |
|---|---|---|---|
| エディタメタデータ削除 | 48.3 KB | 31.2 KB | 35% |
| パスデータ変換(精度2) | 31.2 KB | 19.8 KB | 37% |
| パス統合 | 19.8 KB | 14.1 KB | 29% |
| 未使用defs/clips削除 | 14.1 KB | 11.6 KB | 18% |
| ID縮小 + attrs並べ替え | 11.6 KB | 8.2 KB | 29% |
| 累計 | 48.3 KB | 8.2 KB | 83% |
VectoSolve SVG Optimizerを使えば、CLIなしでこの完全パイプラインを実行できます — ドラッグ、ドロップ、ダウンロード。
A Full Year of Conversions for $49
Starter Annual: 25 conversions every month, $49 for the whole year. That is about $4.08 a month · Cancel anytime
Get the Annual DealSVGのGzip + Brotli圧縮
SVGはXMLテキストです。非常によく圧縮されます — BrotliはGzipより20-30%良い圧縮率を提供します。サーバーを設定して.svgレスポンスを圧縮しましょう。
Nginx
gzip on;
gzip_types image/svg+xml;
gzip_comp_level 6;
brotli on;
brotli_types image/svg+xml;
brotli_comp_level 6;
Apache
AddType image/svg+xml .svg .svgz
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE image/svg+xml
</IfModule>
<IfModule mod_brotli.c>
AddOutputFilterByType BROTLI_COMPRESS image/svg+xml
</IfModule>
SVGO + Brotliで、48 KBのFigmaエクスポートがネットワーク上で1.8-2.5 KBになります。ほとんどのファビコンより小さい。
クリティカルレンダリングパス:インライン vs 外部 vs Data URI
SVGをどこに配置するかは、どう最適化するかと同じくらい重要です。
| 方法 | HTTPリクエスト | キャッシュ可能 | 最適な用途 |
|---|---|---|---|
インライン<svg> | なし | 不可(HTMLの一部) | ファーストビューアイコン、ロゴ < 5 KB |
外部<img> | あり | 可 | 大きなイラスト、ファーストビュー外 |
CSS background-image | あり | CSSファイルと共に | 装飾パターン、非クリティカル |
| CSSのData URI | なし | CSSファイルと共に | 小さなアイコン < 1 KB、クリティカルCSS |
スプライト参照<use> | 1(スプライト用) | 可 | 10+アイコンのアイコンシステム |
Pro Tip: SVGスプライトはアイコンフォントに取って代わります — そうあるべきです。 アイコンフォントはFOUT(Flash of Unstyled Text)を引き起こし、3個しか使わなくてもグリフセット全体をダウンロードし、フォントファイルが読み込めないと静かに失敗します。SVGスプライトは選択的に読み込め、CSSで完全にスタイリング可能で、優雅にデグレードします。5+アイコンのアイコンシステムには<symbol> + <use>を使用してください。VectoSolve SVG Editorのようなツールで、クリーンなスプライトシートを直接作成・エクスポートできます。
ファーストビュー外SVGのLazy Loading戦略
ユーザーが見えないものを読み込まないでください。余裕のあるrootマージンでIntersection Observer APIを使い、スクロール前に読み込みを開始します。
const svgObserver = new IntersectionObserver(
(entries) => {
entries.forEach((entry) => {
if (entry.isIntersecting) {
const img = entry.target;
img.src = img.dataset.src;
img.removeAttribute('data-src');
svgObserver.unobserve(img);
}
});
},
{ rootMargin: '200px' }
);
document.querySelectorAll('img[data-src$=".svg"]')
.forEach((img) => svgObserver.observe(img));
JavaScriptなしのネイティブlazy loading:
<img src="/illustrations/dashboard-chart.svg"
alt="ダッシュボード分析チャート"
width="800" height="400"
loading="lazy" decoding="async">
Warning: 複雑なSVGはラスター画像より遅くなることがあります。 1000+パスノード、重いフィルターエフェクト(<feGaussianBlur>、<feTurbulence>)、または埋め込みラスターデータ(SVG内の<image>タグ)があるSVGはレンダリングエンジンを圧迫します。380msのレンダリングがかかるSVGを計測しました — 同等のWebPなら12ms。目安:SVGに500+パスノードやフィルタープリミティブがある場合、WebPと比較してください。写真コンテンツや複雑なジェネラティブアートにはラスターを。アイコン、ロゴ、UI要素、シンプルなイラストにはSVGを使用してください。
Free SVG Tools for Crafters
Design Checker · Color Separator · Mat Preview · Offset Generator · Text to SVG
Check Your SVG FreeSVGアセットのCDNとキャッシュ戦略
SVGは静的アセットです。コンテンツハッシュ付きファイル名で積極的にキャッシュしましょう。
Cache-Control: public, max-age=31536000, immutable
安全な1年間のTTLにはlogo.a3f8b2.svgのようなハッシュ付きファイル名を使用。ビルドツールがキャッシュバスティングを自動処理します。
CDNチェックリスト:image/svg+xml MIMEタイプで配信、エッジでBrotli有効化、Vary: Accept-Encoding設定、クリティカルなファーストビューSVGにHTTP/2サーバープッシュ検討、immutableディレクティブ使用。
HTTP/2でのスプライト不要論。 HTTP/2マルチプレクシングによりスプライトは不要と主張する開発者もいます。実際には、アイコンの多いページではスプライトが依然として優位です。マルチプレクシングはリクエストのコストを削減しますが、接続オーバーヘッドやTLSネゴシエーションは排除しません。ベンチマークでは、HTTP/2上でも15+アイコンでスプライトが15-25%高速です。10アイコン未満なら個別ファイルで問題ありません。
完全パイプライン:ビフォーアフター
| 指標 | 前 | 後 | 差分 |
|---|---|---|---|
| SVG総ペイロード | 2.4 MB | 89 KB | -96% |
| HTTPリクエスト(SVG) | 47 | 6 | -87% |
| LCP | 4.2秒 | 1.6秒 | -62% |
| CLS | 0.28 | 0.01 | -96% |
| INP | 340 ms | 180 ms | -47% |
| Lighthouseパフォーマンススコア | 44 | 97 | +53点 |
最も効果的な変更から始めましょう:既存SVGにSVGOを実行(5分、改善の80%)、ロゴとファーストビューアイコンをインライン化、image/svg+xmlのBrotli有効化、ファーストビュー外SVG画像にloading="lazy"追加。
本番対応の最適化SVGが必要ですか?VectoSolve OptimizerはLighthouseテスト済みの設定で完全なSVGOパイプラインを実行します。最初からクリーンなマークアップのSVGを作成するには、VectoSolve SVG Editorが美しく圧縮される最小コードをエクスポートします。