Merge pull request #7 from AverageMarcus/post/serviceworker_cahce

Post/serviceworker cahce
This commit is contained in:
Marcus Noble 2017-10-15 07:56:36 +01:00 committed by GitHub
commit 8ee68a8ff8
2 changed files with 40 additions and 1 deletions

2
app.js
View File

@ -24,7 +24,7 @@ const port = process.env.PORT || 8000;
const oneDay = 86400000; const oneDay = 86400000;
app.use(compress()); app.use(compress());
app.use(express.static(__dirname + '/build', {maxAge: oneDay * 365})); app.use(express.static(__dirname + '/build'));
var md = markdown('commonmark', {html: true}); var md = markdown('commonmark', {html: true});
md.parser.use(emoji); md.parser.use(emoji);

View File

@ -0,0 +1,39 @@
---
layout: post.html
title: Quick & easy offline support
date: 2017-10-15
tags:
summary: "Adding offline support to your site is easier than ever these days thanks to service workers."
---
Adding offline support to your site is easier than ever these days thanks to service workers.
I recently added offline support to my blog with a small service worker using a 'stale-while-revalidate' technique that will always serve up a cached resource to the user if available, if not it will fall back to the normal network response. The beauty of this technique is that it always attempts to perform the network response and will cache the up-to-date response for use next time.
```javascript
/* 📄 service-worker.js */
var CACHE = 'v1';
// Intercept all network requests
self.addEventListener('fetch', function(event) {
event.respondWith(fetchAndCache(event));
});
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(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;
});
});
}
```
**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.