PWA(プログレッシブWebアプリ)の学習を開始しましたが、コンソールに「スロー」エラーが発生しました。
誰が原因を知っていますか?
let CACHE = 'cache';
self.addEventListener('install', function(evt) {
console.log('The service worker is being installed.');
evt.waitUntil(precache());
});
self.addEventListener('fetch', function(evt) {
console.log('The service worker is serving the asset.');
evt.respondWith(fromCache(evt.request));
});
function precache() {
return caches.open(CACHE).then(function (cache) {
return cache.addAll([
'/media/wysiwyg/homepage/desktop.jpg',
'/media/wysiwyg/homepage/bottom2_desktop.jpg'
]);
});
}
function fromCache(request) {
return caches.open(CACHE).then(function (cache) {
return cache.match(request).then(function (matching) {
return matching || Promise.reject('no-match');
});
});
}
これはフォールバック戦略がないためだと思います。 event.respondWith
には、エラーがある場合にキャッチする必要がある約束が付属しています。
そのため、コードを次から変更することをお勧めします。
self.addEventListener('fetch', function(evt) {
console.log('The service worker is serving the asset.');
evt.respondWith(fromCache(evt.request));
});
このようなものに:
addEventListener('fetch', function(event) {
event.respondWith(
caches.match(event.request)
.then(function(response) {
if (response) {
return response; // if valid response is found in cache return it
} else {
return fetch(event.request) //fetch from internet
.then(function(res) {
return caches.open(CACHE_DYNAMIC_NAME)
.then(function(cache) {
cache.put(event.request.url, res.clone()); //save the response for future
return res; // return the fetched data
})
})
.catch(function(err) { // fallback mechanism
return caches.open(CACHE_CONTAINING_ERROR_MESSAGES)
.then(function(cache) {
return cache.match('/offline.html');
});
});
}
})
);
});
注:キャッシングには多くの戦略がありますが、ここで示したのはoffline firstアプローチです。詳細については、 this & this は必読です。
私は同じエラーの解決策を見つけました。私の場合、サービスワーカーがファイルが見つかりませんでした*のときにエラーが表示され、chromeセッション、およびサービスワーカーが登録するファイルの配列を見つけて削除しなかった存在しないファイルを識別しました。
'/processos/themes/base/js/processos/step/Validation.min.js',
'/processos/themes/base/js/processos/Acoes.min.js',
'/processos/themes/base/js/processos/Processos.min.js',
'/processos/themes/base/js/processos/jBPM.min.js',
'/processos/themes/base/js/highcharts/highcharts-options-white.js',
'/processos/themes/base/js/publico/ProcessoJsController.js',
// '/processos/gzip_457955466/bundles/plugins.jawrjs',
// '/processos/gzip_N1378055855/bundles/publico.jawrjs',
// '/processos/gzip_457955466/bundles/plugins.jawrjs',
'/mobile/js/about.js',
'/mobile/js/access.js',
*私は解決策を太字にした...キャッシュ用のファイルから始めて、別のものを追加します... 1つへの悪いパスが得られるまで、スコープ{scope: '/'}または{scope: 'を定義します./ '}-lawrghitaによる編集
同じエラーが発生し、私の場合、Adblockは「ad」で始まるURL(/adsomething.phpなど)へのフェッチをブロックしていました
私の場合、localhostを使用しており、XAMPPサーバーで複数のプロジェクトを開発しているため、サイトはサブディレクトリ内にあるため、キャッシュされるファイルは見つかりませんでした(ネットワークコンソールを確認)。
だから私は変わった
let cache_name = 'Custom_name_cache';
let cached_assets = [
'/',
'index.php',
'css/main.css',
'js/main.js'
];
self.addEventListener('install', function (e) {
e.waitUntil(
caches.open(cache_name).then(function (cache) {
return cache.addAll(cached_assets);
})
);
});
以下:cached_assetsの「./」に注意してください。
let cache_name = 'Custom_name_cache';
let cached_assets = [
'./',
'./index.php',
'./css/main.css',
'./js/main.js'
];
self.addEventListener('install', function (e) {
e.waitUntil(
caches.open(cache_name).then(function (cache) {
return cache.addAll(cached_assets);
})
);
});