PWAのオフラインサポート検出の改善
Improving Progressive Web App offline support detection
以下の記事のまとめやメモです。
記事の内容
WebアプリをPWAとしてインストール可能かの条件として、Chromeではこれまで「fetch イベントを含むサービスワーカーがあること」となっていました。
それが、今後は「オフラインモード時のfetchイベントでHTTP ステータスコード 200を返すこと」となるみたい。
※ 既にインストールされているPWAには影響しない
実装よりな話
これまでの判定について
これまで、PWA化はmanifest.jsonとほぼ空のService Workerをインストールすればいいので簡単だよ。と言われていましたが、今後はちゃんとオフラインサポートを実装する必要があります。
コード的に見ると、これまでは以下のService WorkerスクリプトでOKだった。
self.addEventListener("fetch", (event) => {});
今後の判定について
今後は、installイベントなどでCache APIを活用してリソースをキャッシュ。fetchイベントでオフライン時はキャッシュからリソースを返す。といった対応が必要になります。どこまでやるかはプロダクトによります。ある程度リソースをキャッシュしてオフラインでも動作するようにするとか。とりあえず静的なHTMLだけ返すとか。
最低限インストール要件を満たすためには、例えば以下のような処理は実装しないといけなそう。
const CACHE_NAME = "cache";
const OFFLINE_URL = "/";
self.addEventListener("install", (event) => {
event.waitUntil((async () => {
const cache = await caches.open(CACHE_NAME);
return cache.add(OFFLINE_URL);
})());
});
self.addEventListener("fetch", (event) => {
event.respondWith(
(async () => {
try {
const networkResponse = await fetch(event.request);
return networkResponse;
} catch (e) {
const cache = await caches.open(CACHE_NAME);
const cachedResponse = await cache.match("/");
return cachedResponse;
}
})()
);
});