Penpot SVG最適化の極意:ゴミメタデータを一掃し、プロダクション直結の軽量コードを手に入れる方法
こんにちは。テックリードとして日々フロントエンドのパフォーマンスチューニングとデザインシステムの保守に奔走している者だ。
デザインツールから吐き出されたSVGをそのままプロダクション環境にブチ込んだ結果、`sketch`や`adobe`といった不要なメタデータ、意味のないグループタグ(`
特に、オープンソースの旗手として急速にシェアを広げているPenpotは、Web標準(SVG)をネイティブフォーマットとして採用しているため、デザインデータを極めてクリーンに保つことができる。しかし、何も考えずにエクスポートすれば、やはり「プロダクションコードには耐えない汚染されたSVG」ができあがる。
今回は、Penpotの特性を極限まで引き出し、デザインからコードへのトランスレーションを完全自動化するための「SVG最適化パイプライン構築術」を叩き込む。
—
1. デザインの源流を整える:Penpot側の構造化ルール
SVG最適化は、デザインエクスポートのボタンを押す前から始まっている。エンジニアとデザイナーが共通言語として持つべき「レイヤー命名規則」と「グループ構造」のルールを定義する。
レイヤー・フレームの命名規則(BEMライクなアプローチ)
Penpot上で生成されるSVGのIDやクラス名は、レイヤー名に直結する。適当に「Rectangle 1」などと名付けられた要素は、ビルド時にバグの温床になる。
- コンポーネントのルート: `ComponentName` (例: `IconSearch`)
- パス・シェイプ: `role-` または意味のある名前 (例: `path-background`, `icon-core`)
- 不要なラッパーの排除: 単一のパスを囲むだけの意味のないグループ(`Cmd+G`の乱用)は絶対に避ける。Penpot上でフラットな構造を意識すること。
—
2. 開発スピードを加速する:Penpotの隠れた神ショートカット
デザインデータ構造の整合性を保つため、モデリングスピードを極限まで高めるショートカットを使いこなせ。
- `Ctrl + Enter` (Mac: `Cmd + Enter`): サブパス・ノード編集モードへの即座の移行
無駄なグループ階層を作らずにパスを結合・調整する際、マウス操作を排除して秒速で形状を整える。
- `Ctrl + G` / `Ctrl + Shift + G`: グループ化と解除のトグル
構造の整理整頓において、DOMツリー(SVGの要素ツリー)をクリーンに保つための必須操作。
- `Alt + Drag`: コンポーネントのインスタンス化とプロパティ継承
アイコンなどを複製する際、バラバラのオブジェクトとして扱わず、シンボル(Component)として管理を強制する。
—
3. ビルドパイプライン自動化:SVGOを用いたメタデータ一掃の極意
PenpotからエクスポートしたSVGに対し、手動でクレンジングするのはエンジニアの仕事ではない。CI/CDパイプライン、あるいはビルドプロセス(Vite / Webpack等)のフックで完全に自動化する。
ここで、プロダクション環境において「絶対正義」となる SVGOの設定ファイル(`svgo.config.js`) のベストプラクティスを公開する。Penpot特有の冗長な属性を根こそぎ削ぎ落とす。
実用設定ファイル:`svgo.config.js`
// チームの全プロジェクトで共有するSVGO最適化プロファイル
module.exports = {
multipass: true, // 収束するまで最適化パスを複数回繰り返す(極限まで削る)
plugins: [
{
name: ‘preset-default’,
params: {
overrides: {
// viewBoxはレスポンシブデザインの命なので絶対に消さない
removeViewBox: false,
// CSSでのcurrentColor制御を可能にするため、ハードコードされた色を削除
removeUnknownsAndDefaults: true,
},
},
},
‘removeDimensions’, // width/height属性を削除し、CSS (CSS Variables / Tailwind) でのサイズ制御を可能に
‘sortAttrs’, // 属性の順序をソートし、Gitの差分(Diff)を綺麗にする
{
name: ‘removeAttrs’,
params: {
// Penpotや他のツール特有の不要なメタデータ属性を一網打尽にする
attrs: ‘(data-name|data-node-id|sketch:.|adobe:.)’,
},
},
{
name: ‘addAttributesToSVGElement’,
params: {
// アイコンフォントやSVGスプライトの代替として、アクセシビリティを担保
attributes: [
{ focusable: ‘false’ },
{ ‘aria-hidden’: ‘true’ }
]
}
}
],
};
—
4. チーム開発を崩壊させない:設定共有化と自動化スクリプト
この最適化フローをチームメンバー全員に手動でやらせてはならない。「忘れる人間がいる」という前提でシステムを組むのがエンジニアリングだ。
package.jsonへの組み込み(SVGO CLIによる自動化)
プロジェクトのルートにSVGアセット置き場(`src/assets/svg/`)を用意し、ビルド前またはコミット前に自動最適化を走らせる。
{
“scripts”: {
“svg:optimize”: “svgo -f src/assets/svg -o src/components/icons”
},
“devDependencies”: {
“svgo”: “^3.2.0”
}
}
デザイナーがPenpotから最新のSVGをダウンロードし、専用ディレクトリに配置して `npm run svg:optimize` を叩くだけで、プロダクション直結の洗練されたReact/Vueコンポーネント(あるいはインラインSVGアセット)へと昇華される。
—
結び:デザインとコードの境界線を溶かす
Penpotが目指すオープンでモダンなデザインプロセスの本質は、「デザインデータがそのままコードの文脈と地続きであること」だ。
今回紹介した命名規則の徹底、SVGOによるメタデータの一掃、そしてビルドパイプラインの自動化を取り入れれば、「デザイナーが作ったデザインをエンジニアが手動でキレイにする」という不毛な時間は完全に消滅する。
ツールに振り回されるな。ツールをハックし、プロダクトのパフォーマンスと開発体験(DX)を最高到達点へと引き上げろ。