Under lång tid har offline-funktionalitet, bakgrundssynkronisering och push-meddelanden differentierade nativa appar från sina web-motsvarigheter. De Servicearbetare API är en spelsändande teknik som förväntar sig spelplanen. I den här handledningen använder vi det för att bygga en sida som kan servera innehåll även om det inte finns någon internetanslutning.
Det enklaste sättet att tänka på servicearbetare är som en kod som är installerad av en webbplats på en klientmaskin, körs i bakgrunden och möjliggör sedan förfrågningar som skickas till den webbplatsen som ska avlyssas och manipuleras. Eftersom det här är en så kraftfull förmåga att arbeta med servicearbetare i en levande miljö måste du springa över https. Detta säkerställer att de inte kan utnyttjas, genom att se till att den tjänstemän som webbläsaren mottar från en sida är äkta.
För utvecklingsändamål kan vi dock springa utan https sedan http: // localhost / är tillåtet som ett undantag från denna regel. Det enklaste sättet att komma igång är med npm http-server paket.
npm installera http-server -g
http-server -p 8000 -c-1
Det finns inget på servern just nu, så låt oss göra en grundläggande sida för att tjäna upp. Vi skapar en ny index.html-fil, och när vi kör servern kommer det nu att vara tillgänglig på http: // localhost: 8000 .
På detta stadium finner du att om du avslutar HTTP-servern och uppdaterar sidan i webbläsaren får du en fel sida eftersom webbplatsen inte kan nås. Det är helt förväntat eftersom vi inte har cachat något offlineinnehåll än.
& lt;! Doktype html & gt;
& lt; html & gt;
& lt; huvud & gt;
& LT; Meta Charset = "UTF-8" / & GT;
& lt; Titel & GT; Servicearbetare & LT; / Titel & GT;
& lt; script src = "site.js" & gt; & lt; / script & gt;
& lt; länk rel = "stylesheet" typ = "Text / css" href = "custom.css" & gt;
& LT; / Head & GT;
& lt; kropp & gt;
& lt; header & gt;
& lt; H1 & GT; Välkommen & LT; / H1 & GT;
& lt; / header & gt;
& lt; div id = "innehåll" & gt;
& lt; P & GT; innehåll här och lt; / P & GT;
& lt; img src = "kitty.jpg" Bredd = "100%" & GT;
& lt; / div & gt;
& LT; / Body & GT;
& lt; / html & gt;
Vi har nu en ganska obehandlad sida som körs, och det är dags att börja tänka på att genomföra en tjänsteman. Innan vi får kodning är det värt att ta ett ögonblick för att förstå livscykeln för servicearbetare.
Processen sparkar av med "registrering" av en servicearbetare i ditt Javascript, vilket berättar att webbläsaren börjar installera arbetaren - det första steget i sin livscykel. Under hela sin livscykel kommer en servicearbetare att vara i ett av följande stater:
Låt oss registrera en servicearbetare. Detta pekar effektivt webbläsaren till JavaScript-filen som definierar servicearbetarens beteende. Registrering görs med hjälp av ServiceWorker-objektet som är ingångspunkten till API. Vi ska också kolla API är faktiskt närvarande i webbläsaren innan du försöker göra det.
De Registrera() Funktionen kan säkert kallas varje gång sidan laddas, och webbläsaren bestämmer om tjänstemannen redan har registrerats.
Om ("Serviceworker" i Navigator) {
fönster.Addeventlistener ('load', funktion () {
navigator.serviceworker.register ('serviceworker.js', {Scope: './'9} ..then(function(registration) {
Console.log ("Servicearbetare registrerad framgångsrikt.");
}, funktion (fel) {
Console.log ("Fel som registrerar servicearbetare:" + fel);
});
});
}
Därefter måste vi genomföra servicemannen själv. Servicearbetare kan lyssna på en rad händelser som är relaterade till sin egen livscykel och aktivitet på sidan. De viktigaste är installation, aktivera och hämta.
Låt oss börja med att skapa en lyssnare för Installera händelse, som utlöser när arbetstagarens installation är klar. Detta gör det möjligt för oss att instruera tjänstearbetaren att lägga till lite offlineinnehåll i den aktuella mappen till en cache. Vi behöver också namnge vår cache - eftersom gamla cacher kan fortsätta, uppdatera / versionera detta cacheminne gör det möjligt för dig att hjälpa till med nyare versioner av innehåll senare.
Var CurrentCache = 'Demo-cache';
self.addeventlistener ('install', evenemang = & gt; {
evenemang.waituntil (
caches.Open (strömcache) .Then (funktion (cache) {
Console.log ("Lägga till innehåll i cacheminnet.");
retur cache.addall ([
'./index_offline.html',
'./kitty_offline.jpg',
'./Anpassad CSS'
]);
})
);
});
Vår sida kommer nu att cache-innehållet när den laddas, men vi behöver lite mekanism för att fånga upp förfrågningar och omdirigera dem till den här cachen. För att göra detta måste vi lyssna på hämta händelser, som utlöses när en förfrågan som skaffa vår index.html Filen är gjord över nätverket. Vi matchar sedan begäran mot cacheminnet och serverar den cachade resursen om den hittas. Annars faller vi tillbaka till en hämta API-förfrågan till servern.
Det är värt att notera att vi har ett stort beroende av JavaScript lovar att arbeta. Dessa kan vara lite knepiga, så är värda att bekanta med om du inte har använt dem tidigare.
self.addeventlistener ('hämta', evenemang = & gt; {
evenemang.Respondwith (
caches.match (evenemang.request) .Then (svar = & gt; {
Retur svar || hämta (evenemang.request);
})
);
});
Om du testar det nu (avsluta HTTP-servern och uppdaterar sidan), bör du upptäcka att din sida fungerar både online och offline. Det är dock troligt att du vill ha mer intelligent offline-beteende, med olika innehåll eller funktionalitet tillgänglig när servern är otillgänglig.
För att uppnå detta kan vi förlänga vårt hämta Evenemangssvar Vidare kontrollera specifikt för navigeringsförfrågningar och svara med en annan offline-sida när den är detekterad. Detta index_offline.html filen kan vara en variant på din online-sida, eller något helt annat, och kan också använda andra resurser du har cachat som Anpassad CSS .
self.addeventlistener ('hämta', evenemang = & gt; {
om (evenemang.request.mode === 'navigera') {
evenemang.Respondwith (
hämta (evenemang.request) .Catch (error = & gt; {
Console.log ("sidan är inte tillgänglig. Återgå offlineinnehåll.");
retur caches.match ('./ index_offline.html');
})
);
} annars {
evenemang.Respondwith (
caches.match (evenemang.request) .Then (svar = & gt; {
Retur svar || hämta (evenemang.request);
})
);
}
});
Det är en sak vi behöver. Om du nu försöker ändra ditt offlineinnehåll, hittar du det inte uppdaterar när du testar din sida - du får fortfarande den gamla versionen! Detta beror på att de äldre filerna fortfarande är cachade.
Du måste implementera något för att rengöra föråldrade filer från cacheminnet för att förhindra att de serveras. Detta görs genom att svara på en Aktivera händelse och radering av alla cacher som inte matchar namnet som anges i CurrentCache. Du kan sedan lägga till ett versionsnummer till CurrentCache varje gång du ändrar ditt offlineinnehåll för att säkerställa att det är uppdaterat.
This.Addeventlistener ('Aktivera', Event = & GT; {
Var ActiveCaches = [CurrentCache];
Console.log ("Servicearbetare aktiverad. Kontrollera cache är aktuell.");
evenemang.waituntil (
caches.keys (). Sedan (keylist = & gt; {
returnera louse.all (keylist.map (nyckel = & gt; {
IF (ActiveCaches.indexof (Key) === -1) {
Console.log ("Radera gammal cache" + -knapp);
retur caches.delete (tangent);
}
}));
})
);
});
Denna artikel publicerades i Web Designer Magazine Issue # 268. Prenumerera nu.
Läs mer:
Att göra Chiaroscuro konst handlar om att använda ljusets sammansättning och skugga för att skapa djup, och ännu viktigare, humör. I den här handledningen kommer vi att dyka in i mörk..
(Bildkredit: Framtida) Att hålla bots ut är alltid ett nummer spel - tyvärr, tillgängligheten av lättanvänd mas..
Sida 1 av 2: Sida 1 Sida 1 Sida 2 3D Specialist Glen Southern ..
Med en kortare inlärningskurva än INVISION-app och helt nya designhanteringsverktyg för företagsgrupper finns det ingen bätt..
För alla som arbetar professionellt i karaktär design , ett teckenbibel är ett av de viktigaste elementen i dit..
Sida 1 av 2: Komma igång med Cinema 4D Komma igång med Cinema 4D ..
För att någon e-postmarknadsföringskampanj ska fungera måste e-posten nå inkorgen och sticka ut från alla andra. Men historien slutar inte där. Din e-post måste göra det bra om du vi..
Den här veckan såg utgåvan av några nya videoklipp på Adobes gör det nu spellista, en samling klipp allt om hur man skapar designprojekt med kreativa molnprogram på en minut eller mind..