Frontrend Vol.10 アウトラインメモ
Frontrend Vol.10
Frontrend Vol.10 - 夏の終わりに納涼パフォーマンス話 - connpassに参加してきたのでメモ。
FRESH!: クライアントサイドパフォーマンス改善 by @sutiwo_
- FRESH! Web パフォーマンス改善 〜クライアントサイド編〜の話
- FRESHはPCとSPの視聴/配信のブラウザ対応
- 生放送のタイムラグを10秒 -> 5秒
- Freshのウェブプッシュ通知機能
- Freshアクセシビリティガイドライン
- Service Worker
- バックグラインドで実行するWorker
- postMessageでのやり取り
- ネットワークのハンドリング
- PUsh通知
- httpsが必須
- ブラウザ <-> SW <-> ネットワーク
- FRESHではFirefox + Chrome = 50%ぐらいの利用者にある
- SWが50%のユーザーに適応できる
- 設計と実装
- キャッシュがあれば、キャッシュを使いない場合はFetchする
- リリース単位でキャッシュさせる(CircleCIでビルド時にIDを含める)
- 意図的に更新させないとキャッシュされ続けるもの
version.json
で任意の日付をマニュアル更新
- ディレクトリ構成
- service-worker
- asserts.js - キャッシュのホワイトリスト
- index.js - イベントハンドラ登録
- register.js SWのインストール判定
- service-worker
- デバッグ方法
- Chrome DevToolsを使ってる
- assetsのパスに日付が入ってる
- ローカルで確認する時
- 環境変数でフラグを用意 =
DISABLED_SW_CACHE
- ブラウザでスーパーリロードする
- 環境変数でフラグを用意 =
- Intersection Observerでの遅延ロード
- ランキングの表示
- 50件でているが見えるのは最初の6-7件
- Intersection Observerを使って遅延ロード
- openfresh/viewport-observer: A React Component that observe changes in the intersection of a target element with viewport using IntersectionObserver
- Reactラッパー
- SVGスプライトとHTTP/2
- SVGファイル毎にリクエストするHTTP/1だと問題がある
- SVGスプライトにまとめた
- すべてのSVGが読み終わるまで、どのSVGもでない
- ただHTTP/2なら特に問題にならないので個別で読み込んだ
- 個別のSVGで読み込むようにした
- SpeedCurveで計測してる
パフォーマンスを改善して本を売る!「読書のお時間です」の取り組みについて
- 5年続いたSPAのウェブサービスをSSRにした話
- 問題分析
- ボトルネック調査
- 設計
- Before
- jQuery
- handlebars
- Grunt
- After
- React/webpack色々
- Before
- 開発
- プロイピング
- 主要ページからリニューアルする
- 旧仕様のページと行き来できる作り(共存する)
#!
から/
に変更
- リリース
- ページロード 30% down
- コンテンツサイズ 50% down
- 展開
- 対象ページが100ページ以上あった
- 既存のものを運用しないといけない
- 画像との戦い
- 本の表紙 = 書影
- 画像の提供元によってサイズなどがバラバラ
- パフォーマンス計測とKPIの紐付け
- RUM-speedIndex
- SpeedIndexとKPIを紐付けてビジュアライズ
アメブロ: Isomprhicアプリケーションのパフォーマンス・チューニング
スライド: アメブロ: Isomprhicアプリケーションのパフォーマンス・チューニング // Speaker Deck
- アメブロ2016 ~ React/ReduxでつくるIsomorphic web app ~の話
- Javaベース -> Node.jsベースに変更
- SSR: Isomorphic App(SPA + SSR) + React+ Redux + React Router
- バックエンドキャッシュは大分
- React SSRはパフォーマンスが悪い
- クライントは特定のユーザー、サーバサイドはすべてのユーザにサービスを提供
- なのでサーバサイドはキャッシュとかしないと
- バックエンドのキャッシュの設計
- 問題点を洗い出す
- 何をキャッシュするか
- Router -> Redux Store準備(API Object) -> Render -> HTML
- RenderToStringはとても重たい
- 同期的な処理
- Note: React 16では30%程度改善
- https://twitter.com/herablog/status/893421865670017024
- RenderToStringはキャッシュしたい
- ただしユーザーによって違うのでそのままキャッシュできない
- RenderToStringはテンプレートを吐き出して、クライアントサイドでそれをレンダリングする
- API Objectもキャッシュすることでより改善された
- キャッシュするタイミング
- アクセスされたとき
- キャッシュを削除するタイミング
- 記事を更新したら、記事IDから記事のキャッシュを消すのはNG
- 実際は記事を更新したら、記事本体、記事一覧、記事の前後などいろんなところを影響する
- 実装はかなり複雑になるので、キャッシュの削除は難しい
- AmebaブログはユーザIDに紐付いているので、更新したらユーザIDに紐づくページをすべて削除する
- FallbackとしてキャッシュのTTLで失効させる
- キッシュのトランザクション
- キャッシュの更新とアクセスでキャッシュ作られたときに衝突してしまう問題
- キャッシュのkeyは namespace(user-id)+version をつかうようにした
- なので削除ではなくバージョンの更新 = キャッシュの削除
- Local Cache VS Cache Server
- Node.jsのインスタンス数が多い(オンメモリだけではばらけてしまう)
- オンメモリのキャッシュ + キャッシュサーバを併用
- 何をキャッシュするか
- 遅延ロード
- SSR -> SPA
- kouhin/rrr-lazy: A fork of react-lazy-load and add support for react-router, react-router-hook.
- サーバサイドではレンダリングしないコンポーネントを指定できる
- ページの表示範囲
- クライントサイドの処理
- Intersection Observer的な遅延ロード
- コードの分割
- JavaScriptのパース時間が短くなる
- main.jsの肥大化を防ぐ
- webpack
- 分割粒度: AtomicデザインのOrganisms毎
- Dynamic Importで遅延ロード
- 分割するとビルドが遅い
- ローカルではコード分割しない
- knpwrs/babel-plugin-remove-webpack: Removes webpack-specific functions from JavaScript code.などで無効化してる
- chunkのサイズは結構でかい
- SSR -> SPA
- Service Worker
- HTTP/2 && コード分割
- Chromeは一度にリクエストできるの6つまで
- 一括で読み込むと詰まることがある
- この辺は改善していきたい
Q&A
- Q. パフォーマンス計測ツールはアメーバ社内で共通化されてるの?
- A. アメブロはSpeedCurveとか
- 1000chに聞いて
お知らせ欄
JavaScript Primerの書籍版がAmazonで購入できます。
JavaScriptに関する最新情報は週一でJSer.infoを更新しています。
GitHub Sponsorsでの支援を募集しています。