100
基礎編 : 2012 モバイルフロントエンド最適化 ネットビジネス総合事業本部 マークアップエンジニア 石本 光司 2012.11.10 @Webridge Meeting SP12 featuring Frontrend

モバイル制作におけるパフォーマンス最適化について

Embed Size (px)

DESCRIPTION

世の中にはパフォーマンス最適化のためのベストプラクティスと呼ばれるものがたくさんありますが、一体どれから手をつければよいのしょうか、また一体どれが一番効果のある対策と言えるのでしょうか?一般論を言えば、ネットワーク改善から手をつけるべきで、その中でもHTTPリクエストを減らすのが一番効果的です。リクエストを減らすポピュラーなテクニックであるCSS SpriteをSass/Compassを利用しながら効率良く改善していきましょう。

Citation preview

Page 1: モバイル制作におけるパフォーマンス最適化について

基礎編 : 2012

モバイルフロントエンド最適化

ネットビジネス総合事業本部 マークアップエンジニア 石本 光司2012.11.10 @Webridge Meeting SP12 featuring Frontrend

Page 3: モバイル制作におけるパフォーマンス最適化について

デザインから考えるハイパフォーマンスWebサイト

Webパフォーマンス最適化のためのコーディング手法 心理学から考えるWebパフォーマンス

Page 5: モバイル制作におけるパフォーマンス最適化について

今日の流れ- あなたは何をされていますか?

- どちらが遅いのでしょうか?

- 私たちは何をすべきでしょうか?

- まとめ

Page 6: モバイル制作におけるパフォーマンス最適化について

あなたは何をされていますか?

Page 7: モバイル制作におけるパフォーマンス最適化について

back-end

つまり、あなたは?

front-end

Page 8: モバイル制作におけるパフォーマンス最適化について

back-end

つまり、あなたは?

front-end

Page 9: モバイル制作におけるパフォーマンス最適化について

僕は、フロントエンジニアだ!

Page 10: モバイル制作におけるパフォーマンス最適化について

1. HTTP リクエストを減らす

2. CDNを使用する

3. ブラウザーキャッシュを有効にする

4. Gzipを有効にする

5. スタイルシートは上部に設置

6. スクリプトは下部に設置

7. CSS Expressionsは避ける

8. JS/CSSファイルを外部化する

9. DNSルックアップを減らす

10. JS/CSSを縮小化する

11. リダイレクトを避ける

12. 重複スクリプトを削除する

13. ETagを設定する

14. Ajaxをキャッシュ可能にする

高速サイトのためのベストプラクティスby Yahoo! Developer Network

Page 11: モバイル制作におけるパフォーマンス最適化について

効果

難易度

高い

易しい難しい

低い

for front-end engineer

Page 12: モバイル制作におけるパフォーマンス最適化について

1効果

難易度

高い

易しい難しい

低い

23

4 56

78

910

1112

1314

for front-end engineer

Page 13: モバイル制作におけるパフォーマンス最適化について

1効果

難易度

高い

易しい難しい

低い

23

4 56

78

910

1112

1314

for front-end engineer

Page 14: モバイル制作におけるパフォーマンス最適化について

フロントエンドタスク

1. HTTP リクエストを減らす

5. スタイルシートは上部に設置

6. スクリプトは下部に設置

7. CSS Expressionsは避ける

8. JS/CSSファイルを外部化する

- - - - - - - - - - - - - - - - - - - - - - - - -

9. DNSルックアップを減らす

12. 重複スクリプトを削除する

Page 15: モバイル制作におけるパフォーマンス最適化について

フロントエンドタスク

1. HTTP リクエストを減らす5. スタイルシートは上部に設置

6. スクリプトは下部に設置

7. CSS Expressionsは避ける

8. JS/CSSファイルを外部化する

- - - - - - - - - - - - - - - - - - - - - - - - -

9. DNSルックアップを減らす

12. 重複スクリプトを削除する

