ServiceWorkerのキャッシュがストレージの容量食いだった

この記事は6ヶ月間下書きのまま眠っていたものを手直しして公開したものです
あまり鮮度が高くない記事ですがご了承ください。

## Cドライブの空き容量がピンチ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254984/ae745240-51ca-3593-8984-b0d9a736c177.png)
皆さんは、ストレージの空き容量に困っていませんか? 自分のメインPCはこんなことになっていました。今回は、この真っ赤状態の解決するために容量食いを消しまわった中で、特にChromeのServiceWorkerのキャッシュが気になったので記事にしてみました。

## 容量食いをDiskInfoで探してみた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254984/8c31653e-73b4-7ea1-43f4-e3289d55716e.png)
こちらは [DiskInfo](https://www.vector.co.jp/soft/winnt/util/se475617.html) というアプリで、サイズ占有率の高かったChromeフォルダ内を表示したものです。ServiceWorkerフォルダだけで2.23GBも消費しています! このPCを使い続けて2年間弱ほどですが、色んなサイトを渡り歩くと各地で勝手にServiceWorkerがキャッシュしてしまうのでこんなにも大きくなってしまうみたいです。そういうことなら、どのサイトも同じぐらいのサイズで細かいのが積み重なってるんだと思ってたのですが、何やらやたらに大きいサイトもあることを発見したので、上位のいくつかのサイズが大きい原因を探ってみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254984/46e73f3f-89ae-121d-d1a7-4ede3e625481.png)

## どれがどこのServiceWorkerなのかを確認するには?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254984/fadb65ef-d6f1-8e34-a3c0-b35ca9157169.png)
Chromeの仕様等確認せずに、ファイルから推測したものですが、各アルファベットフォルダ直下に存在するindex.txtにどのドメインのServiceWorkerであるかが載っています

## Qiita(キャッシュサイズ 25MB)
キャッシュをまるごと削除してもこのサイズだったのでそもそもこれぐらいのようです。
特に巨大な画像やソースはありませんでした。恐らくすごいコードが書いてあるのでしょう(?)

## Slack(キャッシュサイズ400MB)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254984/326a44a6-6ebf-a366-70bb-8924609707d8.png)
これはキャッシュフォルダに入っていた2つの英数字フォルダ内で、1番サイズが大きいファイルをそれぞれ開いたものです。内容は同じようですが上部のファイル名が違います。[webpackで自動でJSファイルにリビジョンを付けて配信する](http://suzumi.hatenablog.com/entry/2016/09/03/035833)という記事を参照したところ、どうやら予期せず更新前のコードがキャッシュから読み出されることを防ぐための仕様のようです。アップデートの度に新バージョンのファイルがそれまでと別でキャッシュされるため、サイズが膨れるようです。

## SEVEN'SCODE(キャッシュサイズ300MB)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254984/6d3a12f5-8e15-39aa-e8ff-eb18ae2dac10.png)
同様にフォルダ内で1番サイズの大きいファイルをバイナリエディタで見ると、mp4ファイルのキャッシュのようでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254984/8a484c8a-80cd-6a8c-f2af-87811bdf7c22.png)
実際ChromeのDevtoolでNetworkタブを見ながらサイトを開くと、systemページにある20MBほどの動画ファイル2つ、12MBの壁紙画像、1枚1MBのジャケット画像60枚等、かなりの画像ファイルがServiceWorkerから返ってきていました。解像度を変えて、メインターゲットであろうスマホから見ると、動画の代わりにスクリーンショットが表示されるため、ストレージはあまり食わないようです。PCでのみの問題ですが、公式サイトを少しだけ見に来たという人には迷惑かもしれないですね。

## 思ったこと
Slackのような大手サイトでも、前バージョンのファイルが残っているということは、意図的に過去の別名ファイルを消す方法がないのかもしれない。(それか単にその処理の実装にかかる手間を省略しているのか。)古いキャッシュを残したままだと、初期バージョンからずっと使っているユーザーはどんどんファイルが溜まってストレージを食いつぶしてしまうので、ちょっと気になるところ。あと、サイトの内容にもよるでしょうが、ServiceWorkerを利用する場合動画はキャッシュの例外に指定した方がよさそう。こうやって調べる人でもないと気づかないだろうけど、気づいた人には印象が悪くなってしまうかも。

## ServiceWorkerのキャッシュを消すには
~~だからといって、設定→一時ファイルを削除しようとしてもServiceWorkerのキャッシュは消えずに残ったり、ServiceWorker自体を手動で解除しようにも(登録されてるServiceWorkerが多く)重すぎて一覧が出せなかったりで、直接フォルダまで行って消すしかなかった。これはどうにもめんどくさいので、なんとかなってほしいところ... (PWA流行って欲しいのでこういうトラブルが多いと残念)~~
公開に当たり見直したところ、ServiceWorkerの一覧ページはすぐに出るようになっていたり、"サイト設定→データを削除ボタンを押せば"、ServiceWorkerのキャッシュも含めて削除する仕様になっていた。ストレージの空き容量に困っている人はServiceWorkerのキャッシュも簡単に削除できます。

## 参考
[Service Worker](https://qiita.com/propella/items/6500f76c9c1521878a6b)
ServiceWorkerはブラウザキャッシュと違って勝手には消えません

[Chromeを使うなら、必ずServiceWorkersを無効化しよう](https://qiita.com/rana_kualu/items/52d8cb7b200d6fefddc8)
本当にストレージに余裕がない場合は、ServiceWorkerを無効にすることもできるようです

## 蛇足
- HDDも搭載してるPCだし、OSだけしか入れないSSDは小さくてもいいやーと思ってケチるとこうなる可能性があります。ChromeやLINE等、デフォルトでCドライブにインストールされてしまうアプリのことをよく考えてから買いましょう。

- シンボリックリンクを別のドライブと結べば殆どの場合解決するはずですが、動かなくなるアプリがたまにあります。ChromeはSSDで動かしたいのであえてシンボリックリンクを引いていませんでした。

- PC版LINEクライアントのキャッシュは、意図的に消さない限り消えない仕様です

- ちょっと前にTwitterで、トップページでフルHDの動画が自動再生されるサイトが転送量の無駄遣いではないかと話題になっていたのでSEVEN'S CODEも燃えそうに思った

- 結局SSDをクローンして、より容量の大きなSSDと差し替えました