SkillsTecnológicas
Menu
Front-end

Progressive Web Apps (PWA): Guia Prático em 2026

Entenda Progressive Web Apps (PWA): manifest, service worker, instalação, cache offline, atualizações, segurança e quando usar em projetos web.

Marcos RodriguesPublicado em 21 de junho de 2024Atualizado em 18 de agosto de 202615 min de leitura
Aplicação web instalada e sincronizada entre computador, tablet e celular

Progressive Web Apps (PWA) são aplicações construídas com tecnologias da web que podem oferecer recursos associados a apps instalados: ícone no dispositivo, janela independente, carregamento resiliente, funcionamento parcial sem conexão e integração com capacidades do sistema quando o navegador permite.

Uma PWA continua sendo acessada por URL e deve funcionar como site antes de qualquer instalação. Manifest, service worker e APIs do navegador acrescentam capacidades progressivamente.

Isso evita a ideia equivocada de que basta “converter o site em aplicativo” ou adicionar um único arquivo para obter uma boa experiência.

Neste guia, você entenderá quando uma PWA faz sentido, como manifest e service worker se conectam, quais estratégias de cache usar, como tratar instalação e atualização e como construir um exemplo básico sem esconder limitações de compatibilidade, segurança e manutenção.

O que são Progressive Web Apps?

Uma Progressive Web App é uma aplicação web que adota melhorias progressivas para entregar uma experiência mais próxima de um aplicativo instalado.

Ela usa HTML, CSS e JavaScript, continua vinculável e acessível por URL e pode aproveitar recursos como manifest, service worker, cache, instalação e notificações conforme o suporte da plataforma.

PWA não é uma linguagem, um framework ou um pacote específico. É uma estratégia de produto e engenharia.

React, Vue, Angular, Next.js ou JavaScript sem framework podem participar do projeto, mas nenhum deles transforma automaticamente uma página em PWA.

Para entender a base por trás dessas ferramentas, consulte o guia de linguagem JavaScript.

Também não existe uma experiência idêntica em todos os navegadores e sistemas. Instalação, push, integração com o sistema e APIs de hardware variam.

O princípio progressivo exige uma base útil para qualquer visitante e melhorias somente quando os recursos estão disponíveis.

O que torna uma aplicação progressiva?

Uma boa PWA costuma reunir três qualidades: ser confiável em condições de rede instáveis, oferecer uma interface capaz e coerente com o dispositivo e permitir instalação quando a plataforma suporta.

Essas qualidades são resultado de várias decisões, não de um selo único.

  • Base web funcional: navegação por URL, HTML significativo e conteúdo útil sem depender da instalação.
  • Design responsivo: interface adaptável a telas, orientações, zoom e métodos de entrada diferentes.
  • Conexão segura: HTTPS em produção para proteger conteúdo e habilitar APIs poderosas.
  • Identidade instalável: manifest com nome, ícones, URL inicial, escopo e modo de exibição coerentes.
  • Resiliência: estratégia explícita para falhas de rede, cache, reenvio e mensagens de estado.
  • Atualização segura: controle do ciclo de vida do service worker e de versões incompatíveis.
  • Integração progressiva: recursos avançados tratados como melhoria, nunca como única forma de concluir uma tarefa.

Instalar não deve ser o objetivo isolado. Se o app demora, perde dados, bloqueia navegação offline sem explicação ou solicita permissões cedo demais, o ícone na tela inicial não compensa a experiência ruim.

PWA, site responsivo ou aplicativo nativo?

AlternativaDistribuiçãoIntegração com dispositivoManutençãoQuando se destaca
Site responsivoURL e navegadorBásica a moderadaUma base webConteúdo, aquisição e acesso imediato
PWAURL, instalação pelo navegador e opções de empacotamentoModerada, variável por plataformaBase web com camadas de PWAUso recorrente, resiliência e alcance multiplataforma
App nativoLojas e pacotes por plataformaAmpla e profundaBases específicas ou framework multiplataformaHardware avançado, tarefas intensivas e integração máxima

Um site responsivo pode ser excelente sem ser instalável. Uma PWA adiciona capacidades quando elas resolvem problemas reais.

Um app nativo continua adequado quando o produto exige APIs, desempenho, processamento em segundo plano ou integração que a web não oferece de maneira consistente.