Page 17: モバイル制作におけるパフォーマンス最適化について

バックエンドタスク2. CDNを使用する

3. ブラウザーキャッシュを有効にする

4. Gzipを有効にする

- - - - - - - - - - - - - - - - - - - - - - - - - - - - -

10. JS/CSSを縮小化する

11. リダイレクトを避ける

13. ETagを設定する

14. Ajaxをキャッシュ可能にする

Page 18: モバイル制作におけるパフォーマンス最適化について

バックエンドタスク2. CDNを使用する

3. ブラウザーキャッシュを有効にする

4. Gzipを有効にする- - - - - - - - - - - - - - - - - - - - - - - - - - - - -

10. JS/CSSを縮小化する

11. リダイレクトを避ける

13. ETagを設定する

14. Ajaxをキャッシュ可能にする

Page 19: モバイル制作におけるパフォーマンス最適化について

90PageSpeed Score

+

Page 20: モバイル制作におけるパフォーマンス最適化について

どちらが遅いのでしょうか?

Page 21: モバイル制作におけるパフォーマンス最適化について

ネットワーク

ハードウェアvs.

Page 22: モバイル制作におけるパフォーマンス最適化について

今後10年間でインターネットの帯域幅速度は57倍になると思われているが、コンピューターの処理能力は100倍以上になるだろう。

モバイルサイト vs. アプリ: 来るべき戦略の転換 ‒ U-Site

Page 23: モバイル制作におけるパフォーマンス最適化について

ネットワークは、重いのよ!!

Page 24: モバイル制作におけるパフォーマンス最適化について

1,000

1,500

2,000

2,500

3,000

3,500

1Mbp

s

2Mbp

s

3Mbp

s

4Mbp

s

5Mbp

s

6Mbp

s

7Mbp

s

8Mbp

s

9Mbp

s

10M

bps

帯域幅別のページの読み込み速度(m

s)

More Bandwidth Doesn’t Matter (Much) « Mike's Lookout

Page 25: モバイル制作におけるパフォーマンス最適化について

なんで?

Page 27: モバイル制作におけるパフォーマンス最適化について

HTTPリクエストの中身

クライアント

サーバー

Page 28: モバイル制作におけるパフォーマンス最適化について

HTTPリクエストの中身

DNSルックアップ

ISP

クライアント

サーバー

Page 29: モバイル制作におけるパフォーマンス最適化について

HTTPリクエストの中身

DNSルックアップ

ISP

クライアント

サーバー

DNS Lookup

Page 30: モバイル制作におけるパフォーマンス最適化について

HTTPリクエストの中身

DNSルックアップ

ISP

クライアント

サーバー

DNS Lookup

最初の接続

Page 31: モバイル制作におけるパフォーマンス最適化について

HTTPリクエストの中身

接続の確立

DNSルックアップ

ISP

クライアント

サーバー

DNS Lookup

最初の接続

Page 32: モバイル制作におけるパフォーマンス最適化について

HTTPリクエストの中身

接続の確立

DNSルックアップ

ISP

クライアント

サーバー

DNS Lookup Connecting

最初の接続

Page 33: モバイル制作におけるパフォーマンス最適化について

HTTPリクエストの中身

接続の確立

DNSルックアップ

ISP

クライアント

サーバー

DNS Lookup Connecting

最初の接続 最初のHTTPリクエスト

Page 34: モバイル制作におけるパフォーマンス最適化について

HTTPリクエストの中身

接続の確立

DNSルックアップ

ISP

最初のデータ送信

最初のデータ受信クライアント

サーバー

DNS Lookup Connecting

最初の接続 最初のHTTPリクエスト

Page 35: モバイル制作におけるパフォーマンス最適化について

HTTPリクエストの中身

接続の確立

DNSルックアップ

ISP

最初のデータ送信

最初のデータ受信クライアント

サーバー

DNS Lookup Connecting Waiting

