[Front-End General] SVG まわりの状況と、SVGO によるファイル最適化

現在の状況について調べたら、既に SVG は実用レベルなのかもと思った。

[markdown]
SVG って、どんなものでしたっけ。

> * [SVG入門 (全14回) – プログラミングならドットインストール](http://dotinstall.com/lessons/basic_svg)

仕様、そして職人芸。すごい。

> * [今年こそついにSVG元年?まだ間に合う!SVGの学習に役立つサイト紹介 – 聴く耳を持たない(片方しか)](http://d.hatena.ne.jp/rikuo/20131028)
> * [Advent Calendar 3日目:SVG画像を1バイトでも削るためのコードゴルフ – 聴く耳を持たない(片方しか)](http://d.hatena.ne.jp/rikuo/20131203)

実践するにはという考察。

> * [Retina対応にSVGは本当に使えるのか? – Rriver](http://parashuto.com/rriver/responsive-web/is-svg-good-for-high-res-screen-solutions#browser-support)

mod_rewrite を使って、非対応ブラウザには png を表示させる。

> * [SVG導入のためのレガシーブラウザ振り分け -Blog //ヴォルフロッシュ](http://wolfrosch.com/text/2012/03/17)

実務で svg 扱えるようになっていたのかも。
使ってるよ、という方の話も聞いてみたい。

## インストール

> * [svg/svgo · GitHub](https://github.com/svg/svgo)

“`prettyprinted
% npm install -g svgo
“`

## つかいかた

下記の SVGファイルで試します。

> * [Rocket clip art – vector clip art online, royalty free & public domain](http://www.clker.com/clipart-rocket.html)

pitr_Rocket_icon.svg.thumb

### 元のSVGファイル

pitr_Rocket_icon.svg
中身は、4465 バイトの xml ファイルです。

“`xml




“`

### 実行結果

“`prettyprinted
% svgo pitr_Rocket_icon.svg pitr_Rocket_icon.min.svg
Done in 152 ms!
4.36 KiB – 71.8% = 1.228 KiB
“`

* 1257 pitr_Rocket_icon.min.svg
* 4465 pitr_Rocket_icon.svg

pitr_Rocket_icon.min.svg は、こんなにスッキリしている。

“`

“`

### gzip 圧縮で svgz

ちなみに gzip 圧縮すると、このようなサイズになりました。

“`prettyprinted
% svgo pitr_Rocket_icon.svg -o – | gzip -cfq9 > pitr_Rocket_icon.svgz
“`

* 528 pitr_Rocket_icon.svgz

### png だとどれくらい?

なお、png を ImageOptim で最適化すると、こんなサイズ。

* 2924 pitr_Rocket_icon.svg.thumb.png

> * [ImageOptim-CLI で画像ファイルを最適化する | deadwood](https://www.d-wood.com/blog/2013/12/12_5109.html)

## 出力されたファイルの比較サンプル

サンプル画像にリンクを張ってあります。

|Format|byte|
|:———–|————:|
|[.png](https://www.d-wood.com/demo/20131212/pitr_Rocket_icon.svg.thumb.png)| 2924 |
|[.svg](https://www.d-wood.com/demo/20131212/pitr_Rocket_icon.svg)| 4465 |
|[.min.svg](https://www.d-wood.com/demo/20131212/pitr_Rocket_icon.min.svg)| 1257 |
|[.svgz](https://www.d-wood.com/demo/20131212/gzip/pitr_Rocket_icon.svgz)| 528 |

## Grunt

> * [sindresorhus/grunt-svgmin](https://github.com/sindresorhus/grunt-svgmin)

## gzip圧縮したSVGファイル(.svgz)を表示するには

Apache の設定が必要になります。
今回確認のために実行した手順を記載しておきます。

> * [How to Configure Apache to Serve SVG/SVGZ the Right Way | kaioa.com](http://kaioa.com/node/45)

### .htaccess

画像フォルダに、下記の .htaccess ファイルを用意する。

“`
AddType image/svg+xml svg svgz
AddEncoding gzip svgz
“`

### 確認方法

Chrome Developer Tools などで確認します。

> * [Chrome Developer Tools で HTTP Header を確認する方法 | deadwood](https://www.d-wood.com/blog/2013/12/06_5088.html)

Response Header に下記の2つが含まれているか確認します。

* Content-Type: image/svg+xml
* Content-Encoding: gzip

#### .svg の場合

“`
Accept-Ranges:bytes
Connection:Keep-Alive
Content-Length:4465
Content-Type:image/svg+xml
Date:Wed, 11 Dec 2013 18:24:27 GMT
ETag:”23aa3b-1171-4ed45c2927b51″
Keep-Alive:timeout=3, max=50
Last-Modified:Wed, 11 Dec 2013 17:42:59 GMT
Server:Apache
X-Content-Type-Options:nosniff
X-XSS-Protection:1; mode=block
“`

#### .svgz の場合

“`
Accept-Ranges:bytes
Connection:Keep-Alive
Content-Encoding:gzip
Content-Length:528
Content-Type:image/svg+xml
Date:Wed, 11 Dec 2013 18:30:33 GMT
ETag:”23aa3d-210-4ed45c29482d7″
Keep-Alive:timeout=3, max=50
Last-Modified:Wed, 11 Dec 2013 17:42:59 GMT
Server:Apache
X-Content-Type-Options:nosniff
X-XSS-Protection:1; mode=block
“`
[/markdown]