Slide 1

Slide 1 text

PWA & Service Worker Anna Su 1

Slide 2

Slide 2 text

Anna Su 獮ᒒૡ纷䒍 綮ਮ螸 PIXNET 2 About me

Slide 3

Slide 3 text

Why PWA? What's PWA? What's Service Workers Making A Service Worker 3 Agenda

Slide 4

Slide 4 text

PWA 4 Why

Slide 5

Slide 5 text

5 What’s Wrong?

Slide 6

Slide 6 text

What’s Wrong with Web ? Slow mobile network User-unfriendly 6

Slide 7

Slide 7 text

What’s Wrong with Web ? Slow mobile network 7 53% 3s

Slide 8

Slide 8 text

What’s Wrong with Web ? User-unfriendly 8 Splash Screen push notifications

Slide 9

Slide 9 text

What’s Wrong with App ? High cost Difficultly share 9

Slide 10

Slide 10 text

What’s Wrong with App ? High cost 10 iOS Windows Android

Slide 11

Slide 11 text

What’s Wrong with App ? Difficultly share 11 from Alex Russell in Chrome Dev Summit 2015 1 month 25 100+ App Web

Slide 12

Slide 12 text

What’s Wrong with App ? 12 Alex Russell in Chrome Dev Summit 2015 ignite online & comScore

Slide 13

Slide 13 text

13

Slide 14

Slide 14 text

PWA 14 What’s Progressive Web App

Slide 15

Slide 15 text

15 Reliable Fast Engaging Reliable

Slide 16

Slide 16 text

What’s PWA ? Reliable 16

Slide 17

Slide 17 text

What’s PWA ? Fast 17

Slide 18

Slide 18 text

What’s PWA ? Engaging 18

Slide 19

Slide 19 text

Chrome Dev Summit 2014 [github] How does the PWA looks like 19

Slide 20

Slide 20 text

20

Slide 21

Slide 21 text

Service Workers 21 What’s

Slide 22

Slide 22 text

22 What’s Service Workers ?

Slide 23

Slide 23 text

What’s Service Workers ? 23

Slide 24

Slide 24 text

24 What’s Service Workers ?

Slide 25

Slide 25 text

Service Workers Lifecycle 25

Slide 26

Slide 26 text

Making A Service Worker 26

Slide 27

Slide 27 text

27 Making A Service Workers design @Don

Slide 28

Slide 28 text

simple-pwa-demo PWA To-Do List with Vanilla JS (sw-precache) (sw-precache-webpack-plugin) PWA To-Do List with React/Redux 28 @Octocat Making A Service Workers code review -Jerry Hong

Slide 29

Slide 29 text

Getting Started with Service Workers 29

Slide 30

Slide 30 text

Registering the Service Worker Setting up the Default Cache Clearing Old Cache Handling Fetch Requests 30 Making A Service Workers

Slide 31

Slide 31 text

31 Register install activate fetch Making A Service Workers Register Registering the Service Worker

Slide 32

Slide 32 text

Registering the Service Worker 32 if ('serviceWorker' in navigator) { navigator.serviceWorker.register('/sw.js') .then(reg => console.log('SW registered!', reg)) .catch(err => console.log('Error!', err)); } index.html if ('serviceWorker' in navigator) { navigator.serviceWorker.register('/sw.js') .then(reg => console.log('SW registered!', reg)) .catch(err => console.log('Error!', err)); } if ('serviceWorker' in navigator) { navigator.serviceWorker.register('/sw.js') .then(reg => console.log('SW registered!', reg)) .catch(err => console.log('Error!', err)); } if ('serviceWorker' in navigator) { navigator.serviceWorker.register('/sw.js') .then(reg => console.log('SW registered!', reg)) .catch(err => console.log('Error!', err)); } if ('serviceWorker' in navigator) { navigator.serviceWorker.register('/sw.js') .then(reg => console.log('SW registered!', reg)) .catch(err => console.log('Error!', err)); } if ('serviceWorker' in navigator) { navigator.serviceWorker.register('/sw.js') .then(reg => console.log('SW registered!', reg)) .catch(err => console.log('Error!', err)); }

