Updated post with cache busting info
This commit is contained in:
parent
9654f7f6bc
commit
2179f17f00
@ -36,4 +36,46 @@ function fetchAndCache(event) {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
**NOTE:** Make sure you have cache headers appropriately set. I spent a good chunk of time trying to debug why the cache wasn't updating and realised it was due to a high `max-age` header being set on the resource.
|
> **NOTE:** Make sure you have cache headers appropriately set. I spent a good chunk of time trying to debug why the cache wasn't updating and realised it was due to a high `max-age` header being set on the resource.
|
||||||
|
|
||||||
|
You can get around a misguided `max-age` issue by implementing some cache-busting within the service worker. When calling out to the network for the resource you can append a random string to force the browser to go to the server to a fresh copy.
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
/* 📄 service-worker.js */
|
||||||
|
var CACHE = 'v1';
|
||||||
|
|
||||||
|
// Intercept all network requests
|
||||||
|
self.addEventListener('fetch', function(event) {
|
||||||
|
event.respondWith(fetchAndCache(event));
|
||||||
|
});
|
||||||
|
|
||||||
|
function cacheBust(request) {
|
||||||
|
var url = request.url;
|
||||||
|
if (url.indexOf(self.location.origin) >= 0) {
|
||||||
|
if (url.indexOf('.') < 0 && url[url.length - 1] !== '/') {
|
||||||
|
// When dealing with directories make sure we append a trailing slash
|
||||||
|
url += `/`;
|
||||||
|
}
|
||||||
|
return `${url}?${Math.random()}`;
|
||||||
|
} else {
|
||||||
|
return request;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function fetchAndCache(event) {
|
||||||
|
return caches.open(CACHE).then(function (cache) {
|
||||||
|
return cache.match(event.request).then(function(response) {
|
||||||
|
// Fetch from the network regardless of a cached resource
|
||||||
|
var fetchResponse = fetch(cacheBust(event.request))
|
||||||
|
.then(function(networkResponse) {
|
||||||
|
// Cache the up-to-date resource
|
||||||
|
cache.put(event.request, networkResponse.clone());
|
||||||
|
return networkResponse;
|
||||||
|
});
|
||||||
|
// Return the cached response if it exists or fallback to the network
|
||||||
|
return response || fetchResponse;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user