91
アメブロ2016 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~ 2017.2.25 Inside Frontend #1 @Yahoo Kazunari Hara (@herablog)

アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

Embed Size (px)

Citation preview

Page 1: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

アメブロ2016

実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

2017.2.25 Inside Frontend #1 @Yahoo Kazunari Hara (@herablog)

Page 2: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

アメブロ2016?

表示速度改善 システム, UIのモダン化

Page 3: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

アメブロ2016?

45,248行💪

Page 4: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

IsomorphicなWebで成果

Server ClientJavaScript JavaScript

API

Page 5: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

IsomorphicなWebで成果

Page 6: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

IsomorphicなWebで成果

Page 7: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

採用技術はこんな感じ

Page 8: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

詳しくはブログをアメブロ2016 ~ React/ReduxでつくるIsomorphic web app ~ https://developers.cyberagent.co.jp/blog/archives/636/

アメブロ2016 ~ Isomorphic JavaScriptの詳しい話 https://developers.cyberagent.co.jp/blog/archives/3513/

アメブロの大規模システム刷新と それを支えるSpring https://www.slideshare.net/nin2hanzo/spring-69237035

アメブロ2016:インフラ編 〜大規模リニューアルの裏側〜 https://developers.cyberagent.co.jp/blog/archives/2653/

Page 9: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

@herablog Kazunari Hara

Speaker

Shibuya Engineer

Page 10: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~
Page 11: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

アメブロ2016

実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

Page 12: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

2016.1.1 ~ 2016.8.31

Page 13: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

2016.1.1 ~ 2016.8.31

Page 14: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

Planning

Page 15: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

Planning

Page 16: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

The Standard

- エコシステムに乗っかる - “Say hallo to the world”

Page 17: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

Frontend Server (nodejs)

- 表示に関わるものをさっと変えられる - 弊社数々のサービスで導入実績あり

Page 18: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

JavaScript

- React - Flux -> Redux - ES6(, 7) - ESLint

Page 19: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

V8 5.7

Page 20: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

mid-March 🤗

https://github.com/nodejs/node/pull/10992#issuecomment-277925187

Page 21: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

CSS

- PostCSS - BEM -> CSS Modules - stylelint - Style guide -> Web

Page 22: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

Style guide

https://medium.com/@herablog/designing-style-guides-on-the-web-1706f3eefade#.3tzqlrfui

Page 23: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

HTML

- モダンなMETA - アクセシビリティ - AMP

Page 24: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

モダンなMETA

https://www.slideshare.net/herablog/meta-49939784

Page 25: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

アクセシビリティ

https://speakerdeck.com/herablog/ameburowosukurinridadedu-mishang-getemita-2016nian-xia

Page 26: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

AMP

Page 27: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

AMP

https://www.cyberagent.co.jp/technicalcreator/article/id=12157

Page 28: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

Build

- gulp -> Webpack - package.json

Page 29: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

Performance Auditing

Page 30: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

http://calendar.perfplanet.com/2012/make-your-mobile-pages-render-in-under-one-second/

- Critical Lengths - Critical Files - Critical Bytes

Browserの動きを理解する

Page 31: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

http://calendar.perfplanet.com/2012/make-your-mobile-pages-render-in-under-one-second/

Browserの動きを理解する

Page 32: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

http://calendar.perfplanet.com/2012/make-your-mobile-pages-render-in-under-one-second/

Browserの動きを理解するCRP Metrics: Length 3, Files 8, Bytes 28kb

TCP round trip limit

Page 33: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

http://calendar.perfplanet.com/2012/make-your-mobile-pages-render-in-under-one-second/

- Keep server backend time to generate HTML to a minimum (under 100ms) - Avoid HTTP redirects for the main HTML resource - Avoid loading blocking external JavaScript and CSS before the initial render - Inline just the JavaScript and CSS needed for the initial render - Delay or async load any JavaScript and CSS not needed for the initial render - Keep HTML payload needed to render initial content to under 15kB compressed

Make your mobile pages render in under one second

Basics

Page 34: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

Performance Auditing with

Chrome Developer Tools

SpeedCurve

etc.

Page 35: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

Performance Auditing

- 自分たちで調査・課題設定すること - 継続できること

Page 36: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

by Steve Souders

Page 37: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

Performance Auditing

https://speedcurve.com/herablog/test/160413_R2_a0d134e5e6384947e979f0f029c4f05e/?share=zpalm08uq1h35axc4d5ylxncbyp832

Page 38: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

Performance Auditing- HTMLファイルサイズを減らす (71kB) - Blocking Resourcesを減らす (8つ) - JavaScriptの非同期読み込み - CDNキャッシュの最適化 - Web Fontの統合 (3種類) - いらない読み込みの削除 - 画像のCSS化