Slide 33

Slide 33 text

33 Register install activate fetch Making A Service Workers Register Service Worker Lifecycle install activate fetch

Slide 34

Slide 34 text

Getting Started with Service Workers 34 // install self.addEventListener('install', event => { console.log('installing…'); }); // activate self.addEventListener('activate', event => { console.log('now ready to handle fetches!'); }); // fetch self.addEventListener('fetch', event => { console.log('now fetch!'); }); sw.js

Slide 35

Slide 35 text

35 Register install activate fetch Setting up the Default Cache Making A Service Workers

Slide 36

Slide 36 text

Setting up the Default Cache 36 sw.js const filesToCache = [ '/', '/assets/images/btn_check.png', '/assets/images/btn_del.png', '/assets/images/ic_add.png', '/assets/images/logo_todo.png', '/src/main.css', '/index.html' ]; const cacheName = 'todolist-v1';

Slide 37

Slide 37 text

Setting up the Default Cache 37 sw.js // install self.addEventListener('install', event => { console.log('installing…'); event.waitUntil( caches.open(cacheName).then(cache => { // console.log('Caching app ok'); return cache.addAll(filesToCache); }) ); }); // install self.addEventListener('install', event => { console.log('installing…'); event.waitUntil( caches.open(cacheName).then(cache => { // console.log('Caching app ok'); return cache.addAll(filesToCache); }) ); }); // install self.addEventListener('install', event => { console.log('installing…'); event.waitUntil( caches.open(cacheName).then(cache => { // console.log('Caching app ok'); return cache.addAll(filesToCache); }) ); }); // install self.addEventListener('install', event => { console.log('installing…'); event.waitUntil( caches.open(cacheName).then(cache => { // console.log('Caching app ok'); return cache.addAll(filesToCache); }) ); }); // install self.addEventListener('install', event => { console.log('installing…'); event.waitUntil( caches.open(cacheName).then(cache => { // console.log('Caching app ok'); return cache.addAll(filesToCache); }) ); });

Slide 38

Slide 38 text

38 Register install activate fetch Clearing Old Cache Making A Service Workers

Slide 39

Slide 39 text

