The backbone of Progressive Web Apps has to be the ServiceWorker. A new browser paradigm, nearly every new browser api that controls network events, offline functionality, push notifications, background sync, and more are all powered by it. We will go over the path that led to the ServiceWorker design, as well as how to implement a number of cutting ed features on your website or webapp today!
13. AppCache
Static list of files
ALWAYS takes over, even when online
Updates only if the AppCache itself changes
Redirects are treated as failures, and 404
You can cache the AppCache,
causing it to never upgrade
18. if ("serviceWorker" in navigator) {
navigator.serviceWorker.register("/sw.js")
}
// main.js
19. if ("serviceWorker" in navigator) {
navigator.serviceWorker.register("/sw.js")
}
// main.js
20. if ("serviceWorker" in navigator) {
navigator.serviceWorker.register("/sw.js")
}
// main.js
21. if ("serviceWorker" in navigator) {
navigator.serviceWorker.register("/sw.js")
}
// main.js
22. if ("serviceWorker" in navigator) {
navigator.serviceWorker.register("/sw.js")
}
// main.js
23. if ("serviceWorker" in navigator) {
navigator.serviceWorker.register("/sw.js")
}
// main.js
24. if ("serviceWorker" in navigator) {
navigator.serviceWorker.register("/sw.js")
}
// main.js
25. if ("serviceWorker" in navigator) {
navigator.serviceWorker.register("/sw.js")
}
// Controls any URL on the same domain
// main.js
26. if ("serviceWorker" in navigator) {
navigator.serviceWorker.register("/js/sw.js")
}
// Controls any URL on the same domain that
// starts with "/js"
// main.js
28. if ("serviceWorker" in navigator) {
navigator.serviceWorker.register("/js/sw.js", {
scope: "/"
})
}
// main.jsService-Worker-Allowed: /js
if ("serviceWorker" in navigator) {
navigator.serviceWorker.register("/js/sw.js")
}
29. if ("serviceWorker" in navigator) {
navigator.serviceWorker.register("/js/sw.js", {
scope: "/"
})
}
// main.js
Service-Worker-Allowed: /js
// Controls any URL on the same domain
137. // main.js
}
navigator.serviceWorker.onmessage =
function(ev) {
var message = JSON.parse(ev.data);
var lastETag = localStorage.currentETag;
if (lastETag !== message.eTag) {
// alert the user to reload the page
}
}
if ("serviceWorker" in navigator) {
navigator.serviceWorker.register("/sw.js")
138. // main.js
}
navigator.serviceWorker.onmessage =
function(ev) {
var message = JSON.parse(ev.data);
var lastETag = localStorage.currentETag;
if (lastETag !== message.eTag) {
// alert the user to reload the page
}
}
if ("serviceWorker" in navigator) {
navigator.serviceWorker.register("/sw.js")
139. // main.js
}
navigator.serviceWorker.onmessage =
function(ev) {
var message = JSON.parse(ev.data);
var lastETag = localStorage.currentETag;
if (lastETag !== message.eTag) {
// alert the user to reload the page
}
}
if ("serviceWorker" in navigator) {
navigator.serviceWorker.register("/sw.js")
140. // main.js
}
navigator.serviceWorker.onmessage =
function(ev) {
var message = JSON.parse(ev.data);
var lastETag = localStorage.currentETag;
if (lastETag !== message.eTag) {
// alert the user to reload the page
}
}
if ("serviceWorker" in navigator) {
navigator.serviceWorker.register("/sw.js")
141. // main.js
}
navigator.serviceWorker.onmessage =
function(ev) {
var message = JSON.parse(ev.data);
var lastETag = localStorage.currentETag;
if (lastETag !== message.eTag) {
// alert the user to reload the page
}
}
if ("serviceWorker" in navigator) {
navigator.serviceWorker.register("/sw.js")
142. // main.js
}
navigator.serviceWorker.onmessage =
function(ev) {
var message = JSON.parse(ev.data);
var lastETag = localStorage.currentETag;
if (lastETag !== message.eTag) {
// alert the user to reload the page
}
}
if ("serviceWorker" in navigator) {
navigator.serviceWorker.register("/sw.js")