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:
- Install: Quando o Service Worker é instalado, ele armazena arquivos importantes no cache (como um assistente guardando seus documentos)
- 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
- 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.”