servis vorkrTakéServiceWorker, SW, servisní workerPokročilý

Definice

Service Worker je skript prohlížeče, který běží na pozadí mimo stránku a funguje jako programovatelný proxy server mezi webovou aplikací a sítí. Zachytává odchozí požadavky, může na ně odpovědět z mezipaměti Cache Storage, a díky tomu umožňuje offline režim, rychlejší načítání i příjem push notifikací bez otevřené záložky.

Kategorie: Webové technologieAktualizováno

Proč Service Worker vznikl

Klasická webová stránka je závislá na síti: když spojení vypadne, uživatel uvidí chybovou obrazovku. Starší pokus o řešení, AppCache, se řídil deklarativním manifestem a nešel programově ovlivnit, což vedlo k obtížně laditelnému chování. Service Worker tenhle přístup obrátil: místo deklarace dostal vývojář JavaScriptový kód, který o každém požadavku rozhodne sám.

Životní cyklus registrace

Service Worker se registruje ze stránky voláním navigator.serviceWorker.register(). Prohlížeč skript stáhne, spustí událost install (typicky se v ní předem naplní cache) a poté activate, kde se obvykle mažou staré verze cache. Nová verze skriptu čeká ve stavu waiting, dokud se neuvolní všechny záložky ovládané starou verzí, pokud vývojář nezavolá skipWaiting(). Rozsah kontroly určuje scope: skript umístěný v kořeni webu ovládá celý původ, skript v /app/ jen tuto podcestu.

Co Service Worker smí a nesmí

Service Worker běží ve vlastním vlákně bez přístupu k DOM, takže nemůže sáhnout na stránku přímo: komunikuje s ní zprávami přes postMessage. Nemá k dispozici synchronní API jako localStorage; k datům přistupuje přes Cache Storage a IndexedDB. Prohlížeč ho kdykoli uspí a při další události znovu probudí, takže globální proměnné mezi spuštěními nepřežijí. Registrace je povolena pouze přes HTTPS (výjimkou je localhost), protože skript, který přepisuje odpovědi ze sítě, by na nešifrovaném spojení byl ideálním nástrojem útoku.

Strategie práce s cache

V události fetch se rozhoduje, odkud odpověď přijde. Nejčastější vzorce jsou cache first pro neměnné soubory s hashem v názvu, network first pro HTML a API odpovědi, kde je aktuálnost důležitější, a stale-while-revalidate, kdy uživatel dostane uloženou kopii okamžitě a na pozadí se stáhne nová. Volba strategie je architektonické rozhodnutí, ne detail: špatně zvolený cache first umí zamrznout aplikaci na staré verzi na týdny.

Na čem Service Worker stojí v širším ekosystému

Service Worker je nutnou podmínkou Progressive Web App: bez něj aplikace nesplní požadavek na offline chování ani nemůže přijímat push notifikace, protože ty doručuje prohlížeč právě jemu i při zavřené stránce. Navazují na něj i Background Sync pro odložené odeslání dat po obnovení spojení a Periodic Background Sync pro plánovanou aktualizaci obsahu. Podpora těchto doplňkových API se mezi prohlížeči liší výrazně víc než podpora samotného Service Workeru.

Kdy se Service Worker nevyplatí

Pro statický informační web bez opakovaných návštěv přidá Service Worker hlavně provozní riziko: zapomenutá registrace umí servírovat starou verzi i po nasazení nové. Smysl dává tam, kde uživatelé aplikaci otevírají opakovaně, potřebují ji v terénu bez signálu, nebo kde chcete ušetřit opakované stahování velkého balíku assetů.

Příklady z praxe

  1. Předvyplnění cache při instalaci

    E-shop chce, aby se úvodní obrazovka zobrazila i bez připojení. Při instalaci Service Worker uloží kostru aplikace a fallback stránku do pojmenované cache. Při každém nasazení se změní název cache, čímž se stará verze při aktivaci smaže.

    const CACHE = 'app-v7';
    
    self.addEventListener('install', (event) => {
      event.waitUntil(
        caches.open(CACHE).then((c) =>
          c.addAll(['/', '/offline.html', '/app.css', '/app.js'])
        )
      );
    });
    
    self.addEventListener('activate', (event) => {
      event.waitUntil(
        caches.keys().then((keys) =>
          Promise.all(keys.filter((k) => k !== CACHE).map((k) => caches.delete(k)))
        )
      );
    });
  2. Network first s offline záložkou

    Zpravodajský web potřebuje vždy čerstvý článek, ale nechce ukázat chybovou stránku prohlížeče, když metro projíždí tunelem. Service Worker zkusí síť, odpověď si uloží, a při selhání sáhne do cache nebo vrátí připravenou offline stránku.

    self.addEventListener('fetch', (event) => {
      if (event.request.mode !== 'navigate') return;
    
      event.respondWith(
        fetch(event.request)
          .then((res) => {
            const copy = res.clone();
            caches.open('pages').then((c) => c.put(event.request, copy));
            return res;
          })
          .catch(() =>
            caches.match(event.request).then((hit) => hit || caches.match('/offline.html'))
          )
      );
    });

