Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
サイボウズフロントエンドマンスリー#26_エイチーム
Search
AijiUejima
August 30, 2022
Technology
500
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
サイボウズフロントエンドマンスリー#26_エイチーム
AijiUejima
August 30, 2022
More Decks by AijiUejima
See All by AijiUejima
エッジはフロントエンドなのか? バックエンドなのか? について考えてみる
aiji42
7
6.2k
Cloudflare Workersで構築する非同期ジョブシステム
aiji42
7
3.5k
VRTツールのダークホース Lost Pixelを紹介したい
aiji42
5
3.4k
オリジンサーバに手を付けないパーフォマンス改善
aiji42
5
2k
Cloudflare Fonts試してみた🔤
aiji42
2
930
Hyperdrive試してみた🛸
aiji42
3
1.7k
Workers Browser Rendering API について
aiji42
0
700
VercelとNext.jsの機能を最大限に活用したA/Bテスト手法
aiji42
6
1.9k
Cloudflare WorkersとKVで キャッシュを非同期に更新する | Cloudflare Meetup Nagoya
aiji42
1
1.1k
Other Decks in Technology
See All in Technology
Screen Lens - 今見てる画面を翻訳する
komagata
0
270
Minecraft JavaのMODをSwiftで作る
1mash0
0
150
幾何アルゴリズムで なめらかなピン操作を / iOSDC Japan 2026 / smoothpin
kazumanagano
0
330
DEFCON_CHV_CTF_Write-up.pdf
bata_24
0
150
OpenTelemetry eBPF Instrumentationの舞台裏 / Behind the Scenes of OpenTelemetry eBPF Instrumentation
ymotongpoo
4
1.2k
range over func 2年間の軌跡 Issue #56413 はGoのエコシステムをどう変えたか
ryujicre8ive
0
140
新機種発売前に見直そう!端末移行で再ログインが要るアプリ・要らないアプリは何が違うのか 〜シームレスに再開できる設計と実装〜
zozotech
PRO
0
150
データ界隈LT祭 第1回LT登壇
taromatsui_cccmkhd
1
1.2k
薬剤師(ドメインエキスパート)と一緒に育てる薬局向けAIアシスタント
kakehashi
PRO
2
160
Genieを崇めよ
kameitomohiro
0
110
Omarchy Quattro の日本語設定周り
simosako
2
170
[2026-09-11]SREは誰のもの?運用エンジニアが始める 「SRE領域への越境」とチームの進化の軌跡 〜Road to NEXT CRE
tosite
0
190
Featured
See All Featured
Code Reviewing Like a Champion
maltzj
528
40k
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
480
Building the Perfect Custom Keyboard
takai
2
870
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.6k
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
370
Designing Experiences People Love
moore
143
24k
The Spectacular Lies of Maps
axbom
PRO
1
990
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
23k
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.7k
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
sira's awesome portfolio website redesign presentation
elsirapls
0
410
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
3k
Transcript
© 2022 Ateam Inc. Cybozu Frontend Monthly #26
名前: aiji 職業: Webエンジニア (アプリケーションエンジニア) 分野: Cloudflare, Nodejs, TypeScript React,
Next.js, Remix, AWS, GCP 所属: Ateam Lifedesign Inc. twitter: @aiji42_dev GitHub: aiji42 Who am I ?
Who am I ? 名前: rito / chimame 職業: Webエンジニア
(アプリケーションエンジニア) 分野: Cloudflare, Ruby, Nodejs, TypeScript React, Docker, AWS, GCP 所属: Ateam Lifedesign Inc. twitter: @chimame_rt GitHub: chimame
© 2022 Ateam Inc. 4 エイチーム事業内容
© 2022 Ateam Inc. 5 エイチーム 主なサービス内容
© 2022 Ateam Inc. 今日 発表テーマ 6月頃、Zennに連投した記事 詳細
© 2022 Ateam Inc. CSRなサイトを (疑似的な)ISRに変更した話 7
© 2022 Ateam Inc. 題材となったサービス エイチームライフデザインが運営して いる総合情報サイト - カードローン -
クレジットカード - 転職 - 引越し - etc… SEOを重視したWebメディア
© 2022 Ateam Inc. 今日 話 赤枠で囲ったところ
© 2022 Ateam Inc. 今日 話 赤枠で囲ったところ
© 2022 Ateam Inc. Client Server Storage Database Api server
ナビナビ レンダリングに CSRが採用されている
© 2022 Ateam Inc. ナビナビ レンダリングに CSRが採用されている CSR 特徴 -
コンテンツ レンダリングをブラウザで行う - パフォーマンス ユーザ 環境に依存する - TTFB 早いがLCP・TTIまで 時間が長くなる傾向にある - クローラー インデックスが遅い - ナビナビ SEOを重視したメディアな で対策が必要
© 2022 Ateam Inc. Dynamic Rendering クローラーがJSを実行・解釈できなかった頃に提唱された対策 https://developers.google.com/search/docs/advanced/javascript/dynamic-rendering?hl=ja
© 2022 Ateam Inc. https://developers.google.com/search/docs/advanced/javascript/dynamic-rendering?hl=ja Dynamic Rendering レンダラに Rendertron(仮想ブラウザ)が採用されることが多い Rendertron
© 2022 Ateam Inc. ナビナビで実際に行われていたクローラー対策 ユーザに CSR用 スクリプトを返却 ボットに 静的なHTMLを返却
定期タスクで レンダリングしたデータを ストレージに保存 Origin Strage
© 2022 Ateam Inc. CWV対策 できていなかった(Chrome UX report)
© 2022 Ateam Inc. 現状 コードに大きな変更を加えずに CWVを改善する方法を模索 17
© 2022 Ateam Inc. ダイナミックレンダリングをベースにした改善を計画 ダイナミックレンダリングによる静的 HTMLをCDNでキャッシュし、 ボットだけでなくユーザにもそれを返却することで CWVを改善する。 さらにCloudflareWorkersでキャッシュコントロールすることで
ISRを実現する。
© 2022 Ateam Inc. 初回アクセス(キャッシュなし) オリジンからCSRスクリプトを返却 Client Origin Database Api
server Rendertron Cloudflare Workers
© 2022 Ateam Inc. レスポンス後に非同期でダイナミックレンダリング +キャッシュ保存を行う Client Origin Database Api
server Rendertron Cloudflare Workers KV
© 2022 Ateam Inc. 以降 リクエスト キャシュにより、ダイナミックレンダリング済み コンテンツが返却される restore cache
Client Origin Database Api server Rendertron Cloudflare Workers KV
© 2022 Ateam Inc. KV(キャッシュ)にExpire情報をもたせることで擬似的なISRを実現することも可能に if steal… regenerate Client Origin
Database Api server Rendertron Cloudflare Workers KV KV KV
© 2022 Ateam Inc. 導入結果 23
© 2022 Ateam Inc. 大幅に改善 (Chrome UX report)
© 2022 Ateam Inc. 大幅に改善 (Lighthouse) Before After
© 2022 Ateam Inc. アピールポイント 26
© 2022 Ateam Inc. ①Rendertron 魔改 そ ままで 組み込めない で、リポジトリクローンして地道に書き換え
- scriptタグを消す仕様を無効化 - Bot JSが必要ない でデフォルトで scriptタグが消える - ユーザがインタラクティブに操作するためJS 必要 - ApolloClient キャッシュをDOMに吐き出すようにする(後述) - Rendertronを通過したことを示すタグを挿入 - クライアント側 処理に使用
© 2022 Ateam Inc. ②データ再フェッチ 抑制 クライアントで再フェッチが発生しそ ままで LCPが改善しない SSR/SSGで取られる手法をRendertronに組込んで解決する
Rendertron pre-render & expose cache ApolloClient キャッシュを シリアライズしDOMに書き込む DOM上 キャッシュからリストアし データフェッチを省略 ❌ Origin Client
© 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
© 2022 Ateam Inc. 今後 展望 30
© 2022 Ateam Inc. 今後 展望 改善 したが、まだ完璧で ない 【残課題】
LCPおよびSI 改善したが、FCPおよびTTIが改善していない 【理由】 今回 対策で アプリケーション ほぼ手を入れていない で不要なJS ロードなども原因 1つだが、それと 別にRendertron HTMLレンダリングと Next.jsによるCSRが2回実行されることも原因 1つ。
© 2022 Ateam Inc. 今後 展望 対策案① GraphQL キャッシュをDOMに保持する で
なくGraphQLリクエスト自体 をキャッシュする 【説明】 少し難しい話になるが、GraphQL キャッシュリストを行うとReact Hydrateエ ラーを回避するためにNext.jsで CSRも再度実行するということを行ってい る。通常 GraphQLリクエスト 場合 それが起きない。
© 2022 Ateam Inc. 今後 展望 対策案② 擬似的なISRをやめ、SSR+キャッシュに寄せる 【説明】 そもそもCSRでWebメディアを運用する
に苦しい局面がある。インタラクティ ブに動作する画面でなけれ SSRに寄せる。リクエスト 都度SSRする 非 常にもったいない で、SSRした結果をどこかにキャッシュして配信する が一 番効率的。(ただし、改修コスト …)
© 2022 Ateam Inc. PR - 新卒向け - 9/8、9/27: オンライン会社説明会
(詳しく 採用ページへ) - 短期インターン(1week)と長期インターン(2months~)やってます - 中途向け - 直近 イベント等 ありませんが、常時採用してます! - 詳しく聞きたい、カジュアルに話してみたいという方 、 ぜひDMをお願いします 採用に限らず様々な技術発信をしてます で、ぜひフォローをお願いします
None