Workboxを使用して、_index.html
_の基本バージョンを含む、アプリシェルのレンダリングに必要なアセットを事前にキャッシュします。 Workboxは、_index.html
_がキャッシュで使用可能であると想定します。そうでない場合、Service Workerに登録しているため、ページナビゲーションが失敗します。
_workbox.routing.registerNavigationRoute('/index.html');
_
インストールリスナーにself.skipWaiting()
命令もあります。
_self.addEventListener('install', e => {
self.skipWaiting();
});
_
私が理解しているように、現在2つのinstall
リスナーがあります。
Workboxのインストールリスナーが失敗しているときにself.skipWaiting()
が成功する可能性はありますか?これにより、アセットが事前にキャッシュされないが、ServiceWorkerがアクティブ化されるという問題のある状態が発生します。そのようなシナリオは可能ですか?それから保護する必要がありますか?
サービスワーカーのインストールと更新のさまざまな段階に関する信頼できる情報源として、「 サービスワーカーのライフサイクル "」を強くお勧めします。
あなたの質問に当てはまるように、その記事からいくつかの情報を要約すると:
ServiceWorkerは最初にinstalling
フェーズに入りますが、登録したinstall
リスナーの数に関係なく、すべてのリスナーが実行する機会があります。ご提案のとおり、Workboxはプリキャッシングを処理するために独自のinstall
リスナーを作成します。
すべてのinstall
リスナーがエラーなしで完了した場合にのみ、サービスワーカーは次のステージに進みます。これは、waiting
のいずれかです(以前のバージョンのサービスワーカーを使用しているクライアントがすでに開いている場合)。 )またはactivating
(以前のバージョンのService Workerを使用しているクライアントがない場合)。
skipWaiting()
、それを使用することを選択した場合、以前のバージョンのサービスを使用しているオープンクライアントがあるかどうかに関係なく、waiting
ステージをバイパスしますワーカー。
skipWaiting()
を呼び出しても、install
リスナーのいずれかが失敗した場合は何も実行されません。これは、ServiceWorkerがinstalling
フェーズを離れることがないためです。それは基本的にノーオペレーションです。
注意が必要なことの1つは、バージョン管理され、事前にキャッシュされたアセットの遅延読み込みも使用している場合にskipWaiting()
を使用することです。記事が警告するように:
注意:
skipWaiting()
は、新しいServiceWorkerが古いバージョンでロードされたページを制御している可能性があることを意味します。つまり、ページのフェッチの一部は古いService Workerによって処理されますが、新しいServiceWorkerは後続のフェッチを処理します。これで問題が発生する可能性がある場合は、skipWaiting()
を使用しないでください。
事前にキャッシュされたバージョン管理されたアセットの遅延読み込みは2018年に行うのがはるかに一般的であるため、WorkboxはデフォルトでskipWaiting()
を呼び出しません。それを使用することをオプトインするのはあなた次第です。