Časté omyly

MýtusService Worker se nasadí jednou a pak se o něj není potřeba starat.
Ve skutečnostiService Worker si prohlížeč drží i po nasazení nové verze webu a starou logiku uplatňuje dál, dokud neproběhne aktualizace skriptu a aktivace. Bez promyšleného verzování cache a strategie aktualizace uživatelé vidí zastaralý obsah, aniž by to na serveru šlo poznat.
MýtusService Worker je jen jiný název pro Web Worker.
Ve skutečnostiWeb Worker slouží k výpočtům na pozadí a žije jen po dobu existence stránky, která ho vytvořila. Service Worker je vázaný na původ, ne na záložku, běží i po jejím zavření a jeho hlavní role je zachytávání síťových požadavků.
MýtusSe Service Workerem funguje web offline automaticky.
Ve skutečnostiService Worker sám o sobě nic neukládá. Offline režim vzniká teprve tím, že vývojář explicitně určí, co se do Cache Storage uloží a jak se v události fetch odpovídá při výpadku sítě.

Časté dotazy

Jak vynutit aktualizaci Service Workeru u uživatelů, kteří mají starou verzi?
Aktualizace Service Workeru se spustí tím, že prohlížeč stáhne skript a zjistí, že se jeho obsah bajtově liší od uložené verze. Nová verze pak čeká, dokud uživatel nezavře všechny záložky pod kontrolou staré. Zkrátit to lze voláním skipWaiting v události install a claim v activate, ideálně po potvrzení uživatelem přes zprávu ze stránky. Doporučuje se také posílat skript Service Workeru s krátkou dobou platnosti v HTTP cache, aby prohlížeč nekontroloval zastaralou kopii.
Proč Service Worker vyžaduje HTTPS?
Service Worker může libovolně měnit odpovědi na požadavky celého původu a zůstává registrovaný i po opuštění stránky. Na nešifrovaném spojení by útočník uprostřed cesty mohl podstrčit vlastní skript, který by se v prohlížeči oběti usadil natrvalo a upravoval veškerý obsah webu. Specifikace proto registraci omezuje na zabezpečené kontexty. Výjimkou je localhost a obdobné lokální adresy, aby byl možný vývoj bez certifikátu.
Jak Service Worker odladit, když neběží ve stránce?
Service Worker má vlastní kontext, takže jeho výpisy se neobjeví v konzoli stránky. V Chrome i Edge slouží záložka Application a sekce Service Workers, kde lze vidět stav registrace, vynutit aktualizaci, odregistrovat instanci nebo simulovat offline. Obsah Cache Storage je vidět ve stejné sekci. Firefox nabízí obdobný přehled na adrese about:debugging. Při hledání chyb pomáhá i volba, která dočasně obejde Service Worker a pošle požadavky rovnou na síť.
Ovlivňuje Service Worker SEO a indexaci obsahu?
Service Worker při prvním načtení robotem nehraje roli: vyhledávací robot přichází bez registrovaného skriptu, takže dostane odpověď přímo ze serveru. Obsah tedy musí být dostupný i bez něj. Riziko vzniká opačným směrem: pokud aplikace spoléhá na to, že data doplní až Service Worker z cache, robot uvidí prázdnou stránku. Rychlost načítání pro vracející se uživatele může Service Worker zlepšit, ale měřené metriky Core Web Vitals se sbírají z reálných návštěv, nikoli z prvního průchodu robota.

Zdroje

  1. Service Worker API(otevře se v novém okně)MDN Web Docs
  2. Cache API(otevře se v novém okně)MDN Web Docs
  3. Fetch Standard(otevře se v novém okně)WHATWG

Související pojmy

Potřebujete to vyřešit v praxi?

Poradíme, jak na to ve vašem projektu

Vysvětlit pojem je jedna věc, navrhnout kolem něj funkční řešení druhá. Ozvěte se a probereme, co dává smysl u vás.