最初の接続 最初のHTTPリクエスト

Page 36: モバイル制作におけるパフォーマンス最適化について

HTTPリクエストの中身

接続の確立

DNSルックアップ

ISP

最初のデータ送信

最初のデータ受信

最後のデータ送信

最後のデータ受信クライアント

サーバー

DNS Lookup Connecting Waiting

最初の接続 最初のHTTPリクエスト

Page 37: モバイル制作におけるパフォーマンス最適化について

HTTPリクエストの中身

接続の確立

DNSルックアップ

ISP

最初のデータ送信

最初のデータ受信

最後のデータ送信

最後のデータ受信クライアント

サーバー

DNS Lookup Connecting Waiting Receiving

最初の接続 最初のHTTPリクエスト

Page 38: モバイル制作におけるパフォーマンス最適化について

HTTPリクエストの中身

接続の確立

DNSルックアップ

ISP

最初のデータ送信

最初のデータ受信

最後のデータ送信

最後のデータ受信クライアント

サーバー

DNS Lookup Connecting Waiting Receiving

最初の接続 最初のHTTPリクエスト

RTT

Page 39: モバイル制作におけるパフォーマンス最適化について

HTTPリクエストの中身

接続の確立

DNSルックアップ

ISP

最初のデータ送信

最初のデータ受信

最後のデータ送信

最後のデータ受信クライアント

サーバー

DNS Lookup Connecting Waiting Receiving

最初の接続 最初のHTTPリクエスト

RTTDL

Page 40: モバイル制作におけるパフォーマンス最適化について

DNSの名前解決

TCPコネクション確立に要する時間

ブラウザーキューからネットワークに接続するまでの時間

データのリクエストをサーバーに送信するのに要する時間

レスポンスの待ち時間

レスポンスボディをダウンロードするのに要する時間

DNS Lookup:

Connecting:

Blocking:

Sending:

Waiting:

Receiving:

Page 41: モバイル制作におけるパフォーマンス最適化について

ラウンドトリップタイムRTT

DL ペイロードサイズ

Page 42: モバイル制作におけるパフォーマンス最適化について

私たちは何をすべきでしょうか?

Page 43: モバイル制作におけるパフォーマンス最適化について

ラウンドトリップタイムRTT

Page 44: モバイル制作におけるパフォーマンス最適化について

CSS Sprite

ラウンドトリップタイムRTT

Page 45: モバイル制作におけるパフォーマンス最適化について

Requests 30 vs. 1 (CSS Sprite)

Page 46: モバイル制作におけるパフォーマンス最適化について

Requests 30 vs. 1 (CSS Sprite)

Page 47: モバイル制作におけるパフォーマンス最適化について
Page 48: モバイル制作におけるパフォーマンス最適化について
Page 51: モバイル制作におけるパフォーマンス最適化について

めんどくさい...

Page 52: モバイル制作におけるパフォーマンス最適化について

知ってる?

Page 54: モバイル制作におけるパフォーマンス最適化について

t32k at MacBookPro in ~$ gem install compass$ compass create my_project$ cd /my_project$ compass watch

Command line

Page 55: モバイル制作におけるパフォーマンス最適化について

t32k at MacBookPro in ~$ gem install compass$ compass create my_project$ cd /my_project$ compass watch

Command line

Page 56: モバイル制作におけるパフォーマンス最適化について

@import "compass";@import "/sprites/category/*.png";@include all-category-sprites;

Sass + compass

Page 57: モバイル制作におけるパフォーマンス最適化について

.category-sprite, .category-chat, .category-fav, .category-home, .category-love, .category-mind, .category-new, .category-nightlife, .category-work { background: url(/sprites/category-s87c70fb891.png) no-repeat; }

.category-chat { background-position: 0 -168px; }

.category-fav { background-position: 0 -42px; }

.category-home { background-position: 0 -294px; }

.category-love { background-position: 0 -252px; }