` 39 // activate self.addEventListener('activate', event => { console.log('now ready to handle fetches!'); event.waitUntil( caches.keys().then(function(cacheNames) { var promiseArr = cacheNames.map(function(item) { if (item !== cacheName) { // Delete that cached file return caches.delete(item); } }) return Promise.all(promiseArr); }) ); // end e.waitUntil }); sw.js // activate self.addEventListener('activate', event => { console.log('now ready to handle fetches!'); event.waitUntil( caches.keys().then(function(cacheNames) { var promiseArr = cacheNames.map(function(item) { if (item !== cacheName) { // Delete that cached file return caches.delete(item); } }) return Promise.all(promiseArr); }) ); // end e.waitUntil }); // activate self.addEventListener('activate', event => { console.log('now ready to handle fetches!'); event.waitUntil( caches.keys().then(function(cacheNames) { var promiseArr = cacheNames.map(function(item) { if (item !== cacheName) { // Delete that cached file return caches.delete(item); } }) return Promise.all(promiseArr); }) ); // end e.waitUntil }); // activate self.addEventListener('activate', event => { console.log('now ready to handle fetches!'); event.waitUntil( caches.keys().then(function(cacheNames) { var promiseArr = cacheNames.map(function(item) { if (item !== cacheName) { // Delete that cached file return caches.delete(item); } }) return Promise.all(promiseArr); }) ); // end e.waitUntil }); // activate self.addEventListener('activate', event => { console.log('now ready to handle fetches!'); event.waitUntil( caches.keys().then(function(cacheNames) { var promiseArr = cacheNames.map(function(item) { if (item !== cacheName) { // Delete that cached file return caches.delete(item); } }) return Promise.all(promiseArr); }) ); // end e.waitUntil });

Slide 40

Slide 40 text

40 Register install activate fetch Handling Fetch Requests Making A Service Workers

Slide 41

Slide 41 text

41 const list = document.getElementById('list'); // 矑茐咳蝑 request fetch('http://localhost:3000/people') .then(res => { return res.json(); }) .then(json => { list.innerHTML = json .map(item => `<li>${item.name}</li>`) .join(''); }) index.html Handling Fetch Requests

Slide 42

Slide 42 text

Handling Fetch Requests 42 self.addEventListener('fetch', event => { event.respondWith( caches.match(event.request) .then(function(response) { return response || fetch(event.request) .then(res => caches.open(dataCacheName) .then(function(cache) { cache.put(event.request, res.clone()); return res; }) ); }) ); }); sw.js self.addEventListener('fetch', event => { event.respondWith( caches.match(event.request) .then(function(response) { return response || fetch(event.request) .then(res => caches.open(dataCacheName) .then(function(cache) { cache.put(event.request, res.clone()); return res; }) ); }) ); }); self.addEventListener('fetch', event => { event.respondWith( caches.match(event.request) .then(function(response) { return response || fetch(event.request) .then(res => caches.open(dataCacheName) .then(function(cache) { cache.put(event.request, res.clone()); return res; }) ); }) ); }); self.addEventListener('fetch', event => { event.respondWith( caches.match(event.request) .then(function(response) { return response || fetch(event.request) .then(res => caches.open(dataCacheName) .then(function(cache) { cache.put(event.request, res.clone()); return res; }) ); }) ); }); self.addEventListener('fetch', event => { event.respondWith( caches.match(event.request) .then(function(response) { return response || fetch(event.request) .then(res => caches.open(dataCacheName) .then(function(cache) { cache.put(event.request, res.clone()); return res; }) ); }) ); }); self.addEventListener('fetch', event => { event.respondWith( caches.match(event.request) .then(function(response) { return response || fetch(event.request) .then(res => caches.open(dataCacheName) .then(function(cache) { cache.put(event.request, res.clone()); return res; }) ); }) ); }); self.addEventListener('fetch', event => { event.respondWith( caches.match(event.request) .then(function(response) { return response || fetch(event.request) .then(res => caches.open(dataCacheName) .then(function(cache) { cache.put(event.request, res.clone()); return res; }) ); }) ); }); self.addEventListener('fetch', event => { event.respondWith( caches.match(event.request) .then(function(response) { return response || fetch(event.request) .then(res => caches.open(dataCacheName) .then(function(cache) { cache.put(event.request, res.clone()); return res; }) ); }) ); });

Slide 43

Slide 43 text

43

Slide 44

Slide 44 text

44

Slide 45

Slide 45 text

Learn more? 45

Slide 46

Slide 46 text

46

Slide 47

Slide 47 text

47

Slide 48

Slide 48 text

48

Slide 49

Slide 49 text

49

Slide 50

Slide 50 text

50

Slide 51

Slide 51 text

傶Ջ讕襑ᥝ PWA? Ջ讕ฎ PWA? Service Work 墋Օ Registering the Service Worker Setting up the Default Cache Clearing Old Cache Handling Fetch Requests 䋿֢ PWA To-Do List - 氥纈盃旰Ԫ殻竃㻌 51 2017 iT 螸䒻盜裡Ո搴෈ᒍ

Slide 52

Slide 52 text

ref https://huangxuan.me/pwa-qcon2016/#/ https://medium.com/lets-grow-business/why- progressive-web-app-31dd11d9a925#.zb3d2m1jv https://igniteonline.com.au/why-progressive-web- apps-beat-native-apps-hands-down/ 52

Slide 53

Slide 53 text

ref images http://ninetailsfoxchan.deviantart.com/art/Sad- Png-by-NFC-304044918 http://mrmen.wikia.com/wiki/File:Mr._All- Goes_Wrong.PNG https://goo.gl/022j4n https://www.labnol.org/software/chrome-offline- dinosaur-game/28781/ 53

Slide 54

Slide 54 text

Thanks 眤蘛肔肯 54