Fagdag PWA Oppgave - Sonat-Consulting/fagdag-pwa GitHub Wiki
Vi skal lage ein applikasjon som hentar ut kontaktinformasjon frå våre kjære kollegaer i Sonat og deretter presentere denne informasjonen i form av kontakt-kort. Dataen er gjort tilgjengelig her. Kvar person kan ha følgande informasjon tilgjengeleg:
{
"email": "[email protected]",
"image": "http://www.sonat.no/wp-content/uploads/2016/07/profile.png",
"mobile": "+4799999999",
"name": "Fornavn Etternavn",
"status": "Test av statusoppdatering"
}
Kva vi skal lære oss
- Oppsett av
manifest.json
- Bruk av service worker og event hooks for
fetch
oginstall
- Offlinestøtte ved hjelp av caching av filer
- Om vi får tid kan vi sjå på indexdb og synkronisering av lokal data når man får tilbake nettverkstilkobling etter å ha vore offline.
- Vi anbefaler å sjå gjennom Google sin tutorial med tittel Your First Progressive Web App som du kan finne her
Det du treng for å komme i gang
Kom i gang
- Fork dette repoet
- Hent ned koden
git clone [email protected]:{ditt brukarnamn}/fagdag-pwa.git
- Installer alle dependencies
npm i
- Start webpack devserver som vil lytte på filendringar og automatisk vises siste versjon i nettlesar.
npm start
sw.js
)
Oppgåve 1 - Service worker (Vi skal lage service workeren vår (sw.js
) som seinare skal ta seg av å lagre filer og eventuell applikasjons-data i cache.
- Huk av checkboxen
Update on reload
under fanenApplication > Service Workers
i Chrome dev tools - Registrer lyttere for eventene
install
ogfetch
. - Logg ei melding i callback på følgande måte.
Hint!
sw.js
du skal jobbe på ligger under/src/
self.addEventListener('install', (e) => {
console.log('[sw] onInstall');
});
- Observer konsollen når sida lastar og merk deg når desse eventene blir fyrt.
manifest
Oppgåve 2 - LagWeb App Manifestet er ei enkel JSON fil som lar deg kontrollere korleis applikasjonen din vil sjå ut og oppføre seg dersom den blir lagra som snarvei på smarttelefonar. Les meir om Web App Manifest her. Når du er ferdig med denne oppgåva skal du kunne åpne Application > Manifest
og sjå tilsvarande grafikk som under.
Hint!
manifest.json
ligger under/dist/
App Shell
Oppgåve 3 - CacheApp "shell" er minimum av javascript, html og css som trengs for at applikasjonen skal kunne laste og rendre eit GUI til brukaren. Les meir om App Shell her. I denne oppgåva skal du lagre alle filene i vårt app shell i cache. Når du er ferdig skal du kunne inspisere Application > Cache > Cache Storage
i Chrome Devtools og sjå alle filene lista ut der.
Hint! Denne sida kan være til hjelp
Hint! Dette er filene i vårt app shell:
const appShellFiles = [
'/offline.html',
'/manifest.json',
'/app.js',
'/icons/sonat_200x200.png',
'/icons/sonat_400x400.jpg',
'/icons/sonat_32x32.png',
'/style.css',
'/cards.css'
];
Hint! Om du står fast, kan kanskje denne metoden være til hjelp:
const cacheOfflineResources = () =>
Promise.all([caches.open(FILE_CACHE)])
.then(([fileCache]) => {
fileCache.addAll(appShellFiles);
});
Oppgåve 4 - Returner App Shell frå cache
I forrige oppgåve lagra vi alle filene som inngår i App Shell i cache. I denne oppgåva skal vi returnere desse filene fra cache i staden for å gå på nettverket for å finne dei. Når du er ferdig skal du kunne sjå i fanen Network
i Chrome Dev Tools at desse filene blir returnert frå cache, eller om du har ein debugging proxy ala. Fiddler så skal du ikkje sjå desse filene i nettverkstrafikken.
Hint! Ved nettverksforespørsler blir eventen
fetch
fyrt.
Hint! Dersom du står fast kan kanskje metoden under være til hjelp.
const getCachedFiles = e =>
caches.match(e.request)
.then(response => response || fetch(e.request))
.catch(handleOffline(e));
offline.html
når appen blir lasta uten internettilkobling
Oppgåve 5 - Vis Vi har laga ei enkel html-side vi skal vise når vi ikkje har internettilkobling, som erstatning for den kjedelige chrome-sida This site can’t be reached
. Når denne oppgåva er ferdig skal vi kunne sjå vår custom offline-side når du laster appen på nytt uten nett.
Hint! Når
e.request.mode
er'navigate'
ifetch
event, så betyr dette at dette er lasting av nettside og ikkje lasting av ein ressurs (css, js, etc.)
Oppgåve 6 - Lagre applikasjonsdata (ansatt-data) i cache eller i indexdb
Vi opererer med relativt statiske data, som kontaktinformasjon. Denne informasjonen lar seg fint lagre i cache slik at den er tilgjengeleg også offline. Bruk sw.js
til å lagre desse dataene i tillegg til statiske filer som css, js og html. Når du har gjort denne oppgåva skal du kunne huke av Offline
, under Application > Service Workers
og fortsatt få opp ansattdata når du laster sida på nytt.
Hint! Det kan være lurt å lage ein eigen cache-indeks for desse dataene slik at cache kan invalideres separat.
Hint! Vi må her utvide lista med filer vi vil cache, ettersom vi skal returnere index.html og ikkje offline.html når vi er uten nett:
const appShellFiles = [
'/',
'/index.html'
'/offline.html',
'/manifest.json',
'/app.js',
'/icons/sonat_200x200.png',
'/icons/sonat_400x400.jpg',
'/icons/sonat_32x32.png',
'/style.css',
'/cards.css'
];
Oppgåve 7 - Oppdater data cache (ansatt-data) når web appen blir lasta og vi har internettilkobling
Vi har allerede ansatt-data i cache, men det er jo litt synd om denne dataen aldri blir oppdatert! Det skal du få orden på no. Når denne oppgåva er gjort skal du kunne oppdatere statusen din, gå tilbake til hovudsida og sjå at den nye statusen din er satt. Gå offline og verifiser at den nye statusen fortsatt er satt. Før du begynner må du slå av Update on reload
i Chrome devtools, under Application > Service Workers
.
Hint! Lytteren vi har registrert på eventen
fetch
vil bli trigget nårgetEmployees
blir kalt. Ellers kan det være greit å vite atnavigator.onLine
returnerer einboolean
som kan bli nyttig.
Hint 2! Dersom du treng litt hjelp på vegen har vi laga ein hjelpefunksjon du kan bruke, men prøv først å finne ut av det sjølv.
const fetchEmployeeData = request =>
Promise.all([caches.open(DATA_CACHE), fetch(request)])
.then(([dataCache, response]) => {
dataCache.put(request.url, response.clone());
return response;
})
.catch(error => { /* No internet connection */ });
Oppgåve 8 - Lagre profilbilder i cache for offline bruk
I denne oppgåva skal du forsøke å lagre profilbildene i cache slik at vi får ein fullgod opplevelse, også offline.
Hint!
fetch(url)
returnerer promise som resolver med eit response objekt. Les meir på developer.mozilla.org. Ansatt-data finnes her.
Oppgåve 9 - Oppdater status offline, synkroniser når du får tilbake internettforbindelsen
Bruk indexdb til å oppdatere status for ansatte når du er offline. Når du igjen får nettverk bruker du sw.js
til å synkronisere database med lokal data.
Her har du komt lenger enn forfatteren, så du er on your own. Indexdb er kjent for å ha eit litt vanskelig API å jobbe med, men det finnes pakkar som feks. idb som tilbyr eit meir vennleg API på toppen av indexdb.
Publiser applikasjonen
Github pages er eit fint alternativ for hosting av denne applikasjonen ettersom du der kan serve statiske filer over https rett fra repositoriet ditt. Om du velger denne måten har vi eit npm script som kan gjere jobben enkel. Følgande kommando vil bygge filer til dist
og pushe branch gh-pages
til remote. Din PWA vil bli tilgjengelig på url https://{ditt brukarnamn}.github.io/fagdag-pwa/
. Merk at rot-urlen i dette tilfellet blir /fagdag-pwa/
og dette må du ta høgde for i koden din.
npm run deploy