I lang tid har frakoblet funksjonalitet, bakgrunnssynkronisering og push-varsler differensierte innfødte apper fra deres web-kolleger. De SERVICE WORKER API. er en spillendringsteknologi som fremmer spillfeltet. I denne opplæringen bruker vi den til å bygge en side som kan tjene opp innhold selv mens det ikke er Internett-tilkobling.
Den enkleste måten å tenke på servicearbeidere er som et stykke kode som er installert av et nettsted på en klientmaskin, går i bakgrunnen, og gjør det senere at forespørsler sendt til dette stedet som skal oppfanges og manipuleres. Fordi dette er en så kraftig evne, å jobbe med servicearbeidere i et levende miljø, må du kjøre over HTTPS. Dette sikrer at de ikke kan utnyttes, ved å sørge for at nettleseren sørger for at nettleseren mottar fra en side, er ekte.
For utviklingsformål kan vi imidlertid kjøre uten HTTPS siden http: // localhost / er tillatt som et unntak fra denne regelen. Den enkleste måten å komme i gang er med NPM http-server pakke.
NPM Installer HTTP-Server -G
http-server -P 8000 -C-1
Det er ingenting på serveren akkurat nå, så la oss gjøre en grunnleggende side for å tjene opp. Vi lager en ny index.html-fil, og når vi kjører serveren, vil den nå være tilgjengelig på http: // localhost: 8000 .
På dette stadiet finner du at hvis du avslutter HTTP-serveren og oppdaterer siden i nettleseren, får du en feilside siden nettstedet ikke kan nås. Dette er helt forventet siden vi ikke har bufret ethvert offline innhold ennå.
& lt;! DOCTYPE HTML & GT;
& lt; html & gt;
& lt; head & gt;
& lt; meta charset = "UTF-8" / & gt;
& lt; title & gt; service arbeider & lt; / title & gt;
& lt; script src = "site.js" & gt; & lt; / script & gt;
& lt; link rel = "Stylesheet" type = "tekst / css" href = "custom.css" & gt;
& lt; / head & gt;
& lt; body & gt;
& lt; header & gt;
& lt; h1 & gt; velkommen & lt; / h1 & gt;
& lt; / header & gt;
& lt; div id = "innhold" & gt;
& lt; p & gt; innhold her & lt; / p & gt;
& lt; img src = "kitty.jpg" bredde = "100%" & gt;
& lt; / div & gt;
& lt; / body & gt;
& lt; / html & gt;
Vi har nå fått en ganske unremarkable side som kjører, og det er på tide å begynne å tenke på å implementere en servicevirksomhet. Før vi blir koding, er det verdt å ta et øyeblikk for å forstå livssyklusen til servicearbeidere.
Prosessen starter med "Registrering" av en servicevirksomhet i JavaScript, som forteller nettleseren å begynne å installere arbeideren - det første trinnet i sin livssyklus. Gjennom sin livssyklus vil en servicevirksomhet være i en av følgende stater:
La oss registrere en servicevirksomhet. Dette peker effektivt nettleseren til JavaScript-filen som definerer servicearbeiderens oppførsel. Registrering gjøres ved hjelp av serviceproduksjonsobjektet som er inngangspunktet til API. Vi vil også sjekke API er faktisk tilstede i nettleseren før du prøver å gjøre det.
De registrere() Funksjonen kan trygt kalles hver gang siden laster, og nettleseren vil avgjøre om tjenestemannen allerede er registrert.
Hvis ('Serviceproacher' i Navigator) {
window.addeventlistener ('last', funksjon () {
navigator.ServiceWorker.Register ('servicephearing.js', {scope: './'})
konsoll.log ("Servicearbeider registrert med hell.");
}, funksjon (feil) {
Console.log ("Feil Registrering Service Arbeider:" + Feil);
});
});
}
Deretter må vi implementere selve arbeideren selv. Tjenestearbeidere kan lytte etter en rekke hendelser knyttet til egen livssyklus og aktivitet på siden. De viktigste er installere, aktiveres og hente.
La oss begynne med å skape en lytter for installere hendelse, som utløser når arbeidstakerens installasjon er fullført. Dette gjør det mulig for oss å instruere servicevirksomheten å legge til noe frakoblet innhold i den nåværende mappen til en cache. Vi må også nevne vår cache - siden gamle caches kan vedvare, oppdatering / versjoner dette cachenavnet lar deg betjene nyere versjoner av innhold senere.
VAR CurrentCache = 'Demo-cache';
Self.addeventlistener ('install', event = & gt; {
Event.waituntil (
caches.open (currentcache) .Nå (funksjon (cache) {
konsoll.log ("Legge til innhold til cache.");
Return cache.addall ([
'./index_offline.html',
'./kitty_offline.jpg',
'./custom.css'
]);
})
);
});
Vår side vil nå cache innhold når de lastes, men vi trenger noen mekanisme for å fange opp forespørsler og omdirigere dem til denne cachen. For å gjøre dette må vi lytte til hente det hendelser, som utløses når en forespørsel som for eksempel å skaffe oss index.html. Filen er laget over hele nettverket. Vi matcher deretter forespørselen mot hurtigbufferen, og serverer den bufrete ressursen hvis det er funnet. Ellers faller vi tilbake til en henting i API-forespørsel til serveren.
Det er verdt å merke seg at vi har en tung avhengighet av JavaScript lover å jobbe. Disse kan være litt vanskelig, så det er verdt å bli kjent med hvis du ikke har brukt dem før.
Self.addeventlistener ('Hent', Event = & GT; {
Event.respondwith (
Caches.Match (Event.Request) .Then (response = & gt; {
returrespons ||. hente (event.Request);
})
);
});
Hvis du tester det ut nå (avslutt HTTP-serveren og oppdater siden), bør du oppdage at siden din fungerer både online og offline. Det er imidlertid sannsynlig at du vil ha mer intelligent offlineadferd, med forskjellig innhold eller funksjonalitet tilgjengelig når serveren ikke er tilgjengelig.
For å oppnå dette kan vi utvide vår hente det Eventrespons videre for å kontrollere spesifikt for navigasjonsforespørsler og svare på en annen offline side når man oppdages. Dette index_offline.html. filen kan være en variasjon av nettsiden din, eller noe helt annet, og kan også bruke andre ressurser du har bufret for eksempel custom.css .
Self.addeventlistener ('Hent', Event = & GT; {
hvis (event.request.mode === 'navigere') {
Event.respondwith (
hente (event.Request) .Catch (feil = & gt; {
Console.log ("Side utilgjengelig. Retur frakoblet innhold.");
returner caches.match ('./ index_offline.html');
})
);
} else {
Event.respondwith (
Caches.Match (Event.Request) .Then (response = & gt; {
returrespons ||. hente (event.Request);
})
);
}
});
Det er en ting vi trenger. Hvis du nå prøver å endre ditt offline innhold, finner du det ikke oppdateres når du tester ut siden din - du får fortsatt den gamle versjonen! Dette skyldes at de eldre filene fortsatt er bufret.
Du må implementere noe for å rydde ut utdaterte filer fra hurtigbufferen for å hindre at de blir servert. Dette gjøres ved å svare på en aktiveres Event og slette alle caches som ikke samsvarer med navnet som er angitt i CurrentCache. Du kan deretter legge til et versjonsnummer til CurrentCache hver gang du endrer din offline innhold, for å sikre at den er oppdatert.
This.addeventlistener ('Aktiver', Event = & GT; {
var ActiveCaches = [CurrentCache];
Console.log ("Servicearbeider aktivert. Kontrollere cache er oppdatert.");
Event.waituntil (
caches.keys (). Deretter (keylist = & gt; {
returnere løfte. Alt (keylist.map (nøkkel = & gt; {
hvis (ActiveCaches.indexof (tast) === -1) {
konsoll.log ("Slette gammel cache" + nøkkel);
Return caches.delete (nøkkel);
}
}));
})
);
});
Denne artikkelen ble publisert i Web Designer Magazine Issue # 268. Abonner nå.
Les mer:
[1. 3] SVG har eksistert siden tidlig på 2000-tallet, og likevel er det fortsatt interessante måter at designere finner for å b..
[1. 3] Det er så mye som kan oppnås internasjonalt i nettleseren ved hjelp av CSS3 eller Web Animations API, i JavaScript. Enkle..
[1. 3] Denne trinnvise veiledningen er satt til å avsløre hvordan man skal gå om etableringen av realistiske skyer. Denne oppl�..
Hvis du alltid har ønsket å vite hvordan du tegner fjær, og gjør dem super-realistiske, er du på rett sted. Denne trinnvise veiledningen gir hint og tips om å gi fuglfjær en mer tredim..
[1. 3] Hvis du følger trender, er det vanskelig å savne at VR går gjennom en annen revival. Det har skjedd før, men denne gang..
[1. 3] Det er mange måter å nærme seg skapning og karakter design , og alt avhenger av hva du vil at sluttresult..
[1. 3] Polypaint i ZbrushCore. er et fantastisk verktøy som gjør at du kan legge til farge og teksturer til model..
Følgende tips bryter ned prosessen min for animerende bink for Eric Miller animasjonsstudioer 'kommende webserier. Bink er en nysgjerrig liten sjøfartskap som ble fanget og tatt til et test..