STATUS IS UPWIKI DE OTIMIZAÇÃO DE SITES
25Acelerar
Desempenho e entrega / Acelerar

Desempenho JavaScript: Reduza o trabalho no thread principal

Localize JavaScript que faz a página hesitar, atrasar ou executar trabalho desnecessário, e proteja interações.

Desempenho JavaScript: Reduza o trabalho no thread principal — GUIA VISUAL
LER
8 minutos
FONTES
5
REVALIDAR
2027-03-27
revisado
Revisor Sênior de Performance Web
A RESPOSTA CURTA

Comece pela decisão.

Reduza o trabalho no thread principal medindo uma página e uma interação reais, depois corrija o maior custo repetível. O thread principal executa a maior parte do JavaScript da página e do trabalho de interface uma tarefa por vez. Uma tarefa com mais de 50 milissegundos é uma long task, então um toque, clique, rolagem ou pintura pode aguardar atrás dela. Comece por checkout, busca, navegação, formulários e outras jornadas sensíveis.

Para cada custo, remova-o, adie até ser necessário, divida em lotes curtos ou mova cálculo limitado para um Web Worker. Mantenha a resposta imediata no thread principal, mas adie analytics e outros trabalhos de acompanhamento não essenciais. Trate cada tag de terceiros como uma dependência com um responsável. Re-teste em CPU móvel limitada e mantenha rollback para fluxos críticos.

GUIA VISUAL

Veja o trabalho como um sistema.

Use este mapa para conectar as decisões do artigo antes de agir sobre táticas individuais.

SIUAcelerar
01Analise o perfil de uma jornada do cliente antes de alterar o código
02Leia o trace como uma fila de trabalho
03Envie menos código quando isso importa
04Divida o trabalho para que o navegador possa responder
01

Analise o perfil de uma jornada do cliente antes de alterar o código

Escolha uma rota e uma interação importantes, como abrir a navegação, filtrar resultados ou enviar um formulário. Grave-a no painel Performance do Chrome DevTools com o navegador em um estado limpo. Repita a ação e capture uma execução com a CPU limitada, além de outra na máquina de desenvolvimento; traces de desktop podem ocultar trabalho que prejudica um celular menos potente.

Use o trace para testar uma hipótese estreita, não para culpar um componente a partir de um relatório de bundle. No gráfico de chamas Main, barras mais largas consomem mais tempo e barras empilhadas mostram a pilha de chamadas. Um triângulo vermelho em uma Task identifica uma possível long task; selecione-o e siga o link para o código iniciador. Salve traces de antes e depois para mudanças significativas.

Capture o momento

Grave pouco antes da ação e pare após o resultado visível.

Use um caso repetível

Mantenha rota, estado da conta e sequência de ação consistentes.

Nomeie um responsável

Atribua cada custo principal à equipe ou fornecedor capaz de alterá-lo.

02

Leia o trace como uma fila de trabalho

Uma tarefa longa é um limiar de investigação, não um diagnóstico completo. A especificação Long Tasks do W3C relata tarefas que duram 50 milissegundos ou mais. Em uma tarefa, procure a avaliação de JavaScript, um manipulador de eventos, o recálculo de estilo, o layout ou a pintura. A pilha de chamadas indica por onde começar; a duração mostra se o problema está no código, na renderização ou em um frame de terceiros.

Priorize custos que se repetem durante uma interação valiosa. Um handler curto ainda pode parecer lento quando dispara layout ou espera atrás de trabalho anterior. O trace é uma medição de laboratório, então confirme a correção em dispositivos representativos e, quando disponível, com telemetria de campo respeitosa à privacidade.

Separe momentos

A análise do código durante a inicialização exige uma solução diferente de um manipulador acionado após um toque.

Inspecione a renderização

Encontre padrões repetidos de escrita de estilo e leitura de layout antes de refatorar.

Mantenha uma linha de base

Anexe o trace, o cenário e os maiores custos ao item de trabalho.

03

Envie menos código quando isso importa

Faça um inventário dos scripts por rota e finalidade. Remova pacotes não usados, duplicatas, experimentos encerrados e código de funcionalidades descontinuadas. Depois, divida funcionalidades específicas de uma rota ou pouco usadas para que sejam carregadas quando necessário, em vez de no caminho inicial. O carregamento dinâmico pode reduzir o trabalho de inicialização, mas pode criar atraso visível quando o usuário precisa do recurso imediatamente.

Pergunte se um componente precisa de um framework cliente completo, se uma utilidade duplica capacidade existente, e se HTML estático com uma pequena melhoria funcionaria. Teste o estado fallback de um módulo carregado sob demanda. A página deve adiar graciosamente uma capacidade opcional em vez de exibir um controle inoperante.

Construa um orçamento por rota

Documente quais scripts são permitidos em uma rota e por quê.

