13
Discover ServiceWorker +SandroPaganotti @sandropaganotti

Discover ServiceWorker

Embed Size (px)

DESCRIPTION

Discover Service Worker: a few use cases of this upcoming game changer

Citation preview

Page 1: Discover ServiceWorker

Discover ServiceWorker

+SandroPaganotti@sandropaganotti

Page 2: Discover ServiceWorker

HTTP GET /cat1.jpg

HTTP Response

SERVER

Page 3: Discover ServiceWorker

SERVER

serviceworker.js

CACHE

FORGED RESPONSE

OTHER SERVER

SERVICEWORKERRECEIVES AFETCH EVENT...

Page 4: Discover ServiceWorker

SERVER

CACHE

FORGED RESPONSE

OTHER SERVER

serviceworker.js

Page 5: Discover ServiceWorker

SERVER

CACHE

FORGED RESPONSE

OTHER SERVER

serviceworker.js

Page 6: Discover ServiceWorker

SERVER

CACHE

FORGED RESPONSE

OTHER SERVER

onfetch = function(evt){

evt.respondWith(

new Response('Sorry no, cats available :)')

);};

serviceworker.js

Page 7: Discover ServiceWorker

Return Cached

CACHED?

ONLINE? Forward toServer

BASIC USAGE:CACHING FOROFFLINE ACCESS

Returnfallback

page

Page 8: Discover ServiceWorker

importScripts('serviceworker-cache-polyfill.js');

oninstall = function(evt) {

evt.waitUntil(

caches.open('assets').then(function(cache){

return cache.addAll([ 'page.html', 'style.css','app.js','404.html' ]);

})

);

};

onfetch = function(evt) {

evt.respondWith(

caches.match(evt.request).catch(function() {

return evt.default();

}).catch(function() {

return caches.match("404.html");

})

);

};

Not yet available

through polyfill

Page 9: Discover ServiceWorker

CACHING AND COMPILING HANDLEBAR TEMPLATES

SEARCH/*

*.JPG

Fetch, Compile,

Cache

CACHED? Return Cached

Return Cached

CACHED?

Fetch, Cache

Page 10: Discover ServiceWorker

onfetch = function(evt) {

if(/\/search\/[^\/]+$/.test(evt.request.url)){

evt.respondWith(caches.match(evt.request).then(function(entry) {

return entry || performSearch(evt.request);

}));

} else if(/\.jpg$/.test(evt.request.url)){

evt.respondWith(getImage(evt.request));

}

};

Routing

Page 11: Discover ServiceWorker

Get Image

getImage = function(request) {

return caches.match(request).then(function(image){

return image || fetch(request.url,

{mode: 'no-cors'}).then(function(res){

return storeResponse('img-cache', request, res);

});

});

};

Page 12: Discover ServiceWorker

importScripts('handlebars-v2.0.0.js');

var youtube = "https://gdata.youtube.com/feeds/api/videos?alt=json&q=";

performSearch = function(request) {

return caches.match('list.hbs').then(function(tpl) {

return tpl.text();

}).then(function(body){

return fetch(youtube + request.url.split('/').pop()).then(function(res) {

return res.json();

}).then(function(json){

list = list || Handlebars.compile(body);

var response = new Response(list(json),

{ headers: {"Content-Type": "text/html"} });

return storeResponse('pages-cache', request, response);

});})};

Get template from cache

Fetch JSON from YouTube

Generating HTML

Page 13: Discover ServiceWorker

+SandroPaganotti@sandropaganotti

Thank you!