尝试显示带有服务工作者的离线页面,但即使在离线时我的请求也会得到 200 响应
Trying to display an offline page with service workers but getting a 200 response for my request even when offline
我正在尝试使用 service worker 来完成以下任务:
- 缓存一组页面。
- Return 如果请求来自缓存的页面 - 如果页面不在来自服务器的缓存 return 中。
- 如果缓存或服务器都没有响应return自定义离线页面。
我有以下代码:
this.addEventListener('install', function(event) {
console.log('Service Worker: Installing');
event.waitUntil(
caches.open('v1').then(function(cache) {
console.log('Service Worker: Caching Files');
return cache.addAll([
'/assets/logo.svg',
'/assets/app.css',
'/assets/app.js',
'/assets/common.js',
'/offline.html'
]);
})
);
});
this.addEventListener('fetch', function(event) {
if (event.request.method != "GET" || event.request.mode == "cors" || event.request.url.startsWith('chrome-extension')) return;
console.log('Event to be passed', event);
event.respondWith(
caches.open('v1').then(function(cache) {
return cache.match(event.request).then(function(response) {
if (response) {
console.log('Service Worker: Returning Cached Response', response);
return response;
} else {
fetch(event.request).then(function(response) {
console.log('Service Worker: Returning Response from Server', response);
cache.put(event.request, response.clone());
return response;
}).catch((error) => {
console.log('Fetch failed; returning offline page instead.', error);
return caches.match('/offline.html');
});
}
});
})
);
});
this.addEventListener('activate', function activator(event) {
console.log('Service Worker: Activating', event);
event.waitUntil(
caches.keys().then(function(keys) {
return Promise.all(keys
.filter(function(key) {
return key.indexOf('v1') !== 0;
})
.map(function(key) {
return caches.delete(key);
})
);
})
);
});
我遇到的问题是,即使在离线状态下,我的请求也会收到 200 响应,即使我处于离线状态并且实际上并未检索文件。
我知道这是 PWA 总是 return 200 响应的先决条件之一,但是如果我的响应总是 return 我怎么能 return 一个离线页面s 为 200.
有关服务人员的任何帮助、建议或资源都会很有用。
干杯。
你必须处理所有事件,如果没有什么特别的事情发生,你不能"return"。
this.addEventListener('fetch', function(event) {
if (event.request.method != "GET" || event.request.mode == "cors" || event.request.url.startsWith('chrome-extension')){
event.respondWith(fetch(event.request));
return;
}
....
那么你还必须 return 你的获取事件,否则你会破坏承诺链。
} else {
return fetch(event.request).then(function(response) {
我正在尝试使用 service worker 来完成以下任务:
- 缓存一组页面。
- Return 如果请求来自缓存的页面 - 如果页面不在来自服务器的缓存 return 中。
- 如果缓存或服务器都没有响应return自定义离线页面。
我有以下代码:
this.addEventListener('install', function(event) {
console.log('Service Worker: Installing');
event.waitUntil(
caches.open('v1').then(function(cache) {
console.log('Service Worker: Caching Files');
return cache.addAll([
'/assets/logo.svg',
'/assets/app.css',
'/assets/app.js',
'/assets/common.js',
'/offline.html'
]);
})
);
});
this.addEventListener('fetch', function(event) {
if (event.request.method != "GET" || event.request.mode == "cors" || event.request.url.startsWith('chrome-extension')) return;
console.log('Event to be passed', event);
event.respondWith(
caches.open('v1').then(function(cache) {
return cache.match(event.request).then(function(response) {
if (response) {
console.log('Service Worker: Returning Cached Response', response);
return response;
} else {
fetch(event.request).then(function(response) {
console.log('Service Worker: Returning Response from Server', response);
cache.put(event.request, response.clone());
return response;
}).catch((error) => {
console.log('Fetch failed; returning offline page instead.', error);
return caches.match('/offline.html');
});
}
});
})
);
});
this.addEventListener('activate', function activator(event) {
console.log('Service Worker: Activating', event);
event.waitUntil(
caches.keys().then(function(keys) {
return Promise.all(keys
.filter(function(key) {
return key.indexOf('v1') !== 0;
})
.map(function(key) {
return caches.delete(key);
})
);
})
);
});
我遇到的问题是,即使在离线状态下,我的请求也会收到 200 响应,即使我处于离线状态并且实际上并未检索文件。
我知道这是 PWA 总是 return 200 响应的先决条件之一,但是如果我的响应总是 return 我怎么能 return 一个离线页面s 为 200.
有关服务人员的任何帮助、建议或资源都会很有用。
干杯。
你必须处理所有事件,如果没有什么特别的事情发生,你不能"return"。
this.addEventListener('fetch', function(event) {
if (event.request.method != "GET" || event.request.mode == "cors" || event.request.url.startsWith('chrome-extension')){
event.respondWith(fetch(event.request));
return;
}
....
那么你还必须 return 你的获取事件,否则你会破坏承诺链。
} else {
return fetch(event.request).then(function(response) {