HomeSharpStack
offline-first5 min

Introdução aos Service Workers: Seu Assistente Offline

Introdução aos Service Workers: Seu Assistente Offline

Imagine que você tem um assistente pessoal que fica entre você e o mundo exterior. Quando você pede algo, esse assistente primeiro verifica se ele já tem a resposta guardada. Se tiver, ele te dá a resposta imediatamente. Se não tiver, ele sai para buscar no mundo exterior. Esse é exatamente o papel de um Service Worker em uma aplicação web.

O que é um Service Worker?

Um Service Worker é um script JavaScript que funciona como intermediário entre sua aplicação web e a rede. Ele roda em segundo plano, mesmo quando você fecha a aba do navegador, permitindo que sua aplicação funcione offline e sincronize dados quando a conexão retorna.

Pense em um Service Worker como um porteiro inteligente: ele intercepta todas as requisições que sua aplicação faz, decide se deve usar dados em cache (armazenados localmente) ou buscar dados frescos da internet.

Por que Service Workers são Importantes?

Em aplicações offline-first, Service Workers são essenciais porque:

  • Funcionamento Offline: Sua aplicação continua funcionando mesmo sem internet
  • Sincronização em Segundo Plano: Dados são sincronizados automaticamente quando a conexão retorna
  • Performance: Conteúdo em cache carrega instantaneamente
  • Confiabilidade: Experiência consistente independente da qualidade da conexão

Como Registrar um Service Worker

Primeiro, você precisa registrar o Service Worker em sua aplicação principal. Aqui está um exemplo simples:

// main.js - Seu arquivo principal
if ('serviceWorker' in navigator) {
  navigator.serviceWorker.register('/service-worker.js')
    .then(registration => {
      console.log('Service Worker registrado com sucesso!');
    })
    .catch(error => {
      console.log('Erro ao registrar Service Worker:', error);
    });
}

Esse código verifica se o navegador suporta Service Workers e, se suportar, registra o arquivo service-worker.js.

Criando um Service Worker Básico

Agora vamos criar o arquivo do Service Worker que fará o trabalho pesado:

// service-worker.js
const CACHE_NAME = 'meu-cache-v1';
const urlsParaCache = [
  '/',
  '/index.html',
  '/styles.css',
  '/app.js'
];

// Evento: quando o Service Worker é instalado
self.addEventListener('install', event => {
  event.waitUntil(
    caches.open(CACHE_NAME).then(cache => {
      return cache.addAll(urlsParaCache);
    })
  );
});

// Evento: intercepta requisições
self.addEventListener('fetch', event => {
  event.respondWith(
    caches.match(event.request).then(response => {
      // Se encontrou no cache, retorna
      if (response) return response;
      // Senão, busca da rede
      return fetch(event.request);
    })
  );
});

Entendendo o Fluxo

Vamos quebrar o que acontece:

  1. Install: Quando o Service Worker é instalado, ele armazena arquivos importantes no cache (como um assistente guardando seus documentos)
  2. Fetch: Quando sua aplicação faz uma requisição, o Service Worker intercepta. Ele primeiro procura no cache. Se encontrar, retorna imediatamente. Se não encontrar, busca da rede
  3. Activate: O Service Worker ativa e começa a trabalhar

Estratégia: Cache First vs Network First

Existem diferentes estratégias para decidir quando usar cache ou rede:

Cache First (Cache, falling back to network): Tenta o cache primeiro. Se não encontrar, busca da rede. Ideal para arquivos estáticos que não mudam frequentemente.

Network First (Network, falling back to cache): Tenta a rede primeiro para dados frescos. Se falhar, usa o cache. Ideal para dados dinâmicos.

// Exemplo: Network First para dados da API
self.addEventListener('fetch', event => {
  if (event.request.url.includes('/api/')) {
    event.respondWith(
      fetch(event.request)
        .then(response => response)
        .catch(() => caches.match(event.request))
    );
  }
});

Sincronização em Segundo Plano

Um dos superpoderes do Service Worker é a sincronização em segundo plano. Quando o usuário está offline e faz uma ação (como enviar um formulário), o Service Worker pode armazenar essa ação e sincronizar quando a conexão retorna:

// Quando a conexão volta, sincroniza dados
self.addEventListener('sync', event => {
  if (event.tag === 'sincronizar-dados') {
    event.waitUntil(
      // Aqui você envia dados armazenados para o servidor
      fetch('/api/sincronizar', { method: 'POST' })
    );
  }
});

Conclusão

Service Workers são a base da experiência offline-first moderna. Eles transformam aplicações web frágeis em aplicações robustas que funcionam em qualquer condição de conectividade. Comece simples com cache estático e evolua para estratégias mais sofisticadas conforme sua aplicação cresce.

Key Takeaways

  • Service Workers atuam como intermediários entre sua aplicação e a rede, interceptando requisições e decidindo se devem usar dados em cache ou buscar da internet
  • A estratégia de cache (Cache First vs Network First) determina como seu aplicativo se comporta offline, sendo essencial escolher a correta para cada tipo de dado
  • Service Workers permitem sincronização em segundo plano, garantindo que dados sejam enviados ao servidor assim que a conexão retorna, criando uma experiência offline-first verdadeira

Enjoyed this reading?

SharpStack delivers personalized tech readings every day, calibrated to your skill level. 5 minutes a day to stay sharp.

“Stay sharp. At your pace. Everyday.”