Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Offline Web Apps (Service Workers)

Offline Web Apps (Service Workers)

Avatar for Erik Hellman

Erik Hellman

August 03, 2017
Tweet

More Decks by Erik Hellman

Other Decks in Programming

Transcript

  1. Service Worker Lifecycle • Adds app-like lifecycle to a page

    • Wakes up only when the OS says • Only responds to system events Activated Error Idle Active Terminated Install Register
  2. • Adds app-like lifecycle to a page • Wakes up

    only when the OS says • Only responds to system events Activated Error Idle Active Terminated Install Register Service Worker Lifecycle
  3. Service Worker Lifecycle • Adds app-like lifecycle to a page

    • Wakes up only when the OS says • Only responds to system events Activated Error Idle Active Terminated Install Register
  4. Register the Service Worker if ('serviceWorker' in navigator) { navigator.serviceWorker.register('/service-worker.js')

    .then(function(reg) { console.log('Service Worker Registered', reg); }) .catch(function(err) { console.log('Error registering Service Worker', err); }); }
  5. Register the Service Worker if ('serviceWorker' in navigator) { navigator.serviceWorker.register('/service-worker.js')

    .then(function(reg) { console.log('Service Worker Registered', reg); }) .catch(function(err) { console.log('Error registering Service Worker', err); }); }
  6. Pre-fetch the App Resources var cacheName = 'app-shell-cache-v1'; var filesToCache

    = ['/', '/index.html', ...]; self.addEventListener('install', function(event) { event.waitUntil( caches.open(cacheName).then(function(cache) { return cache.addAll(filesToCache); }).then(function() { return self.skipWaiting(); }) ); });
  7. Pre-fetch the App Resources var cacheName = 'app-shell-cache-v1'; var filesToCache

    = ['/', '/index.html', ...]; self.addEventListener('install', function(event) { event.waitUntil( caches.open(cacheName).then(function(cache) { return cache.addAll(filesToCache); }).then(function() { return self.skipWaiting(); }) ); });
  8. Pre-fetch the App Resources var cacheName = 'app-shell-cache-v1'; var filesToCache

    = ['/', '/index.html', ...]; self.addEventListener('install', function(event) { event.waitUntil( caches.open(cacheName).then(function(cache) { return cache.addAll(filesToCache); }).then(function() { return self.skipWaiting(); }) ); });
  9. Pre-fetch the App Resources var cacheName = 'app-shell-cache-v1'; var filesToCache

    = ['/', '/index.html', ...]; self.addEventListener('install', function(event) { event.waitUntil( caches.open(cacheName).then(function(cache) { return cache.addAll(filesToCache); }).then(function() { return self.skipWaiting(); }) ); });
  10. Add an activate Event Handler self.addEventListener('activate', function(e) { e.waitUntil( caches.keys().then(function(keyList)

    { return Promise.all(keyList.map(function(key) { if (key !== cacheName) { return caches.delete(key); } })); }) ); return self.clients.claim(); });
  11. Add an activate Event Handler self.addEventListener('activate', function(e) { e.waitUntil( caches.keys().then(function(keyList)

    { return Promise.all(keyList.map(function(key) { if (key !== cacheName) { return caches.delete(key); } })); }) ); return self.clients.claim(); });
  12. Scope if ('serviceWorker' in navigator) { navigator.serviceWorker.register('/service-worker.js') .then(function(reg) { console.log('Service

    Worker Registered', reg); }) .catch(function(err) { console.log('Error registering Service Worker', err); }); }
  13. Scope if ('serviceWorker' in navigator) { navigator.serviceWorker.register('/service-worker.js') .then(function(reg) { console.log('Service

    Worker Registered', reg); }) .catch(function(err) { console.log('Error registering Service Worker', err); }); }
  14. Scope if ('serviceWorker' in navigator) { navigator.serviceWorker.register('/scripts/s-worker.js') .then(function(reg) { console.log('Service

    Worker Registered', reg); }) .catch(function(err) { console.log('Error registering Service Worker', err); }); }
  15. Scope if ('serviceWorker' in navigator) { navigator.serviceWorker.register('/service-worker.js') .then(function(reg) { console.log('Service

    Worker Registered', reg); }) .catch(function(err) { console.log('Error registering Service Worker', err); }); }
  16. sw-precache precache.write('service-worker.js', { staticFileGlobs: ['**/*.{html,css}'], runtimeCaching: [ {urlPattern: '/', handler:

    'fastest'}, {urlPattern: '/api/.*', handler: 'networkFirst', options: {networkTimeoutSeconds: 5} }, {urlPattern: '/posts/.*', handler: 'cacheFirst'}, {urlPattern: '/styles/.*', handler: 'cacheOnly'}, {urlPattern: '/inbox.json', handler: 'networkOnly'} ] });