サービスワーカーとは
サービスワーカーは、ページとネットワークの間に入って、通信を預かるスクリプトです。前に取っておいたファイルを返せるので、電波がなくてもページが開きます。
このレッスンでは、サービスワーカーの流れと、キャッシュの戦略を学びます。
このレッスンのゴール
メモ
ページがオフラインでも動く仕組みを、説明できる。
重要な言葉
| ことば | いみ | れい |
|---|---|---|
| サービスワーカー | ページの裏で動き、通信を預かるスクリプト | sw.js |
| キャッシュ | 取ったファイルを、端末に取っておく場所 | |
| オフライン | ネットワークにつながっていない状態 | |
| キャッシュ戦略 | 要求に、キャッシュとネットワークのどちらで答えるかの決まり | |
| アプリシェル | 画面の骨組みになる、HTML と CSS と JavaScript |
学生が入力するセルは、このプレビューでは空白です。
サービスワーカーは通信の仲介役
普段、ページが何かを求めると、その要求はネットワークへ出ます。サービスワーカーがあると、要求は、まずそこへ届きます。
サービスワーカーは、キャッシュにあればそれを返し、なければネットワークへ取りに行く、といった判断ができます。
入れる、有効にする、横取りする
サービスワーカーには、3つの場面があります。install は、最初に入るときです。ここで、アプリのファイルをキャッシュに入れます。
activate は、有効になるときです。古いキャッシュを片付けます。fetch は、ページが何かを求めるたびです。
ファイルを覚えるワーカー
// 学食アプリの骨組みを、端末に取っておく
const CACHE = "cafeteria-v1";
const FILES = ["/", "/style.css", "/app.js"];
self.addEventListener("install", (event) => {
event.waitUntil(caches.open(CACHE).then((cache) => cache.addAll(FILES)));
});
// 取ってあれば返し、なければネットワークへ
self.addEventListener("fetch", (event) => {
event.respondWith(caches.match(event.request).then((hit) => hit || fetch(event.request)));
});1つでも取れないと、全部が入らない
cache.addAll は、リストのファイルを、まとめて取って入れます。ただし、1つでも取れないと、全部が失敗します。
リストに書いたファイルが、本当にあるか、確かめることが大切です。
ラボのワーカーのリストを調べる
ラボの sw.js が、覚えようとしているファイルを読み、それぞれがあるか調べます。出力は英語の単語です。
exists はある、MISSING はない、という意味です。最後の行は、足りないファイルの数です。
リストのファイルを確かめる
docker exec jupyter python3 steps/offline.pyここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
ラボの出力の読み方
| 出力の行 | 意味 |
|---|---|
| cache name: habits-v1 | キャッシュの名前 |
| files to cache: 8 | 覚えようとするファイルが8つ |
| /offline.html MISSING | このファイルだけが、ない |
| missing: 1 | 足りないファイルは1つ |
学生が入力するセルは、このプレビューでは空白です。
戦略は、要求ごとに選ぶ
キャッシュ戦略は、要求に何で答えるかの決まりです。骨組みのように変わらないものは、キャッシュを先に見ます。
注文の一覧のように、新しさが大事なものは、ネットワークを先に見ます。書き込みは、キャッシュに頼れません。
4つの戦略と向いている場面
| 戦略 | 答え方 | 向いている場面 |
|---|---|---|
| cache-first | キャッシュにあれば返す | CSS や JavaScript などの骨組み |
| network-first | まずネットワーク。だめならキャッシュ | メニューや注文の一覧 |
| stale-while-revalidate | 古い写しを返し、裏で新しくする | 写真など、少し古くてよいもの |
| network-only | いつもネットワーク | 書き込みなど、キャッシュできないもの |
学生が入力するセルは、このプレビューでは空白です。
サービスワーカーは安全な接続が要る
ブラウザは、サービスワーカーを、安全な接続のアドレスでだけ動かします。手元の開発用のアドレスは、例外として認められることがあります。
ラボの Preview で登録できるかは、ブラウザのコンソールで確かめます。コンソールの文を、読んでください。
よくある間違い
注意
何でもキャッシュ優先にして、古い内容が出続ける間違いが多いです。変わる内容は、ネットワークを先にします。ファイルを変えたら、キャッシュの名前も変えます。