Analytics, chat, mapas, pixels de campanha e testes A/B costumam chegar como uma linha de JavaScript. Essa linha pode abrir conexões, baixar outros scripts, criar iframes e ocupar a thread principal muito depois do carregamento inicial.
O tamanho da tag no HTML, portanto, diz pouco. Para reduzir o custo de terceiros, você precisa descobrir tudo o que cada integração inicia, medir o trabalho no navegador e decidir quando esse trabalho merece acontecer.
Este guia parte de uma regra simples: uma tag deve ter responsável, finalidade e condição de carregamento. Se ninguém consegue explicar um desses pontos, a primeira opção é remover, não otimizar.
Faça um inventário por fornecedor
Comece pelo HTML, pelo gerenciador de tags e pelos componentes que injetam scripts. Registre cada origem externa em uma tabela.
| Integração | Responsável | Para que serve | Quando carrega | Dependências |
|---|---|---|---|---|
| analytics | produto | medir eventos principais | após consentimento | script e endpoint de coleta |
| chat | suporte | abrir atendimento | após clique | iframe, fontes e imagens |
| mapa | comercial | mostrar endereço | ao chegar perto da seção | iframe e tiles |
| teste A/B | growth | escolher variante | antes da renderização | script e API |
Não pare no primeiro domínio. Uma tag pode carregar recursos de outras origens. Abra a aba Network, filtre por JS, ordene por Initiator e siga a cadeia até o pedido inicial.
O guia de revisão de scripts de terceiros cobre procedência, permissões, integridade e plano de remoção. Aqui o foco é o custo de rede e execução depois que a integração foi aprovada.
Meça bytes, tempo de CPU e efeito na página
Uma integração pode ter poucos kilobytes e ainda registrar listeners caros. Outra pode transferir muito conteúdo sem tocar a thread principal. Meça as duas dimensões.
No Chrome DevTools:
- use um perfil de celular com CPU e rede limitadas;
- grave o carregamento no painel Performance;
- abra a tabela de primeira e terceira parte no resumo;
- agrupe a visão Bottom-up por produto ou origem;
- anote tempo de avaliação, long tasks e requisições iniciadas;
- repita três vezes para reduzir variações do fornecedor.
A referência atual do painel Performance mostra a origem e a duração própria de cada evento na thread principal. Ela também liga uma requisição ao iniciador e exibe mudanças de prioridade.
Registre uma linha de base curta:
URL e Version:cenário e dispositivo:fornecedor:requisições:bytes transferidos:tempo de CPU:long tasks atribuídas:efeito em LCP e INP:O artigo sobre JavaScript na thread principal ajuda a separar download, parse, compilação e execução.
Bloqueie a origem para medir o contrafactual
Números isolados não mostram o que a página ganharia sem uma tag. Use o Network request blocking do DevTools para bloquear a URL ou o domínio e repita o mesmo cenário.
Compare:
- início da renderização;
- LCP;
- tarefas longas antes e depois da primeira interação;
- bytes e número de requisições;
- funcionamento do formulário, da navegação e da medição essencial.
O guia do web.dev para JavaScript de terceiros recomenda esse teste com limitação de CPU e rede. O bloqueio é um experimento local. Ele não substitui a remoção no código nem prova sozinho que a tag pode sair.
Se a página quebra quando um fornecedor fica indisponível, há também um problema de resiliência. Conteúdo principal, navegação e envio de formulário não deveriam depender da resposta de uma tag de marketing.
Remova tags sem dono ou sem decisão
Gerenciadores de tags acumulam campanhas encerradas, pixels duplicados e gatilhos que disparam em todas as rotas. Antes de trocar atributos, exclua o que não tem uso comprovado.
Pergunte ao responsável:
- qual decisão depende deste dado?
- qual evento e rota são necessários?
- por quanto tempo a integração ficará ativa?
- existe outra tag coletando a mesma informação?
- o contrato permite carregar só depois do consentimento?
Remover um fornecedor elimina sua transferência, execução, risco de falha e manutenção. Trocar async por defer apenas muda quando parte desse custo chega.
Documente a exclusão no mesmo PR. Se alguém precisar da tag depois, terá de recuperar a finalidade e revisar o impacto em vez de reativar um snippet sem contexto.
Escolha async, defer ou carregamento sob demanda
Um script externo sem async, defer ou type="module" pode interromper o parser do HTML enquanto baixa e executa.
<script defer src="https://cdn.example.com/widget.js"></script>Use defer quando a ordem entre scripts importa e a execução pode esperar o fim do parse. Scripts diferidos preservam a ordem do documento.
<script async src="https://cdn.example.com/analytics.js"></script>Use async quando o script é independente e pode executar assim que chegar. A ordem entre scripts assíncronos não é garantida, e a execução ainda pode interromper o trabalho do parser.
Nenhum dos dois atributos elimina parse, compilação ou execução. Para chat, mapa, vídeo e avaliações, o melhor ponto costuma ser uma intenção real da pessoa ou a proximidade da seção.
button.addEventListener( "click", async () => { await import("./support-widget.js"); openSupport(); }, { once: true },);Mantenha o botão funcional durante a carga, anuncie o estado e trate falhas. Um clique não pode desaparecer porque o servidor externo demorou.
Não transforme consentimento em fila de execução
Consentimento e prioridade de carregamento são decisões diferentes. Uma pessoa pode aceitar analytics sem precisar baixar imediatamente chat, mapas e widgets que ainda estão fora da tela.
Depois da permissão, aplique a condição correta para cada integração:
- analytics essencial à medição começa conforme o plano de dados;
- chat carrega no clique ou perto do botão;
- mapa carrega perto da seção de endereço;
- vídeo externo usa uma fachada até o play;
- teste A/B só entra nas rotas e no período do experimento.
Não concentre tudo em um callback que dispara dezenas de tags de uma vez. Isso apenas desloca a disputa de CPU para o momento do consentimento e pode piorar a primeira interação.
Use preconnect com parcimônia
preconnect antecipa DNS, conexão e negociação TLS com uma origem. Ele faz sentido quando uma requisição importante para aquele domínio começará cedo e com alta probabilidade.
<link rel="preconnect" href="https://cdn.example.com" crossorigin />Cada conexão também consome recursos. Não adicione um hint para todo domínio descoberto na aba Network. Priorize uma ou duas origens críticas, confirme a diferença no waterfall e remova o que não antecipa trabalho útil.
O guia de preload, preconnect e fetchpriority separa as funções de cada hint.
Evite duplicação no gerenciador de tags
Uma página pode instalar a mesma integração no código e no tag manager. Também pode disparar duas tags que carregam o mesmo SDK.
Procure por:
- URLs repetidas com parâmetros diferentes;
- identificadores de propriedade duplicados;
- listeners equivalentes em clique, scroll e envio;
- containers aninhados;
- tags globais que também aparecem em templates de campanha;
- bibliotecas que o widget já inclui internamente.
Compare o inventário com a aba Initiator. A duplicação nem sempre produz duas tags idênticas no HTML, mas aparece como duas cadeias chegando ao mesmo pacote ou endpoint.
Defina um orçamento por rota
Um orçamento transforma a revisão em regra de entrega. Escolha limites que o time consiga medir no CI ou em uma auditoria recorrente.
Home em celular:- no máximo 3 origens externas antes do LCP- nenhum widget de chat antes de interação- nenhum long task de terceiro acima de 50 ms no cenário medido- mapa e vídeo fora da primeira tela carregados sob demandaO valor exato depende da rota e do negócio. O ponto é tornar cada nova tag uma troca visível. Se o orçamento estourar, o PR precisa remover, adiar ou justificar outro custo.
Republique e teste a URL pública
No Site no Ar, edite o Site existente em vez de criar outro endereço para a correção.
- chame
get_contextcom o ID do Site; - localize HTML, scripts e configuração dentro de
public/; - remova ou altere as integrações com as file tools;
- rode build e testes da página;
- mantenha
public/sitemap.xmlalinhado; - use
deploypara criar uma nova Version; - acompanhe
deploy_statusaté sucesso ou falha; - repita o perfil na URL pública e no domínio próprio.
A documentação de Publicação explica por que somente public/ chega à URL. Alterar um arquivo-fonte sem atualizar o resultado publicado não muda o custo visto no navegador.
Prompt para auditar scripts de terceiros
Audite o custo de scripts de terceiros desta página sem publicar ainda.
URL e Version: [URL e commit]Cenário: [dispositivo, rede e CPU]Integrações esperadas: [lista e responsáveis]
1. Liste todas as origens externas e suas cadeias de iniciadores.2. Meça requisições, bytes, tempo de CPU e long tasks por fornecedor.3. Bloqueie uma origem por vez e compare o mesmo cenário três vezes.4. Marque tags sem dono, duplicadas ou fora da rota correta.5. Proponha remoção, deferimento ou carregamento por interação.6. Preserve consentimento, eventos essenciais e fallback da página.7. Rode build e mostre a comparação antes de publicar.Uma integração útil pode continuar no site. Ela só não precisa disputar a primeira renderização e a primeira interação com o conteúdo que trouxe a pessoa até a página.
