1

Chrome 40 のバグを回避するために、サービス ワーカー ロジックから除外しようとしているメディア サーバーから CDN にリダイレクトするイメージがあります。Canary では、同じワーカーが問題なく動作します。標準の動作にフォールバックする必要があると思っていましたがevent.default()、Chrome の実装ではそれが見られず、仕様を読むと、現在の推奨事項は単に使用することのようfetch(event.request)です。

したがって、私が抱えている問題は、このシナリオで Service Worker を使用するには、すべてのユーザーの 99% が Chrome 41+ に移行するまで待たなければならないのでしょうか、それとも特定のリクエストをオプトアウトできる何らかの方法がありますか?

私のロジックの核心は以下の通りです:

worker.addEventListener('install', function(event){
    event.waitUntil(getDefaultCache().then(function(cache){
        return cache.addAll(precacheUrls);
    }));
});

worker.addEventListener('fetch', function(event){
    event.respondWith(getDefaultCache().then(function(cache){
        return cache.match(event.request).then(function(response){
            if (!response){
                return fetch(event.request.clone()).then(function(response){
                    if (cacheablePatterns.some(function(pattern){
                        return pattern.test(event.request.url);
                    })) {
                        cache.put(event.request, response.clone());
                    }

                    return response;
                });
            }

            return response;
        });
    }));
});
4

1 に答える 1

4

の中に入ったらevent.respondWith()、応答を発行する必要があります。そうしないと、ネットワーク エラーが発生します。event.default()現在実装されていないのは正しいです。

一般的な解決策はevent.respondWith()、イベントを処理したくないと同期的に判断できる場合は、 に入らないことです。基本的な例は次のようなものです。

function fetchHandler(event) {
  if (event.request.url.indexOf('abc') >= 0) {
    event.respondWith(abcResponseLogic);
  } else if (event.request.url.indexOf('def') >= 0) {
    event.respondWith(defResponseLogic);
  }
}
self.addEventListener('fetch', fetchHandler);

が呼び出されない場合event.respondWith()、このfetchハンドラーはノーオペレーションであり、追加の登録済みfetchハンドラーは要求に応じます。複数のハンドラは、最初のハンドラが を呼び出すまで、一度に 1 つずつfetch追加された順序で呼び出されます。fetch ハンドラが を呼び出さない場合、ユーザー エージェントは、Service Worker が関与していない場合とまったく同じようにリクエストを行います。addEventListenerevent.respondWith()event.respondWith()

考慮しなければならない 1 つの注意点は、呼び出すかどうかの決定を各ハンドラーevent.respondWith()内で同期的に行う必要があることです。fetch非同期の promise 解決に依存するものは、 を呼び出すかどうかを決定するために使用できませんevent.respondWith()。非同期処理を試みてから を呼び出すevent.respondWith()と、競合状態が発生し、Service Worker コンソールに、既に処理されたイベントに応答できないというエラーが表示される可能性があります。

于 2015-02-09T02:13:22.383 に答える