Frontends com Vibecoding · Capítulo 29 de 30 · 9 min
Construir um aplicativo instalável e resiliente
Você sai com uma entrega que integra manifesto, cache, rede indisponível e atualização.
Este capítulo faz parte do curso gratuito Frontends com Vibecoding. Para marcar como concluído e salvar o progresso, abra este capítulo na página do curso.
Três peças, na ordem certa, transformam um site em aplicativo instalável, sem loja nem segundo projeto: conexão segura, processo de fundo e ficha de instalação. Sem as três juntas, o navegador não oferece a instalação, e o atalho instalado não abre sem rede.
Quem opera terminal e agente (o assistente de código que executa o pedido) decide como o site chega ao celular do cliente. A ordem das peças, a estratégia de cache por arquivo, os ajustes contra o botão cortado e o banco local para quem edita sem rede seguem dessa escolha.
PWA (aplicativo web progressivo, o site que se instala como app) nasce dessa ordem de dependência. A conexão segura, HTTPS, vem primeiro: sem ela, a peça seguinte nem é registrada.
O service worker (o processo de segundo plano, entre a tela e a rede) decide a cada pedido: servir o guardado ou buscar de novo. A ficha de instalação, o manifesto com nome, ícones e cores, fecha a ordem e faz o navegador oferecer a instalação. Fora dela, a ficha sozinha instala um atalho que não abre sem rede.
Ir para a loja só compensa com dois gatilhos: recurso pesado do aparelho, como câmera, sensores ou biometria, ou posicionamento comercial que depende da loja. Fora deles, instalar pela web mantém um código só para web, Android e iPhone. Antecipar a loja sem gatilho troca publicação em segundos por aprovação de terceiro e dois pacotes a manter.
A instalação, porém, não é igual nos dois lados. No Chrome para Android o navegador oferece a instalação pela própria interface, e o evento beforeinstallprompt permite montar o convite dentro do site.
No iPhone e no iPad não existe convite automático. Desde 2018 a instalação sai do menu de compartilhamento, na opção Adicionar à Tela de Início, e o site precisa dizer isso em texto.
O aviso de notificação depende da mesma escolha. No iPhone e no iPad, o envio de mensagem pelo navegador só funciona no aplicativo já adicionado à Tela de Início. A capacidade veio com o sistema 16.4, de março de 2023.
O Workbox (o conjunto de bibliotecas do Chrome que monta o service worker pronto) está em 54% dos sites mobile e traz as três estratégias de cache. Cache First serve fonte, ícone e arquivo com nome versionado: a tela vem na hora, e o risco é mostrar versão antiga.
Network First serve a API (a porta por onde o site pede dados ao servidor), o login e o pagamento. O dado chega fresco, e a tela paga o tempo da ida. Stale-While-Revalidate serve o que tolera estar uma visita atrás, como foto de perfil: entrega o guardado e busca a versão nova por trás.
Uma estratégia única para o site inteiro é o erro mais comum do service worker gerado por agente; o segundo é guardar por endereço fixo. Você publica a correção, o endereço continua igual, e o cliente vê a tela de ontem.
Identificar o arquivo pelo conteúdo é a resposta do Workbox: mudou o conteúdo, mudou o identificador, e o antigo é descartado. Sem ele, o plano B é a versão no nome do arquivo e a limpeza do cache antigo ao ativar.
Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
Instalado, o site abre dentro da moldura do celular, e três ajustes de CSS separam aplicativo de site encolhido. A altura em vh ignora a barra de endereço, e o bloco de abertura estoura na rolagem; a unidade dvh acompanha a barra em tempo real.
O recorte da câmera e a barra de gestos pedem dois passos. Escreva viewport-fit=cover na meta de viewport; depois some o recuo do sistema a um mínimo seu no espaçamento do botão fixo. Sem o primeiro passo, o segundo devolve zero.
Resta o gesto de rolagem. touch-action: pan-y libera o arraste lateral do carrossel sem brigar com a rolagem vertical; overscroll-behavior: contain impede a lista de vazar para a página atrás da janela. O recorte varia por aparelho, e o botão cortado aparece no celular de quem usa, nunca no seu. Teste num aparelho de verdade, não só no simulador.
/* 1. altura que acompanha a barra do navegador */
.abertura { min-height: 100dvh; }
/* 2. área segura: exige viewport-fit=cover na meta de viewport
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> */
.barra-acao {
padding-bottom: max(16px, env(safe-area-inset-bottom));
}
/* 3. gestos: o carrossel arrasta de lado e a lista não vaza para a página */
.carrossel { touch-action: pan-y; }
.janela-lista { overscroll-behavior: contain; }Quem precisa editar sem rede entra no local-first (o dado mora no aparelho e sincroniza quando a rede volta, como um caderno que se copia sozinho). O motor é um CRDT (a estrutura que funde as edições de duas pessoas sem conflito).
O Yjs tem o maior ecossistema, cerca de 920 mil downloads semanais, e move Notion, TipTap e BlockNote: é a escolha para edição em tempo real. O Automerge guarda o histórico estilo Git. Vale quando a auditoria de quem mudou o quê importa mais que o tempo real.
Para banco de aplicação com sincronização, ElectricSQL, Zero e TinyBase usam SQLite (o banco de arquivo único) no aparelho. O Zero resolve conflito por regra de negócio com mutators em TypeScript no servidor; o TinyBase é o pacote único MIT. O TanStack DB 0.6 segue em beta e fica no protótipo.
O relatório offline seguro do manual é um HTML único com o banco dentro do navegador e os dados locais. O SQLite Wasm 3.53, com cerca de 400 KB gzip, é o padrão. Suba para o PGlite 0.5.8 e os seus 3,3 MB só quando extensões e tipos do Postgres justificam.
Editar sem rede e guardar dados no navegador: a ferramenta pelo critério
| Ferramenta | Escolha quando | Armadilha |
|---|---|---|
| Workbox | o site precisa abrir sem rede; service worker pronto com as três estratégias, em 54% dos sites mobile | uma estratégia só para o site inteiro |
| Yjs | edição em tempo real de texto ou quadro; CRDT com o maior ecossistema, cerca de 920 mil downloads semanais, motor de Notion, TipTap e BlockNote | tratar como banco: ele funde edições e não consulta tabela |
| Automerge | a auditoria de quem editou importa mais que o tempo real; histórico estilo Git | documento grande carrega o histórico inteiro |
| ElectricSQL, Zero, TinyBase | app com tabelas e regra de conflito; SQLite no aparelho com sincronização, Zero com mutators TypeScript, TinyBase como pacote único MIT | sincronizar tudo sem filtro de permissão por usuário |
| TanStack DB 0.6 | protótipo; segue em beta, rumo à v1 com SSR | levar a versão beta para produção |
| SQLite Wasm 3.53 | relatório offline com dados locais leves; cerca de 400 KB gzip | guardar só em memória e perder tudo ao fechar a aba |
| PGlite 0.5.8 | extensões e tipos do Postgres justificam o peso; Postgres 16 real em cerca de 3,3 MB | pagar 3,3 MB por uma tabela de contatos |
| DuckDB-Wasm | somar milhões de linhas dentro do relatório offline; análise colunar | contar com paridade com o núcleo nativo (base 1.5.4, Arrow 17) |
Cache resolve leitura sem rede; edição sem rede pede local-first, e relatório offline seguro pede o banco dentro do navegador.
O critério separa os dois: cache resolve ver, local-first resolve gravar. Numa distribuidora de bebidas, o vendedor em bairro sem sinal vê o catálogo de ontem com cache e só grava o pedido com local-first. A última caixa vendida duas vezes se resolve por regra de negócio no servidor.
Antes de pedir o service worker ao agente, escreva a estratégia de cada arquivo. Cache First para fonte e ícone versionado, Network First para dados e pagamento, Stale-While-Revalidate para o resto. Publique uma correção e recarregue no celular: se o texto antigo persistir, o guardado está por endereço fixo, e não por conteúdo.
Laboratório visual: construir um aplicativo instalável e resiliente
Manifesto, cache, rede indisponível e atualização
Escolha um horário
Os horários demonstrativos são 14h e 16h. Nenhuma reserva será enviada.
Selecione cada estado acima. A simulação permanece em “Enviando” para permitir a inspeção; escolha “Confirmado” ou “Erro” para examinar as saídas.
Todos os capítulos de Frontends com Vibecoding
- 01Projetar o briefing, o repertório da marca e o custo de manter
- 02Dirigir o prompt e avaliar a entrega do agente
- 03Escolher a stack e projetar suas dependências
- 04Investigar uma stack e priorizar atualizações
- 05Construir a identidade com tokens, CSS moderno e DESIGN.md
- 06Construir componentes, usar o registro e publicar o catálogo
- 07Projetar uma linguagem de ícones e ilustração
- 08Projetar menus, popovers e modais acessíveis
- 09Adaptar o layout ao celular e ao contêiner
- 10Projetar movimento, assinatura e narrativas por rolagem
- 11Preparar imagens, ícones e vídeo para a web
- 12Construir profundidade e dirigir a montagem de vídeo
- 13Construir formulários e estados de interação
- 14Publicar conteúdo encontrável em vários idiomas
- 15Projetar gráficos e painéis pela decisão
- 16Dimensionar tabelas e organizar o cálculo das métricas
- 17Escolher mapas, diagramas e cenas espaciais
- 18Comparar direção visual em Stripe e Apple
- 19Avaliar busca, conversão e padrões de comércio
- 20Auditar acessibilidade e contraste nos dois temas
- 21Validar desempenho, autenticação e segurança
- 22Planejar a modernização e publicar com reversão
- 23Construir o projeto final, medir a cara de IA e revisar
- 24Comparar modelos e interpretar benchmarks
- 25Calcular custo por tarefa e definir governança
- 26Supervisionar o modelo que opera o computador
- 27Configurar ambiente, skills e o contêiner de contexto
- 28Aplicar direção de arte, UX writing e padrões de código
- 29Construir um aplicativo instalável e resiliente
- 30Produzir apresentações e PDF com critérios de entrega