プロダクトのパフォーマンスを極限まで詰める局面において、多くのチームが見落としがちな盲点があります。それが「Figmaからそのまま書き出されたSVGファイルの肥大化」です。
プロダクトデザイナーが意図した美しいUIアイコン。しかし、Figmaから書き出した生のSVGをそのままフロントエンドのコンポーネントとして組み込むと、中身は不要な`
この記事では、テックリードの視点から、FigmaのベクターデータをWebで最高効率でレンダリング可能な「極小・高精細なSVG」へと昇華させる最適化テクニックを伝授します。
—
1. Figma出力SVGの闇:なぜ生のSVGは「ゴミ」を含んでいるのか?
Figmaは「非破壊編集(いつでも元の状態に戻せること)」を最優先するように設計されています。この設計思想自体はデザインツールとして正解ですが、Webレンダリングエンジン(ブラウザ)の最適解とは真っ向から対立します。
生のSVGをエクスポートした際によく見られる問題点と、フロントエンドへの影響を整理しましょう。
生のSVGコードに潜む4つの罪
1. 過剰な精度の小数点と絶対座標変換(`transform=”matrix(…)”`)
Figmaのキャンバス上の絶対座標や回転情報がそのまま`matrix`属性として残ります。これにより、Web上でのスケーリングやCSSアニメーションが難解になります。
2. 無駄なグループ化(`
Figmaのフレームやグループ構造がそのまま`
3. ハードコードされた `fill` / `stroke` 属性
`fill=”#1A1A1A”` のように絶対値で出力されるため、フロントエンドで Hover 時の色変更やダークモード対応を行う際、CSSの `fill: currentColor;` が効かない原因になります。
4. メタデータとFigma固有属性の残留
`xmlns:svg=` や独自ID属性など、ブラウザの描画には一切関係のないバイト数がネットワークを圧迫します。
【比較】生のSVG vs 最適化されたSVG
—
2. Figmaデザイン時の最適化:エクスポート前の構造改革
最適化の第一歩は、Figmaのキャンバス上で不要な複雑性を排除することです。デザイナーとエンジニアが共有すべきベクター作成のベストプラクティスを解説します。
爆速化のためのFigmaショートカットキー
ベクトル操作の無駄を極限まで減らすため、以下のショートカットを指に叩き込んでください。
| ショートカット (Mac / Win) | 操作名称 | 用途・効果 |
| :— | :— | :— |
| `Cmd + E` / `Ctrl + E` | Flatten (パスの結合) | 複数のシェイプやブーリアン演算を単一の「Path」に不可逆結合。最も効果的。 |
| `Cmd + Shift + O` / `Ctrl + Shift + O` | Outline Stroke (線のアウトライン化) | 線の太さ(`stroke-width`)を塗り(`fill`)のパスに変換。拡大縮小時の破綻を防ぐ。 |
| `Cmd + Option + G` / `Ctrl + Alt + G` | Frame Selection | 無駄なGroupを排除し、描画境界を定めるアセットの最小単位(24×24など)を作る。 |
| `Option + L` / `Alt + L` | Collapse Layers | 肥大化したレイヤーツリーを全閉じし、無駄なネストの視認性を高める。 |
レイヤー構造と命名規則の3原則
1. フレーム境界の完全固定(Bounding Boxの統一)
すべてのアイコンは `24×24` や `20×20` などの固定規格フレームの中に配置します。フレームの背景は透過にし、子要素のパス座標をフレーム左上 `(0, 0)` に対する相対値として整理させます。
2. ブーリアン演算の「Flatten」徹底
Union, Subtract, Intersectなどのブーリアン演算はFigma内では「ライブ状態(非破壊)」です。このまま出力すると大量のパスデータが残るため、デザイン確定時に `Cmd + E` で完全に1つの複合パス(Compound Path)にまとめます。
3. ID汚染を防ぐレイヤー名
Figmaのレイヤー名は、エクスポート時に `
—
3. 完全自動化パイプライン:Figmaからフロントエンド実装へ
手作業での最適化には限界があります。FigmaプラグインとビルドツールのCI/CDを組み合わせたパイプラインを構築します。
必須のFigma神プラグイン
- SVG Export Options
`viewBox` の有無、`id` 属性の除外、カラーの `currentColor` 化をエクスポート時点で制御できる必須プラグイン。
- Clean Document
プロジェクト全体から、非表示レイヤーの削除、空グループの解除、ピクセルグリッドへのスナップをワンクリックで自動実行。
最強の最適化エンジン「SVGO」の極限設定
フロントエンドのビルドプロセス(またはGit Commit時)に SVGO (SVG Optimizer) を組み込みます。以下は、プロダクション環境で耐えうる最高精度の `svgo.config.js` です。
// svgo.config.js
module.exports = {
multipass: true, // 複数回パスを通して圧縮率を極限まで高める
plugins: [
{
name: ‘preset-default’,
params: {
overrides: {
// viewBoxを削除するとレスポンシブ性が失われるため【絶対無効化】
removeViewBox: false,
// 精度の丸め込み(デフォルト: 2桁。16×16〜24×24のアイコンなら精度2で十分)
cleanupNumericValues: {
floatPrecision: 2,
},
// 不要な要素・属性の完全削除
removeUselessDefs: true,
cleanupIDs: true,
},
},
},
//
‘collapseGroups’,
// 描画属性(fill/stroke)にハードコードされたカラーコードを ‘currentColor’ に置き換える
{
name: ‘convertColors’,
params: {
currentColor: true, // 特定の色または全ての色を currentColor 化
},
},
// 無駄な `fill=”none”` や `stroke=”none”` を削除
‘removeUselessStrokeAndFill’,
// 属性の順序をソートしてGzip/Brotliの圧縮率を向上させる
‘sortAttrs’,
],
};
—
4. チーム開発における運用ルールとCI/CD組み込み
どれほど優れた設定ファイルを書いても、チーム全体で運用ルールが徹底されなければ意味がありません。開発プロセスに「最適化の自動化ガードレール」を設置しましょう。
Husky + lint-staged によるGitコミット時の自動コミットフック
デザイナーがエクスポートしたSVGファイルをリポジトリの `src/assets/icons/` に追加した瞬間、自動的にSVGOが走り、極限まで軽量化された状態でコミットされる環境を作ります。
`package.json` の設定例
{
“scripts”: {
“prepare”: “husky install”
},
“lint-staged”: {
“src/assets/icons/.svg”: [
“svgo –config=svgo.config.js”,
“git add”
]
},
“devDependencies”: {
“husky”: “^8.0.0”,
“lint-staged”: “^13.0.0”,
“svgo”: “^3.0.0”
}
}
チーム共有用の「SVG Iconガイドライン」テンプレート
デザインシステム運用時、デザイナーとエンジニアのハンドオフ資料(Figma Componentの冒頭など)に以下のルールを明記してください。
【アイコンコンポーネント制作ルール】
1. キャンバスサイズ: 24x24px(固定)
2. カラー: #000000(単色)で作成すること(コード化時に `currentColor` へ自動変換されるため)
3. パスの状態: 制作完了時、全レイヤーを選択して `Cmd + E` (Flatten) を実行し、1個のパスにする
4. 線(Stroke)の使用: 原則不可。すべて `Cmd + Shift + O` で塗り(Fill)へ変換すること
5. レイヤー構造: 不要な Group / Frame のネストは全廃すること
—
まとめ:1バイトへの拘りが製品の品質を決める
SVGの最適化は、単なる「ファイルサイズの削減」にとどまりません。
1. レンダリングの高速化(ブラウザのレイアウト計算負荷とDOMツリーの軽減)
2. 保守性の飛躍的向上(CSSによる柔軟なスタイリングとカラー制御)
3. デザインシステムとコードの一致(不要なラッパーや不確定要素の排除)
UI/UXエンジニアの本質は、デザインの美しい意図を、一滴の無駄もなくコードへと変換することにあります。Figmaから書き出すその1つのSVGに魂を込め、チーム全体の開発パフォーマンスを圧倒的な高みへと引き上げましょう。