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
710
BlockchainTokyo23.pdf
biga816
1
420
BuidlMeetupVol2.pdf
biga816
0
45
Consider how distributed IPFS is
biga816
2
5.4k
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
DDDのエッセンスを取り入れたAIでの開発
ak2ie
0
210
あなたの知らないバージョン命名規則
sat
PRO
2
170
なぜ Temporal の大小比較には compare しかないのか / Why Does Temporal Only Have compare() for Comparisons
kazukihayase
1
200
社内の7割が使うデータ基盤を、 データチーム2人で回すためにやったこと
koh_yoshi
4
1.5k
Rust×eBPFでEDRっぽいものをつくる
sunlife3
2
830
現場回帰したデータエンジニアが考える AI 時代のキャリア開発 / Career Development in the Age of AI Perspectives from a Hands-on Data Engineer
medley
0
310
ソフトウェアサプライチェーンの構造的リスクとコンテナ環境の保護
kyohmizu
5
840
Head First モブプログラミング / Head First Mobprogramming
takaking22
10
12k
三人寄ればチューリング完全
puhitaku
6
2.9k
関東Kaggler会発表資料
takoi
1
280
【GCC2026】鉄拳8でのVFX開発事例
bandainamcostudios
PRO
0
260
AIに狂うスタートアップが、あえて「人との協働」に全振りした新卒エンジニア研修 / New Graduate Engineer Training at a Startup Accelerating AI Adoption
ohnoeight
0
180
Featured
See All Featured
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.4k
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
360
WENDY [Excerpt]
tessaabrams
11
39k
Being A Developer After 40
akosma
91
590k
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.5k
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
73
41k
How to build a perfect <img>
jonoalderson
1
5.9k
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
870
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.3k
Embracing the Ebb and Flow
colly
88
5.1k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.6k
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