A escolha depende de público, jornadas críticas, orçamento, canais de descoberta e recursos do dispositivo.

O guia de desenvolvimento mobile ajuda a comparar caminhos, enquanto o artigo sobre o framework Ionic apresenta outra estratégia baseada em tecnologias web.

Arquitetura básica de uma PWA

A interface roda na página como qualquer aplicação web. O manifest descreve identidade e preferências de apresentação.

Um service worker executa separadamente, sem acesso direto ao DOM, e pode interceptar requisições dentro de seu escopo. Cache Storage guarda respostas HTTP; IndexedDB pode armazenar dados estruturados no cliente.

Quando a aplicação solicita um recurso, o service worker pode consultar a rede, o cache ou combinar os dois. A decisão depende do tipo de recurso e da necessidade de atualização.

Arquivos versionados toleram cache longo; saldo, estoque, sessão e informações personalizadas exigem políticas mais cuidadosas.

Service workers estão disponíveis em contextos seguros: normalmente HTTPS, com exceção de ambientes locais tratados como seguros para desenvolvimento.

A referência da Service Worker API também destaca sua execução assíncrona e separada da thread principal.

Fluxo entre aplicação web, service worker, cache local e servidor remoto
O service worker intercepta requisições e decide quando responder pelo cache local ou consultar a rede.

Web App Manifest: identidade e instalação

O Web App Manifest é um arquivo JSON com informações que navegadores podem usar para apresentar e instalar a aplicação.

A especificação do W3C define o formato, embora suporte e critérios de uso continuem sob decisão dos navegadores.

{
  "id": "/",
  "name": "Minha Aplicação Web",
  "short_name": "Minha App",
  "start_url": "/?origem=pwa",
  "scope": "/",
  "display": "standalone",
  "background_color": "#0f172a",
  "theme_color": "#2563eb",
  "icons": [
    {
      "src": "/icons/app-192.png",
      "sizes": "192x192",
      "type": "image/png",
      "purpose": "any"
    },
    {
      "src": "/icons/app-512.png",
      "sizes": "512x512",
      "type": "image/png",
      "purpose": "maskable"
    }
  ]
}

id ajuda a manter a identidade estável; start_url define a abertura; scope limita a navegação considerada parte da aplicação; e display: standalone solicita uma janela semelhante à de app.

Ícones devem ser reais, legíveis em fundos variados e servidos com tipo correto.

A documentação sobre Web App Manifest mantém a lista atual de membros.

<link rel="manifest" href="/app.webmanifest">
<meta name="theme-color" content="#2563eb">

O servidor deve retornar o manifest com um tipo de conteúdo adequado. Também verifique se start_url está dentro de scope, se todas as URLs são acessíveis e se mudanças futuras não criam uma segunda identidade para usuários que já instalaram o app.

Service worker: ciclo de vida e responsabilidades

O service worker passa por instalação, espera e ativação. Uma nova versão pode ser instalada enquanto a anterior ainda controla abas abertas.

Esse comportamento protege sessões em andamento, mas exige um plano para avisar o usuário e ativar atualizações sem misturar arquivos incompatíveis.

  • Install: prepara recursos necessários e falha de forma controlada se o shell essencial não puder ser armazenado.
  • Waiting: aguarda a versão anterior deixar de controlar clientes, salvo estratégia explícita.
  • Activate: remove caches obsoletos e assume clientes conforme a política escolhida.
  • Fetch: observa requisições dentro do escopo e aplica a estratégia apropriada.

Não coloque toda a lógica de negócio no service worker. Ele pode ser encerrado quando o navegador decide, não mantém estado global confiável e possui limitações próprias.

Operações duráveis devem usar armazenamento adequado e ser projetadas para repetição sem duplicar efeitos.

Estratégias de cache para PWA

Não existe uma única estratégia ideal para todas as requisições:

  • Cache first: responde pelo cache e consulta a rede somente quando necessário. Funciona bem para arquivos estáticos versionados.
  • Network first: tenta dados atuais e usa cache em falhas. É útil para páginas e informações que precisam de frescor com fallback.
  • Stale while revalidate: entrega rapidamente uma versão armazenada e atualiza em segundo plano para a próxima visita.
  • Network only: adequado a operações que não podem usar resposta antiga, como certas gravações e autenticações.
  • Cache only: reservado a recursos previamente garantidos e imutáveis dentro daquela versão.

