O que são Service Workers e como usá-los para melhorar sua aplicação?

Acesso Rápido:

O que são Service Workers?
Uma experiência não muito agradável, certo?
As políticas ou estratégias de cache
1- Cache First (Cache primeiro)
2- Network First (Rede primeiro)
3- Cache Only (Somente Cache)
4- Network Only (Somente rede)
5- Stale while revalidate / Cache update (Atualização de cache)
Configuração
Conclusão
Perguntas Frequentes (FAQs)

O que são Service Workers?

De maneira geral, os Service Workers são scripts que atuam como intermediários entre o navegador e o servidor web. Eles rodam de maneira assíncrona, fora da thread principal do browser, permitindo que lidem com suas tarefas sem interferir na navegação do usuário. Esses scripts buscam melhorar a confiabilidade dos dados exibidos, melhorar o desempenho da página, dar suporte a recursos como sincronização em segundo plano, notificações push, políticas avançadas de cache e são fundamentais no desenvolvimento de progressive web apps (PWA).

Entretanto, para que tudo funcione como esperado, é preciso configurar o Service Worker e você pode fazer isso dentro da própria aplicação web que será executada no navegador, mas falaremos sobre isso mais adiante.

Como vimos, os Service Workers possuem diversas funções, mas vamos nos focar aqui em uma delas: a configuração de políticas avançadas de cache.  Imagine o seguinte cenário: você, enquanto usuário de uma aplicação web, está navegando quando de repente perde a conexão com a internet e se depara com uma tela como essa:

Uma experiência não muito agradável, certo?

Agora uma outra situação: você, enquanto desenvolvedor, corrige algum bug ou implementa uma nova feature, manda para produção, mas o seu usuário só recebe as alterações após forçar a limpeza do cache. Outra péssima experiência, né? Que pode, inclusive, causar vários problemas.

E agora imagine um último cenário: você desenvolve uma aplicação super moderna com várias imagens, animações e vídeos, mas a cada vez que o usuário acessa a sua página tudo isso precisa ser carregado novamente, gastando muitos dados e deixando o carregamento lento.

Todos estes cenários podem ser evitados por meio do Service Worker e da configuração das políticas de cache. Para isso, o Service Worker trabalha atrelado à API Cache Storage, o que permite que tenhamos controle completo sobre o conteúdo do cache.

As políticas ou estratégias de cache

Os Service Workers possuem cinco políticas de cache que podemos utilizar para escolher como um recurso será armazenado e recuperado. Para escolhermos a melhor política precisamos saber o que pretendemos com ela: garantir que o usuário tenha sempre o dado mais atualizado possível? Garantir que o usuário consiga utilizar a aplicação estando offline? Entender os objetivos é fundamental para configurar a política correta. Lembrando que podemos configurar diversas políticas diferentes na mesma aplicação. E como isso é possível?

Como falamos anteriormente, os Service Workers atuam como intermediários entre a aplicação e o servidor, interceptando toda a comunicação que acontece entre eles. Por essa razão conseguimos especificar políticas diferentes para cada requisição e/ou asset. Quando uma chamada é feita, o Service Worker irá verificar se há alguma configuração para essa chamada e vai tratá-la de acordo com o que estiver especificado. Isso vai se repetir com cada uma das requisições.

Agora analisaremos cada uma das cinco políticas de cache disponíveis:

1- Cache First (Cache primeiro)

Ao escolhermos essa política o service Worker verificará o cache em primeiro lugar. Se a informação solicitada já estiver armazenada, ele irá retorná-la. Caso o recurso não esteja disponível em cache, vai fazer uma requisição ao servidor, obter o recurso e armazená-lo para ser usado posteriormente.

2- Network First (Rede primeiro)

Ao contrário da política anterior, aqui o Service Worker verificará a rede em primeiro lugar. Caso a solicitação seja bem-sucedida, ele retorna esse recurso. Caso ocorra algum problema, o Service Worker irá verificar o cache e retornar o recurso armazenado (caso exista).

3- Cache Only (Somente Cache)

Como o próprio nome diz, essa política faz com que o service worker forneça apenas recursos armazenados em cache, sem fazer requisição para o servidor. Essa política é útil para quando uma aplicação deve funcionar mesmo offline, porém não deve ser escolhida caso os dados exibidos precisem estar sempre atualizados.

4- Network Only (Somente rede)

Ao contrário da Cache Only, essa política obriga o Service Worker a sempre fazer a solicitação na rede para obter o recurso, ignorando o cache. Se a aplicação precisa que os dados estejam sempre atualizados, essa é a política ideal.

5- Stale while revalidate / Cache update (Atualização de cache)

Essa é a mais complexa das políticas, uma vez que combina duas estratégias: “Cache First” e ”Network First”. Aqui o Service Worker se direciona primeiro ao cache. Se o recurso estiver armazenado é retornado imediatamente. Enquanto isso, o Service Worker também envia uma requisição à rede. Se houver uma versão mais recente do recurso solicitado, o cache será atualizado com a nova versão.

Configuração

