Slide 1

Slide 1 text

© 2022 Ateam Inc. Cybozu Frontend Monthly #26

Slide 2

Slide 2 text

名前: aiji 職業: Webエンジニア (アプリケーションエンジニア) 分野: Cloudflare, Nodejs, TypeScript React, Next.js, Remix, AWS, GCP 所属: Ateam Lifedesign Inc. twitter: @aiji42_dev GitHub: aiji42 Who am I ?

Slide 3

Slide 3 text

Who am I ? 名前: rito / chimame 職業: Webエンジニア (アプリケーションエンジニア) 分野: Cloudflare, Ruby, Nodejs, TypeScript React, Docker, AWS, GCP 所属: Ateam Lifedesign Inc. twitter: @chimame_rt GitHub: chimame

Slide 4

Slide 4 text

© 2022 Ateam Inc. 4 エイチーム事業内容

Slide 5

Slide 5 text

© 2022 Ateam Inc. 5 エイチーム 主なサービス内容

Slide 6

Slide 6 text

© 2022 Ateam Inc. 今日 発表テーマ 6月頃、Zennに連投した記事 詳細

Slide 7

Slide 7 text

© 2022 Ateam Inc. CSRなサイトを (疑似的な)ISRに変更した話 7

Slide 8

Slide 8 text

© 2022 Ateam Inc. 題材となったサービス エイチームライフデザインが運営して いる総合情報サイト - カードローン - クレジットカード - 転職 - 引越し - etc… SEOを重視したWebメディア

Slide 9

Slide 9 text

© 2022 Ateam Inc. 今日 話 赤枠で囲ったところ

Slide 10

Slide 10 text

© 2022 Ateam Inc. 今日 話 赤枠で囲ったところ

Slide 11

Slide 11 text

© 2022 Ateam Inc. Client Server Storage Database Api server ナビナビ レンダリングに CSRが採用されている

Slide 12

Slide 12 text

© 2022 Ateam Inc. ナビナビ レンダリングに CSRが採用されている CSR 特徴 - コンテンツ レンダリングをブラウザで行う - パフォーマンス ユーザ 環境に依存する - TTFB 早いがLCP・TTIまで 時間が長くなる傾向にある - クローラー インデックスが遅い - ナビナビ SEOを重視したメディアな で対策が必要

Slide 13

Slide 13 text

© 2022 Ateam Inc. Dynamic Rendering クローラーがJSを実行・解釈できなかった頃に提唱された対策 https://developers.google.com/search/docs/advanced/javascript/dynamic-rendering?hl=ja

Slide 14

Slide 14 text

© 2022 Ateam Inc. https://developers.google.com/search/docs/advanced/javascript/dynamic-rendering?hl=ja Dynamic Rendering レンダラに Rendertron(仮想ブラウザ)が採用されることが多い Rendertron

Slide 15

Slide 15 text

© 2022 Ateam Inc. ナビナビで実際に行われていたクローラー対策 ユーザに CSR用 スクリプトを返却 ボットに 静的なHTMLを返却 定期タスクで レンダリングしたデータを ストレージに保存 Origin Strage

Slide 16

Slide 16 text

© 2022 Ateam Inc. CWV対策 できていなかった(Chrome UX report)

Slide 17

Slide 17 text

© 2022 Ateam Inc. 現状 コードに大きな変更を加えずに CWVを改善する方法を模索 17

Slide 18

Slide 18 text

© 2022 Ateam Inc. ダイナミックレンダリングをベースにした改善を計画 ダイナミックレンダリングによる静的 HTMLをCDNでキャッシュし、 ボットだけでなくユーザにもそれを返却することで CWVを改善する。 さらにCloudflareWorkersでキャッシュコントロールすることで ISRを実現する。

Slide 19

Slide 19 text

© 2022 Ateam Inc. 初回アクセス(キャッシュなし) オリジンからCSRスクリプトを返却 Client Origin Database Api server Rendertron Cloudflare Workers

Slide 20

Slide 20 text

© 2022 Ateam Inc. レスポンス後に非同期でダイナミックレンダリング +キャッシュ保存を行う Client Origin Database Api server Rendertron Cloudflare Workers KV

Slide 21

Slide 21 text