.category-mind { background-position: 0 -84px; }

.category-new { background-position: 0 -210px; }

.category-nightlife { background-position: 0 0; }

.category-work { background-position: 0 -126px; }

CSS

Page 58: モバイル制作におけるパフォーマンス最適化について

.category-sprite, .category-chat, .category-fav, .category-home, .category-love, .category-mind, .category-new, .category-nightlife, .category-work { background: url(/sprites/category-s87c70fb891.png) no-repeat; }

.category-chat { background-position: 0 -168px; }

.category-fav { background-position: 0 -42px; }

.category-home { background-position: 0 -294px; }

.category-love { background-position: 0 -252px; }

.category-mind { background-position: 0 -84px; }

.category-new { background-position: 0 -210px; }

.category-nightlife { background-position: 0 0; }

.category-work { background-position: 0 -126px; }

CSS

Page 59: モバイル制作におけるパフォーマンス最適化について

// For Retina @2x@mixin sprites($map, $map-item, $isCommon:false) { @if $isCommon { display: inline-block; background-image: sprite-url($map); background-repeat: no-repeat; background-size: (image-width(sprite-path($map)) / 2) (image-height(sprite-path($map)) / 2); } @else { $pos-y: round(nth(sprite-position($map, $map-item), 2) / 2); width: image-width(sprite-file($map, $map-item)) / 2; height: image-height(sprite-file($map, $map-item)) / 2; background-position: 0 $pos-y; }}

@mixin

Page 60: モバイル制作におけるパフォーマンス最適化について

$sprites-category: sprite-map("sprites/category/*.png");.common-property { @include sprites($sprites-category, foo, true);}.indivisual-property-fav { @include sprites($sprites-category, fav, false);}.indivisual-property-chat { @include sprites($sprites-category, chat, false);}

Usage

Page 61: モバイル制作におけるパフォーマンス最適化について

.common-property { display: inline-block; background-image: url('/images/sprites/category-s13fa409ec6.png'); background-repeat: no-repeat; background-size: 21px 168px;}

.indivisual-property-fav { width: 21px; height: 21px; background-position: 0 -21px;}

.indivisual-property-chat { width: 21px; height: 21px; background-position: 0 -84px;}

CSS

Page 62: モバイル制作におけるパフォーマンス最適化について
Page 63: モバイル制作におけるパフォーマンス最適化について

•画像をPs/Fwで並べる

Page 64: モバイル制作におけるパフォーマンス最適化について

•画像をPs/Fwで並べる

•background-positionを測る

Page 65: モバイル制作におけるパフォーマンス最適化について

•画像をPs/Fwで並べる

•background-positionを測る

•コードに反映する

Page 66: モバイル制作におけるパフォーマンス最適化について

•画像をPs/Fwで並べる

•background-positionを測る

•コードに反映する

/(^o^)\オワタ

Page 67: モバイル制作におけるパフォーマンス最適化について
Page 68: モバイル制作におけるパフォーマンス最適化について

•画像ディレクトリに出し入れするだけ

Page 69: モバイル制作におけるパフォーマンス最適化について

•画像ディレクトリに出し入れするだけ