Vimos algumas das principais estratégias de cache que podem ser adotadas, mas como “dizer” ao Service Worker qual (ou quais) escolhemos? Existe mais de uma maneira de se fazer isso e ela dependerá da complexidade da sua aplicação e do nível de configuração requerido. Trabalhar com Service Workers pode ser bastante complexo, por isso geralmente ele é utilizado em conjunto o WorkBox.

O Workbox traz um conjunto de bibliotecas e ferramentas que auxiliam na configuração e utilização dos Service Workers. Duas das principais ferramentas são os módulos InjectManifest  e GenerateSW. Qual dos módulos utilizar dependerá do quão flexíveis devem ser as suas configurações.

O GenerateSW é mais prático e simples de se utilizar, porém fornece um conjunto menor de opções de configuração. Além disso, não deve ser utilizado para features como Web Push. Já o InjectManifest traz maior flexibilidade mas menor simplicidade de uso, pois você precisará escrever o seu próprio código.

Conclusão

Os service Workers podem ser grandes aliados das nossas aplicações, deixando-as com melhor desempenho e trazendo features bastante utilizadas atualmente, como o Web Push. Apesar de não ser um tópico de entendimento simples, vale a pena reservar um tempo para compreender melhor essa ferramenta tão potente!

Perguntas Frequentes (FAQs):

1- O que são Service Workers?
Os Service Workers são scripts em segundo plano que permitem controlar ações assíncronas e interações entre o navegador e a rede. Eles atuam como intermediários entre o aplicativo web e o servidor, permitindo o armazenamento em cache, notificações push e outras funcionalidades offline.

2- Quais são as vantagens de usar Service Workers com React?
Ao usar Service Workers com React, você pode melhorar significativamente o desempenho do seu aplicativo, permitindo que ele funcione offline e forneça respostas mais rápidas aos usuários. Isso ajuda a reduzir a dependência do servidor e proporciona uma experiência mais confiável, especialmente em conexões de internet instáveis.

3- Os Service Workers são suportados em todos os navegadores?
Não, os Service Workers não são suportados em todos os navegadores. No entanto, a maioria dos navegadores modernos, como Google Chrome, Mozilla Firefox, Microsoft Edge e Safari, oferece suporte aos Service Workers. É importante verificar a compatibilidade com os navegadores que você deseja suportar antes de implementá-los em seu aplicativo React.

4- Como habilitar o uso de Service Workers em um aplicativo React?
Para habilitar o uso de Service Workers em um aplicativo React, você pode utilizar a biblioteca "sw-precache" ou "workbox". Essas bibliotecas facilitam a configuração e gerenciamento dos Service Workers, permitindo o armazenamento em cache de arquivos estáticos, como CSS, JavaScript e imagens, para que o aplicativo funcione offline.

5- Quais são as etapas para implementar um Service Worker com React?
As etapas básicas para implementar um Service Worker em um aplicativo React são as seguintes:

  • Criar um arquivo de Service Worker (por exemplo, service-worker.js) na raiz do projeto.
  • Registrar o Service Worker no arquivo JavaScript principal do aplicativo (por exemplo, index.js).
  • Definir os eventos de ciclo de vida do Service Worker, como instalação e ativação.
  • Configurar o armazenamento em cache dos arquivos estáticos do aplicativo.
  • Lidar com eventos fetch para gerenciar as solicitações de rede.

6- Quais precauções devo tomar ao usar Service Workers com React?
Ao usar Service Workers com React, é essencial ter cuidado com o gerenciamento de cache e atualizações. Certifique-se de que os arquivos em cache são atualizados corretamente quando você lançar uma nova versão do aplicativo, para que os usuários recebam sempre a versão mais recente. Além disso, verifique se o Service Worker é desativado quando não é mais necessário para evitar problemas de cache obsoletos.

7- Os Service Workers funcionam apenas em aplicativos hospedados em um servidor HTTPS?
Sim, os Service Workers funcionam apenas em aplicativos hospedados em um servidor HTTPS. Isso é uma medida de segurança para evitar ataques de interceptação de solicitações e garantir a integridade dos Service Workers.

8- É possível depurar os Service Workers no meu aplicativo React?
Sim, é possível depurar os Service Workers em seu aplicativo React. Os navegadores oferecem ferramentas de desenvolvedor que permitem inspecionar e depurar o comportamento dos Service Workers, ajudando você a identificar problemas e melhorar o desempenho.

9- Os Service Workers substituem o uso de cache do navegador?
Os Service Workers não substituem o uso de cache do navegador, mas trabalham em conjunto com ele. Eles oferecem mais controle sobre o armazenamento em cache e permitem recursos offline e notificações push, tornando a experiência do usuário mais fluida e eficiente.

10- É possível utilizar notificações push em um aplicativo React com Service Workers?
Sim, é possível utilizar notificações push em um aplicativo React com Service Workers. Os Service Workers permitem a exibição de notificações push mesmo quando o aplicativo não está aberto, proporcionando uma forma eficaz de engajar os usuários com seu aplicativo.