© 2022 Ateam Inc. 以降 リクエスト キャシュにより、ダイナミックレンダリング済み コンテンツが返却される restore cache Client Origin Database Api server Rendertron Cloudflare Workers KV

Slide 22

Slide 22 text

© 2022 Ateam Inc. KV(キャッシュ)にExpire情報をもたせることで擬似的なISRを実現することも可能に if steal… regenerate Client Origin Database Api server Rendertron Cloudflare Workers KV KV KV

Slide 23

Slide 23 text

© 2022 Ateam Inc. 導入結果 23

Slide 24

Slide 24 text

© 2022 Ateam Inc. 大幅に改善 (Chrome UX report)

Slide 25

Slide 25 text

© 2022 Ateam Inc. 大幅に改善 (Lighthouse) Before After

Slide 26

Slide 26 text

© 2022 Ateam Inc. アピールポイント 26

Slide 27

Slide 27 text

© 2022 Ateam Inc. ①Rendertron 魔改 そ ままで 組み込めない で、リポジトリクローンして地道に書き換え - scriptタグを消す仕様を無効化 - Bot JSが必要ない でデフォルトで scriptタグが消える - ユーザがインタラクティブに操作するためJS 必要 - ApolloClient キャッシュをDOMに吐き出すようにする(後述) - Rendertronを通過したことを示すタグを挿入 - クライアント側 処理に使用

Slide 28

Slide 28 text

© 2022 Ateam Inc. ②データ再フェッチ 抑制 クライアントで再フェッチが発生しそ ままで LCPが改善しない SSR/SSGで取られる手法をRendertronに組込んで解決する Rendertron pre-render & expose cache ApolloClient キャッシュを シリアライズしDOMに書き込む DOM上 キャッシュからリストアし データフェッチを省略 ❌ Origin Client

Slide 29

Slide 29 text

© 2022 Ateam Inc. ③キャッシュとリアルタイム 共存 社内アクセス 社外アクセス Cloudflare KV HTML + cache expire 2つが保存されている response HTML(SSR) response HTML(CSR) Rendertron response HTML(CSR) save HTML generate HTML (if cache expire) generate HTML(all access) アクセス 社内、社外で ルートと異なる CSRを実行して レンダリングした HTMLを生成する 記事を編集した結果をリアルタイムで表示する KV

Slide 30

Slide 30 text

© 2022 Ateam Inc. 今後 展望 30

Slide 31

Slide 31 text

© 2022 Ateam Inc. 今後 展望 改善 したが、まだ完璧で ない 【残課題】 LCPおよびSI 改善したが、FCPおよびTTIが改善していない 【理由】 今回 対策で アプリケーション ほぼ手を入れていない で不要なJS ロードなども原因 1つだが、それと 別にRendertron HTMLレンダリングと Next.jsによるCSRが2回実行されることも原因 1つ。

Slide 32

Slide 32 text

© 2022 Ateam Inc. 今後 展望 対策案① GraphQL キャッシュをDOMに保持する で なくGraphQLリクエスト自体 をキャッシュする 【説明】 少し難しい話になるが、GraphQL キャッシュリストを行うとReact Hydrateエ ラーを回避するためにNext.jsで CSRも再度実行するということを行ってい る。通常 GraphQLリクエスト 場合 それが起きない。

Slide 33

Slide 33 text

© 2022 Ateam Inc. 今後 展望 対策案② 擬似的なISRをやめ、SSR+キャッシュに寄せる 【説明】 そもそもCSRでWebメディアを運用する に苦しい局面がある。インタラクティ ブに動作する画面でなけれ SSRに寄せる。リクエスト 都度SSRする 非 常にもったいない で、SSRした結果をどこかにキャッシュして配信する が一 番効率的。(ただし、改修コスト …)

Slide 34

Slide 34 text

© 2022 Ateam Inc. PR - 新卒向け - 9/8、9/27: オンライン会社説明会 (詳しく 採用ページへ) - 短期インターン(1week)と長期インターン(2months~)やってます - 中途向け - 直近 イベント等 ありませんが、常時採用してます! - 詳しく聞きたい、カジュアルに話してみたいという方 、 ぜひDMをお願いします 採用に限らず様々な技術発信をしてます で、ぜひフォローをお願いします

Slide 35

Slide 35 text

No content