Carregue por intenção

Considere isso para editores opcionais, mapas, players ou visões de relatórios.

Proteja caminhos críticos

Teste autenticação, acessibilidade, pagamento e conclusão de formulários; busque revisão qualificada quando controles forem afetados.

04

Divida o trabalho para que o navegador possa responder

Nomear funções menores não cria tarefas separadas para o navegador quando elas rodam de forma síncrona. Para um loop longo, processe em lotes, atualize o estado visível ao usuário e então ceda antes de continuar. Isso permite que o navegador processe entrada e renderização entre lotes.

Quando houver suporte, scheduler.yield() cede o controle da thread principal e retoma o trabalho depois; detecte o suporte ao recurso e use uma alternativa nos navegadores sem suporte. Não ceda após cada operação minúscula: isso gera sobrecarga e pode aumentar o tempo de conclusão. Escolha os limites com base em medições, preserve o cancelamento e evite que resultados obsoletos substituam um estado mais recente.

Priorize a interface

Mostre aceitação ou progresso antes de trabalho de acompanhamento não visível.

Agrupe por tempo decorrido

Ceda antes que o trabalho medido se torne longo, em vez de uma vez por item.

Evite atalhos obsoletos

A orientação atual do web.dev não recomenda uma nova estratégia baseada em isInputPending().

05

Mova o cálculo, não a interface, para um worker

Um Web Worker executa um script em uma thread de background separada do thread principal de execução. Ele é adequado para parsing caro, transformação de dados, indexação de busca e outros cálculos que não precisam de acesso direto à interface. Envie uma entrada definida, retorne um resultado definido e mantenha renderização e mudanças de estado visíveis no thread principal.

Workers não são universais. Eles não podem manipular o DOM diretamente nem usar Window, e a comunicação por mensagem costuma copiar dados. Criação de worker, movimentação de dados e coordenação de erros podem superar um cálculo pequeno. Meça a interação completa, termine workers não necessários e projete um fallback se o trabalho do worker falhar.

Escolha trabalho isolado

Comece com um cálculo cujo input e output possam ser serializados e testados.

Versione mensagens

Descarte resultados gerados para um filtro, rota ou ação mais antiga.

Preserve a acessibilidade

Comunique progresso significativo através da interface normal.

06

Governança do JavaScript de terceiros como dependência de produção

Analytics, publicidade, experimentos, embeds sociais, players de vídeo e widgets de suporte podem adicionar requisições, avaliação de JavaScript, iframes e dependências. Um script de fornecedor pode ser necessário, mas está fora do controle direto da equipe de aplicação e pode afetar performance, privacidade, segurança e continuidade. Faça inventário do propósito, rotas, condição de carregamento, aprovador, requisito de consentimento e dono da remoção.

Quando condições e contratos permitem, compare uma página representativa com e sem uma origem de terceiros. Ferramentas de performance podem expor avaliação custosa, payloads e atribuição de long-task. Mantenha uma integração leve ou adiada somente quando seu valor documentado justificar o custo medido. Confirme conteúdo central e o trabalho da transação primária quando uma dependência opcional estiver lenta ou ausente.

Limite o raio de impacto

Carregue uma tag apenas em rotas e condições que a necessitem.

Revise controle de mudança

Inclua alterações em tag-manager na revisão de performance, privacidade, segurança e rollback.

Mantenha um interruptor de remoção

Documente e teste como desabilitar uma integração não crítica.

07

Faça da responsividade uma salvaguarda de release

Converta o trace vencedor em uma pequena verificação de regressão para a jornada importante. Defina interações cobertas, restrição de dispositivo ou CPU, resposta esperada e revisor. Acompanhe isso com revisão de bundle e inventário de terceiros para que um novo pacote ou tag não possa reintroduzir silenciosamente trabalho no thread principal.

Status Is UP usa essa evidência para otimização proativa e remediação segura, não para substituir monitoramento de disponibilidade em produção. Antes de uma mudança de alto risco, prepare rollback e verifique o fluxo crítico após o release. Resultados variam por dispositivo, rede, navegador, conteúdo e estado da conta; trate limites como guardrails, não garantias.

Bloqueie mudanças significativas

Exija traces de antes e depois para navegação compartilhada, checkout, busca ou bundles grandes.

Pratique rollback

Saiba a feature flag, configuração de tag ou versão de deploy que restaura comportamento conhecido e bom.

Revisite regularmente

Faça um novo perfil após grandes releases, mudanças de fornecedor ou alterações na distribuição de dispositivos.

AÇÃO / VERIFICAR