Separe recursos públicos de conteúdo autenticado. Não armazene respostas sensíveis apenas porque a API usa GET.

Defina limites, invalidação, versionamento e comportamento quando o armazenamento estiver cheio.

O cache é uma política de produto e segurança, não apenas uma otimização.

Offline não é apenas abrir uma tela

Exibir o shell sem internet é o nível mais simples. Uma experiência offline útil precisa responder: quais dados podem ser lidos, quais ações podem ser realizadas, onde alterações ficam armazenadas, como conflitos serão resolvidos e o que acontece se a autenticação expirar.

Uma tarefa criada offline pode receber um identificador local, entrar em uma fila e ser enviada quando a rede retornar.

O servidor deve aceitar repetição segura ou detectar duplicidade. Se o mesmo registro mudou em outro dispositivo, a aplicação precisa de uma política: última alteração, merge por campo, versão esperada ou decisão do usuário.

A interface deve mostrar estado pendente, sincronizado ou com erro. Nunca dê confirmação definitiva antes de uma gravação que ainda depende da rede.

Esse cuidado evita que “funciona offline” se transforme em perda silenciosa de dados.

Aplicação móvel armazenando alterações offline e sincronizando com a nuvem quando a conexão retorna
Uma experiência offline precisa deixar o estado claro, guardar alterações com segurança e reconciliá-las quando a conexão voltar.

Como funciona a instalação de uma PWA

O navegador e o sistema operacional decidem se e como oferecem instalação. Manifest válido, contexto seguro e uma experiência adequada participam do processo, mas critérios e interface variam.

Alguns ambientes exibem botão na barra; outros dependem do menu de compartilhamento ou de ações do navegador.

Em navegadores baseados em Chromium, beforeinstallprompt pode permitir uma interface própria.

O evento não é padrão e não funciona em todos os navegadores, portanto o botão deve ficar oculto até que o evento exista:

let conviteInstalacao;
const botao = document.querySelector("[data-instalar]");

window.addEventListener("beforeinstallprompt", (evento) => {
  evento.preventDefault();
  conviteInstalacao = evento;
  botao.hidden = false;
});

botao.addEventListener("click", async () => {
  if (!conviteInstalacao) return;

  await conviteInstalacao.prompt();
  conviteInstalacao = undefined;
  botao.hidden = true;
});

A orientação da MDN para tornar PWAs instaláveis destaca essas diferenças, inclusive a ausência desse evento em iOS.

Ofereça instruções específicas apenas depois de detectar a plataforma e explique o benefício antes de pedir instalação.

Atualizações e versionamento do service worker

Um erro comum é publicar JavaScript novo enquanto HTML antigo permanece em cache, ou ativar um service worker que depende de estruturas incompatíveis.

Use nomes de cache versionados, arquivos com hash no build e uma fronteira clara entre shell e dados.

Quando uma versão entra em espera, o app pode informar “há uma atualização disponível” e recarregar depois da confirmação.

Ativar imediatamente com skipWaiting() pode ser apropriado em alguns produtos, mas também pode colocar a nova lógica no controle de páginas carregadas com arquivos antigos.

Decida conscientemente e teste abas múltiplas.

Migrações de IndexedDB também precisam ser compatíveis. Nunca remova dados locais apenas para resolver um cache quebrado.

Telemetria de versões, erros de instalação e falhas de fetch ajuda a detectar usuários presos em builds antigos.

Notificações push com responsabilidade

Push não é requisito para uma PWA. Quando usado, precisa de permissão explícita, proposta de valor clara e controles para frequência e categorias.

Pedir permissão na primeira visita, sem contexto, aumenta rejeição e pode bloquear futuras solicitações.

  • Solicite após uma ação que demonstre interesse, como acompanhar um pedido ou ativar um alerta.
  • Explique que tipo de mensagem será enviada e com qual frequência.
  • Permita cancelar a assinatura dentro da aplicação.
  • Não inclua dados sensíveis no texto visível da notificação.
  • Trate tokens expirados e remova inscrições inválidas no servidor.
  • Planeje a experiência equivalente quando push não estiver disponível.

Notificações irrelevantes prejudicam confiança e retenção. A capacidade técnica não substitui consentimento nem uma política de comunicação.

Segurança e privacidade

Como o service worker pode interceptar tráfego dentro do escopo, HTTPS é obrigatório em produção.