Page 39: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

Goal

50%↓

Page 40: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

Architecture

Page 41: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

Isomorphic Web App (SSR + SPA)

SSR SPA SPA

Page 42: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

Lazy Load

SSR

JS

Page 43: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

Modern Workflow

- git-flow, Pull Request - CIによる自動テスト, ビルド, デプロイ

Page 44: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

Modern Workflow

CDN

Private CloudECR (Tokyo)

Page 45: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

Update Docs: README

Page 46: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

Update Docs: CONTRIBUTING.md

Page 47: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

Do

Page 48: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

Performance Auditing- HTMLファイルサイズを減らす (71kB) - Blocking Resourcesを減らす (8つ) - JavaScriptの非同期読み込み - CDNキャッシュの最適化 - Web Fontの統合 (3種類) - いらない読み込みの削除 - 画像のCSS化

Page 49: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

HTMLファイルサイズを減らす

- SSR + Lazy Load - 約1/7に削減 (71KB -> 9.8KB)

Page 50: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

Blocking Resourcesを減らす

- バンドル - 8から3つに削減

Page 51: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

JavaScriptの非同期読み込み

- SSR + バンドル + async属性

Page 52: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

CDNキャッシュの最適化

- バージョニングしているので長時間のキャッシュが可能

Page 53: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

Web Fontの統合

- 各サービスで作成していた - 共通利用できるよう単体サービス として運用

Page 54: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

Web Fontの統合

Web Font (WOFF2, WOFF, TTF) SVG Sprite

Page 55: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

いらない読み込みの削除

- 既存のコードを読みながらリストアップ

Page 56: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

画像のCSS化

- 画像でなくていい表現のCSS化

Page 57: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

No more ガタンッ

Page 58: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

本番のようにリリース

- リリースフローも固めていく

Page 59: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

Testing

Page 60: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

負荷試験

- 過去のアクセスログを元に検証 - Over 10,000 rps

Page 61: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

負荷試験

Page 62: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

負荷試験

Page 63: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

結果は悪かった

500

1000

1500

2000

5 10 20 40

283

928 965

1,887

レス

ポン

スタ

イム

(ms)

同時接続数

Target

Page 64: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

使い物にならない

Page 65: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

Turning

Page 66: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

Node.js with Chrome DevTools

https://medium.com/@paul_irish/debugging-node-js-nightlies-with-chrome-devtools-7c4a1b95ae27

Page 67: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

Node.js with Chrome DevTools

Page 68: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

renderToString() 遅い問題

Page 69: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

Caching

- 参照 > 更新 - 基本的に静的ドキュメント

Page 70: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

Cache Hit Rate

Page 71: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

Caching

HTML

renderToString()

Page 72: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

Caching

update blogger_verblogger_ver:key

data

on-memory

data data

data

Page 73: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

Redis vs Memcached

- Redisのeviction発生によるパフォーマンス低下 - データ量大・高アクセス時の単純なキャッシュで

はMemcached

https://twitter.com/cubicdaiya/status/827403388048470016

Page 74: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

Under 100ms

Page 75: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

React Fiber Architecture

http://isfiberreadyyet.com/

Page 76: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

Infra Structure

LB (Data Center)

Host

Host

Host

Page 77: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

Infra Structure

LB (Data Center)

Host

Host

Host

Page 78: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

リリースは難産だった…

- 段階リリース、うまくいかない - Slackに知らない人が入ってくる - 段階リリース、うまくいかない - Slackにエライ人が入ってくる

Page 79: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~
Page 80: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

2016.08.31 🚀

Page 81: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

❛❛ Premature optimization is the root of all evil. ❜❜

— Donald Knuth

Page 82: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

教訓

- 刷新は大変だった - そのぶん知見も得られた - 老害にならないようにがんばら

なくちゃいけない $

Page 83: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

One more thing...

Page 84: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

Front-End Performance Checklist 2017

Page 85: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

https://www.smashingmagazine.com/2016/12/front-end-performance-checklist-2017-pdf-pages/

Page 86: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

Service Worker, HTTP/2, CDN, srcset, client hints,

resource hints, HPACK, AMP, Instant Atricle etc.

Page 87: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

Lighthouse

https://github.com/GoogleChrome/lighthouse

Page 88: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

フロントエンドでできること

Page 89: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

フロント、がんばってこ💪

Page 90: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

Ask Me Anything

HOU Bin herablog

Page 91: アメブロ 2016: 実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

アメブロ2016

実録、アメブロリニューアル275日 ~ Webパフォーマンス編 ~

2017.2.25 Inside Frontend #1 @Yahoo Kazunari Hara (@herablog)