我想将 Service Worker 添加到我的网站,以便为我的网站用户提供良好的离线体验。 (网站后端是PHP)
我对 Javascript Promise 和 Service Workers 还很陌生,但这是我到目前为止所达到的目标:
my 索引.php页面有这个脚本来注册服务工作者
<script>
if ('serviceWorker' in navigator) { navigator.serviceWorker.register('sw.js')};
</script>
以及服务人员文件我使用下面的代码
var CACHE_STATIC_NAME = 'static-v74';
var CACHE_DYNAMIC_NAME = 'dynamic-v74';
self.addEventListener('install', function (event) {
console.log('Installing Service Worker ...', event);
event.waitUntil(
caches.open(CACHE_STATIC_NAME)
.then(function (cache) {
console.log('Precaching App Shell');
cache.addAll([
'offline.php', // offline page
'assets/bundle.css',
'assets/bundle.js',
'assets/images/logo.jpg',
'assets/images/favicon.ico'
]);
})
)
});
self.addEventListener('activate', function (event) {
console.log('Activating Service Worker ....', event);
event.waitUntil(
caches.keys()
.then(function (keyList) {
return Promise.all(keyList.map(function (key) {
if (key !== CACHE_STATIC_NAME && key !== CACHE_DYNAMIC_NAME) {
console.log('Removing old cache.', key);
return caches.delete(key);
}
}));
})
);
return self.clients.claim();
});
self.addEventListener('fetch', function(event) {
event.respondWith(
// Try the network
fetch(event.request)
.then(function(res) {
return caches.open(CACHE_DYNAMIC_NAME)
.then(function(cache) {
// Put in cache if succeeds
cache.put(event.request.url, res.clone());
return res;
})
})
.catch(function(err) {
// Fallback to cache
return caches.match(event.request);
})
);
});
事实上,这段代码按预期工作正常:
(1) 它注册服务工作线程并获取我的静态缓存文件的副本。
(2) 当激活新的 Service Worker 时,它会删除旧的缓存。
(3) 对于每个新请求,它首先从网络获取,如果成功,它会将请求的新副本放入缓存中。
(4) 如果离线时未能发出网络请求,它会向用户返回上次网络请求的最新副本。
我想要实现她的是(如果 - 用户离线 - 并尝试请求不在缓存中的新页面,他应该被重定向到保存在静态缓存中的 (offline.php) 页面)像下面这样
// If both (network & cache) fail, show a generic fallback:
return caches.match('offline.php');
但我有一个问题,我不知道应该在 (fetch) 步骤中将这一行添加到我的 (sw.js) 文件中的何处,我确实尝试阅读有关服务工作人员和 Javascript 承诺的更多信息,并尝试多次添加这一行我的代码中的不同位置,但每次都没有使其工作,而是错过了之前的场景,或者保留了场景但未能实现此目标。
非常感谢您的善意帮助,并提前非常感谢。