Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Service Worker Cache Problems
Search
biga816
April 17, 2019
Technology
1.8k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Service Worker Cache Problems
biga816
April 17, 2019
More Decks by biga816
See All by biga816
Euler Finance Hacking Incident
biga816
0
690
BlockchainTokyo23.pdf
biga816
1
420
BuidlMeetupVol2.pdf
biga816
0
41
Consider how distributed IPFS is
biga816
2
5.3k
Centralized Dapps to read from Dapps game
biga816
1
2.5k
Usage of ethereum libraries for dapps
biga816
0
4.6k
Other Decks in Technology
See All in Technology
CloudWatchから始めるAWS監視
butadora
0
310
AWS環境のセキュリティ不安を解消した企業事例 ~よくある課題と対策を一挙公開~
asanoharuki
1
280
検索技術知識0のエンジニアが広告検索システムを内製化して運用するまで
lycorptech_jp
PRO
0
200
20260608_Codexの可能性_ノンプログラマー向け_大城追記
doradora09
PRO
0
730
AIツールを導入しても生産性はあがらない? カオナビが直面した 3つの壁と乗り越え方。/ Overcoming 3 Barriers to AI-Driven Productivity at kaonavi
kaonavi
0
1.6k
SnowflakeCoCoでデータエンジニアリング!
foursue
0
120
AIがAPIを書く時代に、私たちは何を設計すべきか
nagix
0
200
NYC Summit 2026 におけるAmazon Bedrock AgentCore のアップデート
ren8k
3
310
AIで楽になるはずが、なぜ疲れる?
kinopeee
0
150
20260722_品質と開発生産性の相互作用
magicpod
0
110
StepFunctionsとGraphRAGを活用した暗黙知活用のためのRAG基盤
yakumo
1
200
AIがコードを書く時代、人間は何を保証するのか———馬場さんと考える、開発者に求められる新しい責任と価値 - TECH PLAY
netmarkjp
0
1.2k
Featured
See All Featured
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Ruling the World: When Life Gets Gamed
codingconduct
0
290
Visualization
eitanlees
152
17k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.8k
GraphQLとの向き合い方2022年版
quramy
50
15k
Art, The Web, and Tiny UX
lynnandtonic
304
22k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.9k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
680
The untapped power of vector embeddings
frankvandijk
2
1.8k
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
410
Writing Fast Ruby
sferik
630
63k
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
340
Transcript
Service WorkerのCacheで ⾊々と問題が起きた話 Akihiro Tanaka(@biga816)
とりあえずService Workerで キャッシュしまくってみた
前提 ɾ地下アイドル向けのDAppsをPWAしてみたときの話。 ɾionic3を利⽤。 ɾSW-Toolboxを利⽤(今はDeprecatedとなっている)。
問題1 キャッシュの上限に到達!
問題1 〜キャッシュの上限に到達〜 ɾ画像をキャッシュするようにしたら下記エラーが発⽣。 ɾファイルをキャッシュしすぎたためキャッシュ可能容量の上限 に達していた。 self.toolbox.router.get(/<ファイルサーバーのURL>/, (request) => { return
new Promise((resolve, reject) => { caches.match(request).then((response) => { if (response) { // from cache resolve(response); } // from network return fetch(request) .then((response) => resolve(response)) .catch((error) => reject(error)); }); }); });
解決策 ɾキャッシュ数の上限と期限を設定した。 self.toolbox.options.cache = { name: 'ionic-cache', maxAgeSeconds: 60 *
60 * 24, maxEntries: 50 };
問題2 開発環境でのみキャッシュの上限に到達!
問題2 〜開発環境でのみキャッシュの上限に到達〜 ɾ下記のエラーが気がついたらまた発⽣するようになった。 ɾ開発環境ではAoTコンパイルが実⾏されていないため、キャッ シュ対象となっていたアプリ⾃体のjsがキャッシュ容量を圧迫 していた。 self.toolbox.precache( [ './build/main.js', './build/vendor.js',
'./build/main.css', './build/polyfills.js', 'index.html', 'manifest.json' ] ); AoTコンパイル なしだとデカい
問題2 〜開発環境でのみキャッシュの上限に到達〜 ɾキャシュの上限はブラウザによって異なる。 <参考> https://developers.google.com/web/fundamentals/instant-and-offline/web-storage/offline-for-pwa
解決策 ɾ定期的にキャッシュを削除した。 ɾローカルで開発する際にはServiceWorkerをオフにしても良 かったかも。
問題3 キャッシュから動画が再⽣されない!
問題3 〜キャッシュから動画が再⽣されない〜 ɾSafariでのみ問題が発⽣。 ɾサーバーからデータを取得する初回は動画が再⽣されるが、2 回⽬以降キャッシュから取得する際には動画が再⽣されない。 Client App Cache Server
問題3 〜キャッシュから動画が再⽣されない〜 サーバーからの場合のHTTPヘッダ キャッシュの場合のHTTPヘッダ ɾHTTP Rangeリクエストに対し、Safariではレスポンスコード 200を受け取るとそれ以降そのファイルを読み込まない仕様に なっていた
解決策 ɾRangeリクエストが来た際にステータスコード206で返却する ようにService Workerでレスポンスを上書きする。
self.toolbox.router.get(/<ファイルサーバーのURL>/, (request) => { return new Promise((resolve, reject) => {
if (request.headers.get('range')) { // Range request let rangeHeader = request.headers.get('range'); let rangeMatch = rangeHeader.match(/^bytes¥=(¥d+)¥-(¥d+)?/) let pos = Number(rangeMatch[1]); let pos2 = rangeMatch[2]; if (pos2) { pos2 = Number(pos2); } caches.open('ionic-cache') .then((cache) => { return cache.match(request.url); }).then((res) => { if (!res) { return fetch(request.url).then(res => res.arrayBuffer()); } else { return res.arrayBuffer(); } }).then((ab) => { let responseHeaders = { status: 206, statusText: 'Partial Content', headers: [ ['Content-Type', 'video/mp4'], ['Content-Range', 'bytes ' + pos + '-' + (pos2 || (ab.byteLength - 1)) + '/' + ab.byteLength]] }; : Qiita: Service Worker(PWA)でRangeリクエストに対応する https://qiita.com/biga816/items/dcc69a265235f1c3f7e0 抜粋
まとめ ɾService Workerのキャッシュは便利だけど上限を意識する必要 がある。 ɾ無限に増えるコンテンツはCDNでキャッシュした⽅が良い。 ɾキャシュ対象はオフラインで最低限参照できると嬉しいファイ ルに絞るのが良い。
Thank you Twitter: @biga816 Qiita: biga816