beyond websites
István Szmozsánszky "Flaki"
@slsoftworks
JavaScript Developer
Mozilla Contributor
&
Community TechSpeaker
Tessel Project
Team Member
Frontend Trainer at
DPC Consulting
New standardized browser APIs
Offline: Cache API, indexedDB
Sensors: Geolocation, Battery, Accelerometer
Hardware: Web Bluetooth, Web NFC
Authentication: Credentials API
What are service workers?
A kind of clientside server, scriptable proxy — worker script tied to the origin, rather the page.
Promises (ES 2015) & Fetch API (DOM)
Easier handling of async network requests - and async callbacks in general.
Arrow functions (ES 2015)
fetch("data.json").then(function(p) {
return p.json();
} ).then( function(c) {
console.log(c);
});
fetch("data.json")
.then( p => p.json() )
.then( c => console.log(c) );
a => x
(a, b) => { return x; });
(function(a, b) { return x; }).bind(this);
The service worker life cycle
bitsofco.de/the-service-worker-lifecycle
// Note: ONLY HTTPS!
navigator.serviceWorker.register('/serviceworker.js', {
// Service Worker events are scoped
// to this subfolder only
scope: '/trained-to-thrill/'
}).then(function(reg) {
console.log('Service Worker on line!');
}, function(err) {
console.log('Oops, Service Worker installation failed!');
});
event.waitUntil
self.addEventListener('push', function(event) {
console.log('Received a push message', event);
var title = 'Yay a message.';
var body = 'We have received a push message.';
var icon = '/images/icon-192x192.png';
var tag = 'simple-push-demo-notification-tag';
event.waitUntil(
self.registration.showNotification(title, {
body: body,
icon: icon,
tag: tag
})
);
});
Inside the SW script
// The SW will be shutdown when not in use to save memory,
// be aware that any global state is likely to disappear
console.log("SW startup");
self.addEventListener('install', function(event) {
console.log("SW installed");
});
self.addEventListener('activate', function(event) {
console.log("SW activated");
});
self.addEventListener('fetch', function(event) {
console.log("Caught a fetch!");
event.respondWith(new Response("Hello world!"));
});
importScripts
importscripts("my-script-file.js");
// the rest of the serviceworker.js, handling fetch, push, etc...
Event Handling:
fetch / push / sync / messages
self.addEventListener('fetch', function(event) {
event.respondWith(
caches.match(event.request)
.then(response => {
const networkResponse = fetch(event.request)
.then(fetchResult => {
cache.put(event.request, fetchResult.clone());
return fetchResult;
});
return response || networkResponse;
})
);
});
cache management
the offline cookbook
jakearchibald.com/2014/offline-cookbook
cache-first
self.addEventListener('fetch', function(event) {
event.respondWith(
caches.match(event.request)
.then(response => response || fetch(event.request))
);
});
network-first
self.addEventListener('fetch', function(event) {
event.respondWith(
fetch(event.request)
.catch(ex => caches.match(event.request))
);
});
bringing out the big guns
self.addEventListener('fetch', function(event) {
event.respondWith(
caches.match(event.request)
.then(response => {
const networkResponse = fetch(event.request)
.then(fetchResult => {
cache.put(event.request, fetchResult.clone());
return fetchResult;
});
return response || networkResponse;
})
);
});
Synthetic Responses
self.addEventListener('fetch', function(event) {
if (event.request.url.match(/hello/i)) {
event.respondWith(
new Response("Hello world!")
);
}
});
...and so much more!
Server push emulation, appcache polyfills, JS transpiling and on-demand feature polyfilling, webserver-in-the-client, differential resource updates...
Support?
Chrome, Firefox, Opera, Samsung Internet, Edge...
Constantly evolving standard
NOT just for offline webapps
Lie-fi: When you are supposed to be online, but not.
Downtime: Maintenance, downtime, zombie apocalypse.
Performance: Any byte not downloaded is a byte saved.
...or Bandwidth caps:
But we need your help!
Service workers aren't a magic wand:
"With ServiceWorker we gave up trying to solve offline, and gave developers the moving parts to go solve it themselves."