|
| 1 | +--- |
| 2 | +title: 試験的なSVG最適化 |
| 3 | +sidebar: |
| 4 | + label: SVG最適化 |
| 5 | +i18nReady: true |
| 6 | +--- |
| 7 | + |
| 8 | +import Since from '~/components/Since.astro' |
| 9 | + |
| 10 | +<p> |
| 11 | + |
| 12 | +**Type:** `SvgOptimizer`<br /> |
| 13 | +**Default:** `undefined`<br /> |
| 14 | +<Since v="5.16.0" /> |
| 15 | +</p> |
| 16 | + |
| 17 | +この試験的な機能を有効にすると、ビルド時に[SVGコンポーネント](/ja/guides/images/#svg-components)を自動的に最適化できます。 |
| 18 | + |
| 19 | +有効にすると、コンポーネントとしてインポートされたSVGファイルは、視覚的な品質を維持しながら、ファイルサイズの縮小とパフォーマンスの向上のために最適化されます。不要なメタデータ、コメント、冗長なコードを削除することで、SVGアセットのサイズを大幅に削減できます。 |
| 20 | + |
| 21 | +この機能を有効にするには、Astroの設定ファイルで`svgoOptimizer()`ヘルパーをインポートし、試験的な`svgOptimizer`フラグに割り当てます。 |
| 22 | + |
| 23 | +```js title="astro.config.mjs" ins={5} |
| 24 | +import { defineConfig, svgoOptimizer } from "astro/config"; |
| 25 | + |
| 26 | +export default defineConfig({ |
| 27 | + experimental: { |
| 28 | + svgOptimizer: svgoOptimizer() |
| 29 | + } |
| 30 | +}); |
| 31 | +``` |
| 32 | + |
| 33 | +## 使い方 |
| 34 | + |
| 35 | +この機能を活用するために、SVGコンポーネントの使い方を変更する必要はありません。試験的なSVG最適化を有効にすると、すべてのSVGコンポーネントのインポートファイルが自動的に最適化されます。 |
| 36 | + |
| 37 | +```astro title="src/pages/index.astro" |
| 38 | +--- |
| 39 | +import Logo from '../assets/logo.svg'; |
| 40 | +--- |
| 41 | +
|
| 42 | +<Logo /> |
| 43 | +``` |
| 44 | + |
| 45 | +SVGはビルドプロセス中に最適化され、本番ビルドでのファイルサイズが小さくなります。 |
| 46 | + |
| 47 | +この最適化はプロジェクト内のすべてのSVGコンポーネントのインポートに適用されます。コンポーネント単位でオプトアウトすることはできません。 |
| 48 | + |
| 49 | +## SVGO |
| 50 | + |
| 51 | +Astroは[SVGO](https://svgo.dev/)を使用した1つの組み込みオプティマイザーを提供しています。 |
| 52 | + |
| 53 | +```js |
| 54 | +import { svgoOptimizer } from "astro/config" |
| 55 | +``` |
| 56 | + |
| 57 | +### 設定 |
| 58 | + |
| 59 | +最適化の動作をカスタマイズするために、[SVGOの設定オプション](https://github.com/svg/svgo#configuration)を含むオブジェクトを渡すことができます。 |
| 60 | + |
| 61 | +```js |
| 62 | +svgoOptimizer({ |
| 63 | + multipass: true, |
| 64 | + floatPrecision: 2, |
| 65 | + plugins: [ |
| 66 | + 'preset-default', |
| 67 | + 'removeXMLNS', |
| 68 | + { |
| 69 | + name: "removeXlink", |
| 70 | + params: { |
| 71 | + includeLegacy: true |
| 72 | + } |
| 73 | + } |
| 74 | + ] |
| 75 | +}); |
| 76 | +``` |
| 77 | + |
| 78 | +#### `plugins` |
| 79 | + |
| 80 | +**Type:** `Array<string | PluginConfig>`<br /> |
| 81 | +**Default:** `[]` |
| 82 | + |
| 83 | +SVGコンポーネントのインポートを最適化するために使用する[SVGOプラグイン](https://svgo.dev/docs/plugins/)の配列です。 |
| 84 | + |
| 85 | +SVGOの[`preset-default`](https://svgo.dev/docs/preset-default/)プラグインコレクション、個別の組み込みプラグイン、または[カスタムプラグイン](https://svgo.dev/docs/plugins-api/)を含めることができます。 |
| 86 | + |
| 87 | +プラグインのデフォルト設定を使用するには、その名前を配列に追加します。より細かく制御したい場合は、`overrides`パラメーターを使用して`preset-default`内の特定のプラグインをカスタマイズするか、プラグインの`name`を含むオブジェクトを渡して個々のパラメーターをオーバーライドします。 |
| 88 | + |
| 89 | +```js |
| 90 | +svgoOptimizer({ |
| 91 | + plugins: [ |
| 92 | + { |
| 93 | + name: 'preset-default', |
| 94 | + params: { |
| 95 | + overrides: { |
| 96 | + convertPathData: false, |
| 97 | + convertTransform: { |
| 98 | + degPrecision: 1, |
| 99 | + transformPrecision: 3 |
| 100 | + }, |
| 101 | + inlineStyles: false |
| 102 | + }, |
| 103 | + }, |
| 104 | + }, |
| 105 | + 'removeXMLNS', |
| 106 | + { |
| 107 | + name: "removeXlink", |
| 108 | + params: { |
| 109 | + includeLegacy: true |
| 110 | + } |
| 111 | + } |
| 112 | + ] |
| 113 | +}); |
| 114 | +``` |
| 115 | + |
| 116 | +#### その他の設定オプション |
| 117 | + |
| 118 | +特に`floatPrecision`と`multipass`など、いくつかの[SVGOの設定オプション](https://github.com/svg/svgo/blob/66d503a48c6c95661726262a3068053c429b06a9/lib/types.ts#L335)を設定オブジェクトに直接渡すことができます。 |
| 119 | + |
| 120 | +```js |
| 121 | +svgoOptimizer({ |
| 122 | + multipass: true, |
| 123 | + floatPrecision: 2, |
| 124 | +}); |
| 125 | +``` |
| 126 | + |
| 127 | +`multipass`オプションは、最適化エンジンをこれ以上最適化が見つからなくなるまで複数回実行するかどうかを設定します。`floatPrecision`オプションは小数点以下の桁数をグローバルに設定しますが、プラグインの`params`プロパティにカスタム値を指定することで、特定のプラグインに対してオーバーライドできます。 |
| 128 | + |
| 129 | +### 一般的なユースケース |
| 130 | + |
| 131 | +SVGOは、独自の判断による最適化を行う広範な[デフォルトプラグインリスト](https://svgo.dev/docs/preset-default/)を提供しています。このプリセットを使用する方が各プラグインを個別に追加するよりも便利ですが、さらにカスタマイズが必要な場合もあります。たとえば、特にアニメーションを使用する場合、状況によっては要素を削除したりクリーンアップしすぎることがあります。 |
| 132 | + |
| 133 | +### 特定の属性を保持する |
| 134 | + |
| 135 | +SVGOがデフォルトでインライン化または削除する`<style>`などの特定のSVG属性や要素を保持したい場合があります。 |
| 136 | + |
| 137 | +```js |
| 138 | +svgoOptimizer({ |
| 139 | + plugins: [ |
| 140 | + { |
| 141 | + name: 'preset-default', |
| 142 | + params: { |
| 143 | + overrides: { |
| 144 | + inlineStyles: false, // Preserve style elements for CSP hashing |
| 145 | + removeDesc: false // Keep element regardless of contents |
| 146 | + } |
| 147 | + } |
| 148 | + } |
| 149 | + ] |
| 150 | +}); |
| 151 | +``` |
| 152 | + |
| 153 | +### 特定の要素を削除する |
| 154 | + |
| 155 | +メタデータや非表示レイヤーなど、不要な特定の要素を削除するようにプラグインを設定できます。多くのプラグインはすでに`preset-default`に含まれているため、通常はその動作を設定するだけで十分です。 |
| 156 | + |
| 157 | +```js |
| 158 | +svgoOptimizer({ |
| 159 | + plugins: [ |
| 160 | + { |
| 161 | + name: 'preset-default', |
| 162 | + params: { |
| 163 | + overrides: { |
| 164 | + removeHiddenElems: { |
| 165 | + isHidden: false, |
| 166 | + displayNone: false |
| 167 | + } |
| 168 | + }, |
| 169 | + }, |
| 170 | + }, |
| 171 | + 'removeRasterImages' |
| 172 | + ] |
| 173 | +}); |
| 174 | +``` |
| 175 | + |
| 176 | +### 最新のHTML5へのインライン化に最適化する |
| 177 | + |
| 178 | +インラインSVGは`xmlns`属性を必要とせず、SVG 2仕様に安全に変換できます。この目的のために`removeXMLNS`と`removeXlink`プラグインを使用することをお勧めします。 |
| 179 | + |
| 180 | +```js |
| 181 | +svgoOptimizer({ |
| 182 | + plugins: [ |
| 183 | + 'preset-default', |
| 184 | + 'removeXMLNS', |
| 185 | + { |
| 186 | + name: "removeXlink", |
| 187 | + params: { |
| 188 | + includeLegacy: true |
| 189 | + } |
| 190 | + } |
| 191 | + ] |
| 192 | +}); |
| 193 | +``` |
| 194 | + |
| 195 | +## SVGオプティマイザーの構築 |
| 196 | + |
| 197 | +<p> |
| 198 | + |
| 199 | +<Since v="6.2.0" /> |
| 200 | +</p> |
| 201 | + |
| 202 | +カスタムSVGオプティマイザーを実装するための推奨する方法は、設定をパラメーターとして受け取り、`SvgOptimizer`オブジェクトを返す関数をエクスポートすることです。 |
| 203 | + |
| 204 | +```ts |
| 205 | +import type { SvgOptimizer } from "astro"; |
| 206 | +import { optimize, type Options } from "./optimizer"; |
| 207 | + |
| 208 | +export function mySvgOptimizer(options?: Options): SvgOptimizer { |
| 209 | + return { |
| 210 | + name: "my-optimizer", |
| 211 | + optimize: (contents) => optimize(contents, options), |
| 212 | + } |
| 213 | +} |
| 214 | +``` |
| 215 | + |
| 216 | +### `name` |
| 217 | + |
| 218 | +<p> |
| 219 | + |
| 220 | +**Type:** `string` |
| 221 | +</p> |
| 222 | + |
| 223 | +ログで使用されるオプティマイザーの一意の名前です。 |
| 224 | + |
| 225 | +### `optimize()` |
| 226 | + |
| 227 | +<p> |
| 228 | + |
| 229 | +**Type:** `(contents: string) => string | Promise<string>` |
| 230 | +</p> |
| 231 | + |
| 232 | +SVGのコンテンツを処理します。 |
| 233 | + |
| 234 | +## 仕組み |
| 235 | + |
| 236 | +SVG最適化はランタイムではなく、ビルドプロセス中に行われます。 |
| 237 | + |
| 238 | +- **開発モード**では、より高速な再ビルド時間とスムーズな開発体験を確保するために、SVGファイルは最適化されません。 |
| 239 | +- **本番ビルド**では、インポートされたすべてのSVGファイルがビルドプロセス中に一度最適化され、ファイルサイズが小さくなります。 |
| 240 | +- **ランタイムオーバーヘッドはありません** - 最適化されたSVGは事前に処理された静的アセットとして配信されます。 |
| 241 | + |
| 242 | +最適化プロセスによってビルド時間がわずかに増加する場合がありますが、その結果としてファイルサイズが小さくなり、ユーザーのページ読み込みが速くなります。 |
0 commit comments