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
BFCacheを活用して無限スクロールのUX を改善した話
Search
Ryuya Yanagi
March 25, 2026
Technology
220
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
BFCacheを活用して無限スクロールのUX を改善した話
Ryuya Yanagi
March 25, 2026
More Decks by Ryuya Yanagi
See All by Ryuya Yanagi
XO から Oxlint に移行した話
apple_yagi
0
50
最近の推しリンター、Oxlintをご紹介
apple_yagi
0
980
forwardRef を禁止したくて Biome に PR を出した話
apple_yagi
0
220
PR_TIMESにおけるFastlyの導入と運用について.pptx.pdf
apple_yagi
1
98
PR TIMESにおけるNext.jsとcacheの付き合い方
apple_yagi
4
6.1k
開発速度を上げつつ品質を保つためのフロントエンド開発
apple_yagi
1
1k
Other Decks in Technology
See All in Technology
FinOpsを導入してマルチプロダクトのコスト最適化を実現する
kworkdev
PRO
0
110
PostgreSQL オプティマイザ統計の秘密
nori_shinoda
0
140
LLMの知識とAIエージェント
happysamurai294
0
150
自律的なチームを作るためにTechPMがやらないこと
ny7760
0
490
キヨさん、67歳。AIコーディングエージェントに挑む
happysamurai294
0
140
視野はAIに、視座は人に / ai-for-breadth-humans-for-perspective
nkzn
6
2.8k
eBPF 簡介 2026 版
shunghsiyu
0
160
SLOを阻む不安
sraku2159
0
210
書き手が人でもAIでも正しくなる道、SREを埋め込んだDeveloper Platform / tech drivers day8
chmikata
4
890
アクセラレーターで実現するServiceNow活用の高速化 / ServiceNow World Forum 2026
visional_engineering_and_design
0
120
複雑な業務システムを高速でつくるため、チーム全員をつくれる人へ
ayakurabuchi
0
120
200人の配信コメント、 全部Jevが仕分けます 〜 マサカリガードを作ってみた 〜
katayamatg
1
510
Featured
See All Featured
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
960
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
550
How Software Deployment tools have changed in the past 20 years
geshan
2
35k
Bootstrapping a Software Product
garrettdimon
PRO
306
120k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.9k
Site-Speed That Sticks
csswizardry
13
1.6k
RailsConf 2023
tenderlove
30
1.6k
Build your cross-platform service in a week with App Engine
jlugia
234
19k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.9k
Ten Tips & Tricks for a 🌱 transition
stuffmc
1
280
What does AI have to do with Human Rights?
axbom
PRO
1
2.5k
[SF Ruby Conf 2025] Rails X
palkan
3
1.5k
Transcript
BFCacheを活用して無限スクロールのUX を改善した話 エンジニアとデザイナーで考えるUI/UX LT会@FE Yatai やなぎ @apple_yagi
やなぎ PR TIMES フロントエンドエンジニア X: @apple_yagi 好きな UI ライブラリは Base
UI です
無限スクロールを実装したことある人
https://gigazine.net/news/20260217-eu-kill-infinite-scrolling/ 余談
https://prtimes.jp/main/action.php?run=html&page=searchkey&search_word=fusic 私が実装した無限スクロールUI
元々 jQuery で実装されていたページを Next.js(Pages Router)にリプレイス 検索結果のリンクは next/link を使っていない ソフトナビゲーション(SPA遷移)ではなくハードナビゲーション ↑ここ大事
私が実装した無限スクロールUI
実装はできたが問題が。 。
ブラウザバックすると読み込んでいたデータが消える
ブラウザバックすると読み込んでいたデータが消える
スクロール位置や読み込んだデータをページ遷移前に sessionStorage とかに保存 してブラウザバック時に復元する? URL にスクロール位置をクエリパラメータ(例:?page=5)に保存しておいてブ ラウザバック時にそのページのデータをfetchする? 実装が複雑になるな どうやって改善するか
色々調べているととある記事を発見
None
これか?!
バックフォワード キャッシュ(bfcache)では、ユーザーがページから移動したと きにページを破棄するのではなく、破棄を延期して JS の実行を一時停止します。 ユーザーがすぐに戻った場合は、ページを再び表示し、JS の実行を再開します。 これにより、ユーザーはほぼ瞬時にページを移動できます。 https://web.dev/articles/bfcache?hl=ja BFCache
とは
ブラウザバック時に JS の実行を再開することができる 読み込んだデータを保持できる(React の useState の状態も復元できる) スクロール位置も保持することができる BFCache を有効にすることで
unload イベントは使用しない Cache-Control: no-store を使用しない ページ遷移する前に IndexedDB 接続や fetch/XMLHttpRequest、WebSocket など
を切断する next dev でサーバーを立ち上げた場合、WebSocket が使用されているので BFCache は効かない。開発環境でも next start で立ち上げて確認する必要 がある https://web.dev/articles/bfcache?hl=ja#optimize ※ ブラウザの種類やインストールしている拡張ツールによって挙動が変わるので確 実に BFCache を有効にするのはむずかしい BFCache を有効にするためには
検証ツール → アプリケーションタブ → バックフォワードキャッシュ BFCache が有効になっているか確認する(Chrome)
Cache-Control に no-store が設定されてるな
リプレイス前の Cache-Control ヘッダーを参考にしていたが経緯が不明 Cache-Control: private, no-cache, no-store, max-age=0, must- revalidate
になっていたので絶対にキャッシュしたくないんだろうなという 意思は感じる 社内で検討した結果、外しても問題なさそうだったので no-store を削除 そもそも Cache-Control: no-store が必要か
Cache-Control: no-store ブラウザやCDNなどのキャッシュサーバーに、レスポンスの保存を一切許可しな い Cache-Control: no-cache ブラウザやCDNがレスポンスをキャッシュすることは許可するが、再利用する前 に必ずサーバーへそのキャッシュが有効か問い合わせ(検証)を行う no-cache と言いつつキャッシュを許可するので注意
補足:no-store と no-cache の違い
再度 BFCache が有効になっているか確認すると
None
https://prtimes.jp/main/action.php?run=html&page=searchkey&search_word=fusic 実際にスクロール位置が保持されるか確認
トップページ のスマホビュー 弊社で BFCache を有効活用している他事例
無限スクロール、ブラウザバック時にデータ消える問題を BFCache を利用して 解決した BFCache を有効にすることでブラウザバック時に JS の実行を再開することが できる BFCache
を有効するためには unload イベントや、 Cache-Control: no-store を 使用しない ※ 今回はハードナビゲーションのページ遷移時の BFCache の有効化について説明し ました。ソフトナビゲーション(SPA遷移)の場合は BFCache を有効にしてもうま くいきません。 まとめ