DEV Community

Lucas Pereira de Souza
Lucas Pereira de Souza

Posted on

Manifest e service workers em PWA

logotech

## Tornando seu Web App Incrível: Manifest, Service Workers e Cache na Prática

Se você quer que seu web app se destaque, proporcionando uma experiência de usuário suave e confiável, mesmo em condições de rede desfavoráveis, você precisa dominar três pilares fundamentais: Web App Manifest, Service Workers e Cache. Vamos mergulhar em cada um deles, com exemplos práticos para você implementar agora mesmo!

1. Web App Manifest: Dando uma Identidade ao seu App

O Web App Manifest é um arquivo JSON que fornece informações sobre seu web app, como nome, ícones, cores de tema e configurações de inicialização. Ele é essencial para transformar seu site em algo que se parece e se comporta como um aplicativo nativo.

  • Criando o Manifest:

    Crie um arquivo chamado manifest.json na raiz do seu projeto (ou em uma pasta específica, se preferir). Adicione as seguintes propriedades (e personalize-as!):

    {
      \"name\": \"Meu Web App\",
      \"short_name\": \"Meu App\",
      \"description\": \"Um web app incrível para...\",
      \"start_url\": \"/\",
      \"display\": \"standalone\",
      \"background_color\": \"#ffffff\",
      \"theme_color\": \"#3367D6\",
      \"icons\": [
        {
          \"src\": \"images/icon-192x192.png\",
          \"sizes\": \"192x192\",
          \"type\": \"image/png\"
        },
        {
          \"src\": \"images/icon-512x512.png\",
          \"sizes\": \"512x512\",
          \"type\": \"image/png\"
        }
      ]
    }
    
    • name: Nome completo do seu app.
    • short_name: Nome abreviado (usado em telas menores).
    • description: Uma breve descrição.
    • start_url: URL de inicialização do app.
    • display: Define como o app é exibido (standalone, fullscreen, minimal-ui, etc.). standalone é o mais comum, abrindo o app em uma janela separada, sem a barra de endereço do navegador.
    • background_color: Cor de fundo da tela de splash (antes do app carregar).
    • theme_color: Cor da barra de status do app.
    • icons: Array de ícones para diferentes tamanhos e dispositivos.
  • Linkando no HTML:

    No seu arquivo HTML, adicione a seguinte tag <link> no <head> para vincular o manifest:

    <link rel=\"manifest\" href=\"/manifest.json">
    

    Certifique-se de que o caminho para o arquivo manifest.json está correto.

2. Service Workers: O Poder do Offline

