Respostas:
Há uma grande diferença no que eles se destinam:
Trabalhadores da Web
Os Web Workers fornecem um meio simples para o conteúdo da web executar scripts em threads de fundo. O thread de trabalho pode executar tarefas sem interferir na interface do usuário. Além disso, eles podem realizar E / S usando XMLHttpRequest (embora os atributos responseXML e channel sejam sempre nulos). Depois de criado, um trabalhador pode enviar mensagens para o código JavaScript que o criou, postando mensagens para um manipulador de eventos especificado por esse código (e vice-versa).
Service Worker
Os service workers atuam essencialmente como servidores proxy que ficam entre os aplicativos da web, o navegador e a rede (quando disponível). Eles se destinam (entre outras coisas) a permitir a criação de experiências offline eficazes, interceptando solicitações de rede e tomando as medidas adequadas com base na disponibilidade da rede e de ativos atualizados residem no servidor. Eles também permitirão acesso a notificações push e APIs de sincronização em segundo plano.
Portanto, os Web Workers são úteis para executar scripts caros sem fazer com que a interface do usuário congele, enquanto os Service Workers são úteis para modificar a resposta de solicitações de rede (por exemplo, ao construir um aplicativo offline).
A resposta de Buksy está correta, mas na minha opinião não responde à pergunta original, a saber: "O que os service workers podem fazer que os web workers não podem? Ou vice-versa?"
Existem diferenças fundamentais em seu ciclo de vida e no número de instâncias por origem que você pode ter. Em resumo:
| Web Workers | Service Workers |
|--------------|--------------|------------------|
| Instances | Many per tab | One for all tabs |
| Lifespan | Same as tab | Independent |
| Intended use | Parallelism | Offline support |
A resposta de Buksy é basicamente a última linha da tabela. Crédito: Peguei esta tabela de Demystifying Web Workers and Service Workers de Nolan Lawson, começando no slide 35 .
Em particular, aqui está como você gera e encerra web workers:
enquanto os prestadores de serviço têm seu próprio ciclo de vida, que é reconhecidamente sua "parte mais complicada":
O Ciclo de Vida do Service Worker
Portanto, o estilo de vida é uma diferença fundamental entre os dois (uma consequência do uso pretendido).
Costumava haver uma grande diferença no suporte do navegador : Service workers não estavam disponíveis no Safari para iOS até 11.3 (2018, 29 de março), consulte Posso usar service workers? Em contraste, os web workers tiveram um suporte a navegador muito melhor já em 2012: Posso usar web workers?
Se você tiver que oferecer suporte ao IE11, poderá usar apenas Web workers: o IE11 não tem service workers e, aparentemente, o fim do suporte para o IE11 é 14 de outubro de 2025 .
Existem diferenças sutis no suporte de API entre os navegadores, consulte HTML5 Worker Test (também de Nolan Lawson). Em um navegador específico, um tipo de trabalhador pode oferecer suporte a uma determinada chamada de API, enquanto o outro não. Visite essa página e teste seu próprio navegador!