Mas transporte seguro não resolve tudo: XSS, dependências comprometidas, permissões excessivas e dados sensíveis em armazenamento local continuam sendo riscos.

  • Defina Content Security Policy compatível com o aplicativo.
  • Evite armazenar tokens de longa duração em locais acessíveis a JavaScript sem avaliar o risco.
  • Não coloque dados privados em caches compartilhados por engano.
  • Valide entradas no cliente e novamente no servidor.
  • Revise o escopo do service worker; registrá-lo na raiz dá controle amplo.
  • Atualize dependências e limite scripts de terceiros.
  • Explique permissões e colete apenas o necessário.

Em sessões autenticadas, defina o que acontece no logout: caches, filas pendentes e dados locais daquele usuário precisam ser tratados sem apagar informações de outra conta nem deixar conteúdo privado acessível.

Performance e acessibilidade continuam essenciais

Instalação não corrige JavaScript pesado, imagens grandes ou interface instável. O primeiro acesso ainda depende da rede, e muitos usuários decidirão se confiam no produto antes de instalar.

Monitore carregamento, resposta a interações e estabilidade visual com métricas reais; o guia de Core Web Vitals mostra por onde começar.

Use HTML semântico, foco visível, nomes acessíveis, contraste, suporte a teclado, zoom e preferências de movimento.

Uma janela standalone remove parte da interface do navegador, então navegação, retorno, títulos e estados precisam estar claros dentro do app.

Veja também os primeiros passos de acessibilidade web e o artigo sobre HTML semântico.

Projeto prático: PWA mínima com fallback offline

Além do manifest apresentado anteriormente, registre o service worker no JavaScript principal:

if ("serviceWorker" in navigator) {
  window.addEventListener("load", async () => {
    try {
      await navigator.serviceWorker.register("/sw.js", { scope: "/" });
    } catch (erro) {
      console.error("Falha ao registrar service worker", erro);
    }
  });
}

Em sw.js, armazene apenas o shell essencial e use network first para navegação, com uma página offline como fallback:

const CACHE = "app-shell-v1";
const SHELL = ["/", "/offline.html", "/styles.css", "/app.js"];

self.addEventListener("install", (evento) => {
  evento.waitUntil(caches.open(CACHE).then((cache) => cache.addAll(SHELL)));
});

self.addEventListener("activate", (evento) => {
  evento.waitUntil(
    caches.keys().then((nomes) =>
      Promise.all(
        nomes.filter((nome) => nome !== CACHE).map((nome) => caches.delete(nome))
      )
    )
  );
});

self.addEventListener("fetch", (evento) => {
  if (evento.request.mode !== "navigate") return;

  evento.respondWith(
    fetch(evento.request).catch(async () => {
      const cache = await caches.open(CACHE);
      return cache.match("/offline.html");
    })
  );
});

Esse exemplo não transforma APIs em offline e não guarda dados do usuário. Ele demonstra uma fronteira segura: navegação tenta rede e apresenta fallback quando falha. Antes de expandir, defina requisitos por rota e tipo de dado.

Em projetos com build, bibliotecas especializadas podem gerar service workers, mas a equipe ainda precisa compreender as estratégias produzidas.

Você pode transformar esse exemplo em projeto de portfólio adicionando uma lista local, estado de sincronização e testes de atualização. Nosso artigo com projetos frontend para praticar oferece ideias complementares.

Como testar uma PWA

  1. Valide o manifest, ícones, MIME type, start URL, escopo e identidade.
  2. Confirme registro, versão e controle do service worker nas ferramentas do navegador.
  3. Teste primeira visita, retorno, recarga e navegação com rede rápida, lenta e ausente.
  4. Atualize o service worker com duas abas abertas e observe espera, ativação e recarga.
  5. Teste sessão, logout, troca de conta e limpeza seletiva de dados.
  6. Simule falhas da API, respostas antigas e armazenamento indisponível.
  7. Verifique instalação e desinstalação em navegadores e sistemas realmente usados pelo público.
  8. Use teclado, leitor de tela, zoom e conteúdo maior que o previsto.
  9. Meça performance em dispositivo real, não apenas em desktop potente.

Ferramentas automáticas ajudam a encontrar problemas, mas não comprovam que uma operação offline preserva dados ou que uma atualização não quebra sessões.