(´∀`)つ ミ

Page 70: モバイル制作におけるパフォーマンス最適化について

DL ペイロードサイズ

Page 71: モバイル制作におけるパフォーマンス最適化について

Gzip

DL ペイロードサイズ

Page 73: モバイル制作におけるパフォーマンス最適化について

圧縮効率を最大化する

Page 74: モバイル制作におけるパフォーマンス最適化について

Yourself

Don’tRepeat

Page 75: モバイル制作におけるパフォーマンス最適化について

.foo { -webkit-border-radius: 5px; -moz-border-radius: 5px; -ms-border-radius: 5px; -o-border-radius: 5px; border-radius: 5px;}

CSS

Page 76: モバイル制作におけるパフォーマンス最適化について

F****** CSS

Page 77: モバイル制作におけるパフォーマンス最適化について

知ってる?

Page 78: モバイル制作におけるパフォーマンス最適化について

@import "compass";.foo { @include border-radius(5px);}

Sass + compass

Page 79: モバイル制作におけるパフォーマンス最適化について

.foo { -webkit-border-radius: 5px; -moz-border-radius: 5px; -ms-border-radius: 5px; -o-border-radius: 5px; border-radius: 5px;}

Output CSS

Page 80: モバイル制作におけるパフォーマンス最適化について

F****** CSS

Page 82: モバイル制作におけるパフォーマンス最適化について

コードの一貫性を保つ

Page 83: モバイル制作におけるパフォーマンス最適化について

.foo { -webkit-border-radius: 1px; -moz-border-radius: 1px; -ms-border-radius: 1px; -o-border-radius: 1px; border-radius: 1px;}.bar { -webkit-border-radius: 3px; -moz-border-radius: 3px; -ms-border-radius: 3px; -o-border-radius: 3px; border-radius: 3px;}.baz { -webkit-border-radius: 5px; -moz-border-radius: 5px; -ms-border-radius: 5px; -o-border-radius: 5px; border-radius: 5px;}

CSS.foo { -ms-border-radius: 1px; -webkit-border-radius: 1px; -moz-border-radius: 1px; -o-border-radius: 1px; border-radius: 1px;}.bar { -moz-border-radius: 3px; -ms-border-radius: 3px; -o-border-radius: 3px; -webkit-border-radius: 3px; border-radius: 3px;}.baz { -o-border-radius: 5px; -webkit-border-radius: 5px; -ms-border-radius: 5px; -moz-border-radius: 5px; border-radius: 5px;}

Page 84: モバイル制作におけるパフォーマンス最適化について

.foo { -webkit-border-radius: 1px; -moz-border-radius: 1px; -ms-border-radius: 1px; -o-border-radius: 1px; border-radius: 1px;}.bar { -webkit-border-radius: 3px; -moz-border-radius: 3px; -ms-border-radius: 3px; -o-border-radius: 3px; border-radius: 3px;}.baz { -webkit-border-radius: 5px; -moz-border-radius: 5px; -ms-border-radius: 5px; -o-border-radius: 5px; border-radius: 5px;}

Uncompressed:.foo { -ms-border-radius: 1px; -webkit-border-radius: 1px; -moz-border-radius: 1px; -o-border-radius: 1px; border-radius: 1px;}.bar { -moz-border-radius: 3px; -ms-border-radius: 3px; -o-border-radius: 3px; -webkit-border-radius: 3px; border-radius: 3px;}.baz { -o-border-radius: 5px; -webkit-border-radius: 5px; -ms-border-radius: 5px; -moz-border-radius: 5px; border-radius: 5px;}

416B

Page 85: モバイル制作におけるパフォーマンス最適化について

.foo { -webkit-border-radius: 1px; -moz-border-radius: 1px; -ms-border-radius: 1px; -o-border-radius: 1px; border-radius: 1px;}.bar { -webkit-border-radius: 3px; -moz-border-radius: 3px; -ms-border-radius: 3px; -o-border-radius: 3px; border-radius: 3px;}.baz { -webkit-border-radius: 5px; -moz-border-radius: 5px; -ms-border-radius: 5px; -o-border-radius: 5px; border-radius: 5px;}

Compressed:.foo { -ms-border-radius: 1px; -webkit-border-radius: 1px; -moz-border-radius: 1px; -o-border-radius: 1px; border-radius: 1px;}.bar { -moz-border-radius: 3px; -ms-border-radius: 3px; -o-border-radius: 3px; -webkit-border-radius: 3px; border-radius: 3px;}.baz { -o-border-radius: 5px; -webkit-border-radius: 5px; -ms-border-radius: 5px; -moz-border-radius: 5px; border-radius: 5px;}

122B 130B

Page 86: モバイル制作におけるパフォーマンス最適化について

.foo { -webkit-border-radius: 1px; -moz-border-radius: 1px; -ms-border-radius: 1px; -o-border-radius: 1px; border-radius: 1px;}.bar { -webkit-border-radius: 3px; -moz-border-radius: 3px; -ms-border-radius: 3px; -o-border-radius: 3px; border-radius: 3px;}.baz { -webkit-border-radius: 5px; -moz-border-radius: 5px; -ms-border-radius: 5px; -o-border-radius: 5px; border-radius: 5px;}

CSS.foo { -ms-border-radius: 1px; -webkit-border-radius: 1px; -moz-border-radius: 1px; -o-border-radius: 1px; border-radius: 1px;}.bar { -moz-border-radius: 3px; -ms-border-radius: 3px; -o-border-radius: 3px; -webkit-border-radius: 3px; border-radius: 3px;}.baz { -o-border-radius: 5px; -webkit-border-radius: 5px; -ms-border-radius: 5px; -moz-border-radius: 5px; border-radius: 5px;}

-69%-71%

Page 88: モバイル制作におけるパフォーマンス最適化について

Googleの検索結果ページでは、

HTML属性をアルファベット順に記述した場合、gzip後のサイズが

1.5%削減することができた。圧縮を有効にする - Make the Web Faster ̶ Google Developers

Page 90: モバイル制作におけるパフォーマンス最適化について

そんなに心配しすぎない

Page 91: モバイル制作におけるパフォーマンス最適化について

まとめ

Page 92: モバイル制作におけるパフォーマンス最適化について
Page 93: モバイル制作におけるパフォーマンス最適化について

$ 私たちは何をすべきでしょうか?

Page 94: モバイル制作におけるパフォーマンス最適化について

$ 私たちは何をすべきでしょうか?

>> フロントエンドに着目しなさい

Page 95: モバイル制作におけるパフォーマンス最適化について

$ 私たちは何をすべきでしょうか?

>> フロントエンドに着目しなさい

$ 私たちは何をすべきでしょうか?

Page 96: モバイル制作におけるパフォーマンス最適化について

$ 私たちは何をすべきでしょうか?

>> フロントエンドに着目しなさい

$ 私たちは何をすべきでしょうか?

>> ネットワーク段階を改善しなさい

Page 97: モバイル制作におけるパフォーマンス最適化について

$ 私たちは何をすべきでしょうか?

>> フロントエンドに着目しなさい

$ 私たちは何をすべきでしょうか?

>> ネットワーク段階を改善しなさい

$ 私たちは何をすべきでしょうか?

Page 98: モバイル制作におけるパフォーマンス最適化について

$ 私たちは何をすべきでしょうか?

>> フロントエンドに着目しなさい

$ 私たちは何をすべきでしょうか?

>> ネットワーク段階を改善しなさい

$ 私たちは何をすべきでしょうか?

>> RTTとペイロードサイズを縮小しなさい

Page 99: モバイル制作におけるパフォーマンス最適化について

Thank you :)koji.ishimoto@t32kt32k

このスライドはJina Boltonさんのスライドを参考にしました。ありがとう @jina :)

Page 100: モバイル制作におけるパフォーマンス最適化について

photo credit- http://www.flickr.com/photos/expose_switch/4566783151/

- http://www.flickr.com/photos/ivko999/5082864854/

- http://www.flickr.com/photos/peasap/4684467836/

- http://www.flickr.com/photos/emrank/2191608962/

- http://www.flickr.com/photos/spilt-milk/6042115943/

- http://www.flickr.com/photos/avidlyabide/7509737450/

- http://www.flickr.com/photos/hinkelstone/2435823037/

- http://www.flickr.com/photos/alex-d/2770828285/

- http://www.flickr.com/photos/expose_switch/4566783201/

- http://www.flickr.com/photos/expose_switch/4566783171/