Service Workers são scripts JavaScript que seu navegador executa em segundo plano, independentemente do seu site estar aberto. Eles permitem recursos incríveis, como cache, notificações push e sincronização em segundo plano.

  • Registrando o Service Worker:

    Crie um arquivo JavaScript, por exemplo, sw.js (ou outro nome que você preferir), na raiz do seu projeto. Este será o seu service worker.

    No seu arquivo JavaScript principal (aquele que contém o seu código principal do site), registre o service worker:

    if ('serviceWorker' in navigator) {
      window.addEventListener('load', () => {
        navigator.serviceWorker.register('/sw.js')
          .then(registration => {
            console.log('Service Worker registrado com sucesso:', registration);
          })
          .catch(error => {
            console.log('Falha ao registrar o Service Worker:', error);
          });
      });
    }
    
    • navigator.serviceWorker.register('/sw.js'): Registra o service worker. O navegador fará o download e executará o arquivo sw.js.
  • Cache na Prática:

    Dentro do seu arquivo sw.js, você pode configurar o cache. O ciclo de vida de um Service Worker é baseado em eventos. O evento install ocorre quando o service worker é instalado pela primeira vez. O evento fetch ocorre cada vez que o navegador faz uma requisição para um recurso (HTML, CSS, JavaScript, imagens, etc.).

    const CACHE_NAME = 'meu-web-app-cache-v1'; // Use versionamento para atualizar o cache
    const urlsToCache = [
      '/',
      '/index.html',
      '/styles.css',
      '/script.js',
      '/images/icon-192x192.png',
      '/images/icon-512x512.png'
    ];
    
    self.addEventListener('install', event => {
      event.waitUntil(
        caches.open(CACHE_NAME)
          .then(cache => {
            console.log('Cache aberto');
            return cache.addAll(urlsToCache);
          })
      );
    });
    
    self.addEventListener('fetch', event => {
      event.respondWith(
        caches.match(event.request)
          .then(response => {
            // Se encontrar no cache, retorna a resposta do cache
            if (response) {
              console.log('Recuperado do cache:', event.request.url);
              return response;
            }
            // Se não estiver no cache, faz a requisição à rede
            return fetch(event.request)
              .then(response => {
                // Clona a resposta para que possamos usar no cache e retorná-la
                const responseToCache = response.clone();
                caches.open(CACHE_NAME)
                  .then(cache => {
                    cache.put(event.request, responseToCache);
                  });
                return response;
              });
          })
      );
    });
    
    self.addEventListener('activate', event => {
      // Limpar caches antigos (versões anteriores)
      event.waitUntil(
        caches.keys().then(cacheNames => {
          return Promise.all(
            cacheNames.map(cacheName => {
              if (cacheName !== CACHE_NAME) {
                console.log('Limpando cache antigo:', cacheName);
                return caches.delete(cacheName);
              }
            })
          );
        })
      );
    });
    
    • CACHE_NAME: Nome do cache. É crucial que você versioná-lo. Quando você fizer alterações nos arquivos que serão cacheados, aumente a versão (por exemplo, meu-web-app-cache-v2). O service worker vai instalar uma nova versão do cache e, no evento activate, vai remover os caches antigos.
    • urlsToCache: Array de URLs que você quer armazenar no cache.
    • self.addEventListener('install'): Ocorre quando o service worker é instalado. Usamos caches.open() para abrir ou criar o cache e cache.addAll() para adicionar os recursos ao cache.
    • self.addEventListener('fetch'): Ocorre quando o navegador faz uma requisição. Primeiro, tentamos encontrar a requisição no cache (caches.match()). Se encontrar, retornamos a resposta do cache. Caso contrário, fazemos a requisição à rede (fetch()). Depois, clonamos a resposta (pois ela só pode ser lida uma vez) e a adicionamos ao cache para uso futuro.
    • self.addEventListener('activate'): Ocorre quando o service worker é ativado. É aqui que você pode limpar caches antigos, garantindo que apenas a versão mais recente do seu cache seja usada.

3. Atualizando o Service Worker

Quando você fizer alterações no seu service worker ou nos arquivos que ele armazena em cache, a atualização acontece em algumas etapas:

  1. Mudança no Código: Faça as alterações no seu arquivo sw.js e/ou nos seus arquivos estáticos (HTML, CSS, JavaScript, imagens).
  2. Atualização no Navegador: O navegador detectará as mudanças e tentará reinstalar o service worker. Ele verificará se há uma nova versão do arquivo sw.js.
  3. Instalação da Nova Versão: O novo service worker é instalado, mas o antigo continua a atender as requisições até que todas as abas do seu site sejam fechadas ou recarregadas.
  4. Ativação: Quando o novo service worker estiver pronto e o antigo não estiver mais em uso, o evento activate é disparado no novo service worker. É nesse momento que você pode limpar os caches antigos.

Dicas Extras:

  • Teste em Modo Incógnito/Privado: Use o modo incógnito para testar o comportamento do seu service worker, pois ele pode ser mais fácil de depurar do que cachear dados em outros navegadores.
  • Ferramentas de Debug: Use as ferramentas de desenvolvedor do seu navegador (geralmente acessíveis com F12) para inspecionar o status do service worker, ver as requisições, analisar o cache e depurar erros.
  • Considere o Workbox: O Workbox é uma biblioteca do Google que simplifica a criação e o gerenciamento de service workers. Ele oferece recursos como estratégias de cache predefinidas, gerenciamento de atualizações e muito mais.

Ao implementar o Web App Manifest, Service Workers e Cache, você estará no caminho certo para criar web apps que oferecem uma experiência de usuário de alta qualidade, mesmo em condições adversas. Comece a implementar essas técnicas hoje mesmo e veja a diferença que elas fazem no seu projeto!

Top comments (0)