Risposte:
C'è una grande differenza in ciò a cui sono destinati:
Web Workers
I web worker forniscono ai contenuti web un mezzo semplice per eseguire script nei thread in background. Il thread di lavoro può eseguire attività senza interferire con l'interfaccia utente. Inoltre, possono eseguire I / O utilizzando XMLHttpRequest (sebbene gli attributi responseXML e channel siano sempre nulli). Una volta creato, un lavoratore può inviare messaggi al codice JavaScript che lo ha creato inviando messaggi a un gestore eventi specificato da quel codice (e viceversa).
Service Worker
I lavoratori del servizio agiscono essenzialmente come server proxy che si trovano tra le applicazioni Web e il browser e la rete (se disponibili). Hanno lo scopo (tra le altre cose) di consentire la creazione di esperienze offline efficaci, intercettando le richieste di rete e intraprendendo azioni appropriate in base alla disponibilità della rete e alle risorse aggiornate che risiedono sul server. Consentiranno inoltre l'accesso alle notifiche push e alle API di sincronizzazione in background.
Quindi i Web Worker sono utili per eseguire script costosi senza causare il blocco dell'interfaccia utente, mentre i Service Worker sono utili per modificare la risposta alle richieste di rete (ad esempio, quando si crea un'app offline).
La risposta di Buksy è corretta ma a mio avviso non risponde alla domanda originale, ovvero: "Cosa possono fare i lavoratori dei servizi che i web worker non possono fare? O viceversa?"
Esistono differenze fondamentali nel loro ciclo di vita e nel numero di istanze per origine che puoi avere. In breve:
| Web Workers | Service Workers |
|--------------|--------------|------------------|
| Instances | Many per tab | One for all tabs |
| Lifespan | Same as tab | Independent |
| Intended use | Parallelism | Offline support |
La risposta di Buksy è fondamentalmente l'ultima riga della tabella. Credito: ho preso questa tabella da Demystifying Web Workers and Service Workers di Nolan Lawson, a partire dalla diapositiva 35 .
In particolare, ecco come generare e terminare i web worker:
considerando che i lavoratori dei servizi hanno il loro ciclo di vita, che è certamente la loro "parte più complicata":
Il ciclo di vita dei Service Worker
Quindi lo stile di vita è una differenza fondamentale tra i due (una conseguenza della loro destinazione d'uso).
C'era un'enorme differenza nel supporto del browser : i lavoratori del servizio non erano affatto disponibili in Safari per iOS fino alla 11.3 (29 marzo 2018), vedi Posso usare i lavoratori del servizio? Al contrario, i web worker avevano un supporto browser molto migliore già nel 2012: posso usare i web worker?
Se devi supportare IE11, puoi usare solo web worker: IE11 non ha service worker e apparentemente la fine del supporto per IE11 è il 14 ottobre 2025 .
Ci sono sottili differenze nel loro supporto API tra i browser, vedi HTML5 Worker Test (anche di Nolan Lawson). In un particolare browser, un tipo di worker potrebbe supportare una determinata chiamata API mentre l'altro no. Visita quella pagina e prova il tuo browser!