Seu guia prático de tarefas.

  1. 01

    Selecione uma interação crítica

    Nomeie a rota, ação, resposta esperada e impacto no cliente.

    VERIFICAR: Uma nota de teste registra rota, estado da conta, ação, navegador e configuração de dispositivo ou CPU.
  2. 02

    Registre uma linha de base

    Grave a interação no DevTools Performance a partir de um estado limpo.

    VERIFICAR: A equipe pode revisitar um trace com o gráfico de chamas Main.
  3. 03

    Encontre trabalho bloqueante

    Inspecione long tasks, pilhas de chamadas, renderização e atividade de terceiros.

    VERIFICAR: Cada custo superior tem duração, fonte ou origem, rota e responsável.
  4. 04

    Remova scripts desnecessários

    Remova pacotes não usados, experimentos encerrados, duplicatas e código de rota desnecessário.

    VERIFICAR: O build e a jornada crítica funcionam após a remoção.
  5. 05

    Adie recursos opcionais

    Carregue capacidade opcional mais tarde somente quando seu estado adiado permanecer utilizável.

    VERIFICAR: Um teste de página nova cobre carregamento, falha ou fallback.
  6. 06

    Divida long tasks

    Agrupe trabalho e ceda após a resposta imediata da interface.

    VERIFICAR: Um novo trace remove a long task comparável do caminho de interação e preserva resultados corretos.
  7. 07

    Avalie um worker

    Mova apenas cálculos limitados com mensagens definidas.

    VERIFICAR: Teste tempo ponta a ponta, erros, resultados obsoletos e limpeza.
  8. 08

    Audite terceiros

    Registre propósito, responsável, condição, consentimento, custo e procedimento de desativação.

    VERIFICAR: Cada tag de rota crítica tem uma decisão de manter, limitar, adiar ou remover.
  9. 09

    Teste condições limitadas

    Repita com CPU limitada e navegadores ou dispositivos representativos quando viável.

    VERIFICAR: A comparação usa o mesmo cenário e nota diferenças materiais.
  10. 10

    Publique com rollback

    Anexe o trace, checagem de aceitação e instrução de reversão ao release.

    VERIFICAR: Um responsável nomeado pode restaurar comportamento conhecido e bom sem busca não documentada.
TÓPICOS DE DISCUSSÃO

Compare as compensações, não dados privados.

Use essas sugestões com sua equipe ou comunidade de proprietários de sites. Compartilhe métodos e aprendizados, mas nunca cole credenciais, registros de clientes ou detalhes de infraestrutura não públicos.

  1. 01

    Qual interação parecia aceitável em um relatório de carregamento mas provou ser lenta quando você perfilou um toque ou clique real?

  2. 02

    Como você decide se um recurso de terceiro justifica seu custo medido no thread principal?

  3. 03

    Qual mecanismo de rollback torna mais fácil reverter uma regressão de performance sem interromper uma jornada crítica?

RECURSOS POPULARES / AUTORITATIVOS

Abra o material de origem.

web.devOptimize long tasks ↗

Explica long tasks, yield, scheduler.yield(), fallbacks e overhead de ceder.

Revisado 2026-09-27
Chrome for DevelopersAnalyze runtime performance ↗

Mostra gravação, análise do gráfico de chamas, identificação de long-task e investigação de origem.

Revisado 2026-09-27
MDN Web DocsWeb Workers API ↗

Define workers, comunicação por mensagem e a limitação de acesso direto ao DOM.

Revisado 2026-09-27
web.devLoad Third-Party JavaScript ↗

Fornece orientação para auditoria e medição de scripts de terceiros.

Revisado 2026-09-27
W3CLong Tasks API ↗

Define long tasks, o limiar e a atribuição.

Revisado 2026-09-27

Política de fontes. Este artigo usa documentação oficial de navegadores, padrões e plataformas web consultada pela equipe editorial. Ele distingue medição de garantias e omite alegações sem respaldo.

ESCLARECIMENTOS RÁPIDOS

Perguntas comuns.

O que é considerado uma tarefa longa de JavaScript?

A especificação Long Tasks do W3C considera 50 milissegundos ou mais como o limiar de relatório. É um sinal para investigar, não uma prova de que tarefas mais curtas sejam inofensivas. Confirme a causa em um trace.

A divisão de código sempre melhora o desempenho do JavaScript?

Não. A divisão de código pode reduzir o trabalho de inicialização, mas acrescentar atraso no primeiro uso. Use-a para código específico de rota ou opcional e, depois, teste esse recurso sob condições limitadas.

Toda função cara deveria rodar em um Web Worker?

Não. Workers servem para computação isolada e pesada em CPU com mensagens definidas. Eles não podem alterar o DOM diretamente, transferência de dados custa tempo e tarefas pequenas podem terminar mais rápido no thread principal.

Status Is UP Editorial Team · Editores de Habilitação de Uptime

Revisado por Revisor Sênior de Performance Web. Publicado 2026-09-27; atualizado 2026-09-30.