Os fluxos críticos precisam de testes manuais e automatizados orientados ao produto.

Quando uma PWA faz sentido

PWA costuma fazer sentido quando o produto já é web, tem uso recorrente, precisa reduzir atrito de acesso, atende redes instáveis ou se beneficia de instalação sem manter imediatamente duas bases nativas.

Catálogos, sistemas de campo, portais, listas, conteúdo recorrente e ferramentas internas podem ganhar bastante com resiliência.

Talvez não seja suficiente quando a experiência depende de APIs exclusivas, execução intensa e contínua em segundo plano, gráficos muito exigentes, integração profunda com hardware ou presença obrigatória em canais específicos de loja.

Também pode ser excesso para um site institucional visitado poucas vezes e sem tarefas recorrentes.

Faça um protótipo da jornada mais difícil e teste nos dispositivos do público antes de assumir que uma API funciona igualmente. A decisão deve comparar custo total, aquisição, retenção e capacidades, não apenas velocidade de desenvolvimento.

Erros comuns em projetos PWA

  • Confundir responsividade com PWA: layout adaptável é requisito de experiência, mas não adiciona instalação ou resiliência sozinho.
  • Guardar tudo em cache: dados sensíveis, dinâmicos e autenticados exigem políticas específicas.
  • Não versionar o app shell: arquivos de épocas diferentes podem criar erros difíceis de reproduzir.
  • Forçar atualização imediata: uma nova versão pode controlar uma página ainda carregada com código antigo.
  • Prometer offline completo: informe quais ações funcionam e quais aguardam conexão.
  • Pedir push na primeira visita: solicite permissão depois de contexto e intenção.
  • Exibir botão de instalação sempre: a possibilidade e o fluxo variam por navegador.
  • Ignorar acessibilidade em standalone: o app continua precisando de navegação, foco, títulos e retorno claros.
  • Testar apenas em um navegador: capacidades progressivas exigem fallbacks reais.

Checklist para produção

  • HTTPS ativo e sem conteúdo misto.
  • Manifest acessível, válido e ligado em todas as páginas relevantes.
  • Identidade, start URL, scope, display, cores e ícones revisados.
  • Service worker registrado no escopo planejado.
  • Estratégia de cache definida por categoria de recurso.
  • Fallback offline honesto e útil.
  • Filas e conflitos documentados para gravações offline.
  • Atualização testada com várias abas e versões.
  • Logout remove ou isola dados privados corretamente.
  • Instalação e push tratados como capacidades opcionais.
  • Fluxos essenciais acessíveis por teclado e tecnologias assistivas.
  • Monitoramento de erros, versões e falhas de sincronização.

Perguntas frequentes sobre PWA

PWA funciona em qualquer navegador?

A aplicação web básica deve funcionar amplamente, mas instalação, push e APIs avançadas variam por navegador e sistema. Use detecção de capacidade e mantenha caminhos alternativos.

Uma PWA precisa funcionar totalmente offline?

Não necessariamente. O comportamento deve refletir o produto: algumas PWAs oferecem apenas shell e conteúdo recente; outras permitem criar e editar dados offline. O essencial é definir limites e comunicá-los claramente.

PWA pode ser publicada em lojas?

Existem caminhos de empacotamento e distribuição para algumas lojas e plataformas, mas políticas, formatos e recursos variam. Avalie os requisitos atuais de cada canal antes de planejar a publicação.

PWA substitui aplicativos nativos?

Em determinados produtos, sim; em outros, não. Se as jornadas dependem principalmente de interface, rede, cache e recursos web disponíveis, PWA pode atender bem. Integrações profundas e capacidades exclusivas ainda podem exigir solução nativa.

Conclusão

Progressive Web Apps combinam o alcance da web com capacidades instaláveis e resilientes, mas seu valor nasce de decisões bem executadas.

Manifest cuida da identidade e apresentação; service worker controla requisições e cache; armazenamento local sustenta dados; e a interface precisa comunicar conexão, sincronização e atualização.

Comece pequeno: entregue uma aplicação web rápida e acessível, adicione manifest, implemente fallback offline para uma jornada clara e teste atualização em dispositivos reais.

Só depois avance para gravações offline, push e integrações adicionais. Assim, “progressive” deixa de ser apenas parte do nome e se torna a forma responsável de evoluir o produto.