O handler de clique roda até o fim como uma única task. Todas as microtasks que ele enfileirou, incluindo callbacks de promises resolvidas, são drenadas em seguida, antes de qualquer outra coisa acontecer. Só então, se um frame estiver previsto, o navegador roda os callbacks de requestAnimationFrame e passa por style, layout, paint e composite. Uma long task ou uma cadeia infinita de microtasks atrasa esse frame, e usuários leem o atraso como travamento.
Por que os entrevistadores perguntam isso
Quase todo trabalho de performance de frontend se resume a saber o que bloqueia o frame. O entrevistador quer ouvir que scripting, style, layout e paint dividem uma única main thread, que microtasks não são um jeito de devolver o controle ao navegador e que requestAnimationFrame existe para trabalho que precisa acontecer antes do paint. Isso também prevê se você consegue depurar uma reclamação de responsividade ou se vai só espalhar setTimeout até o sintoma mudar de lugar.
Como estruturar sua resposta
- Nomeie as três fases em ordem: task, drenagem de microtasks, oportunidade de renderização.
- Aponte que microtasks matam de fome o renderizador enquanto um timeout devolve o controle.
- Diga onde requestAnimationFrame fica em relação a style e layout.
- Conecte isso a uma métrica como latência de interação.
Exemplo de resposta
O handler em si é uma task na main thread, então roda do começo ao fim sem nada interrompendo. Assim que retorna, o navegador drena a fila de microtasks, então qualquer continuação de await ou callback de then de promise roda ali mesmo, e se essas continuarem enfileirando mais microtasks o navegador nunca tem chance de pintar. Quando essa fila esvazia, e só se um frame estiver de fato previsto, o navegador roda os callbacks de requestAnimationFrame, recalcula style, faz layout, pinta e compõe. É por isso que trato long tasks como o inimigo real. Num dashboard em que trabalhei, uma troca de filtro fazia uma ordenação síncrona de umas quarenta mil linhas dentro do handler, e o clique parecia morto por uns duzentos milissegundos. Dividir aquilo para o handler só atualizar o input, e então devolver o controle com scheduler.yield antes da passada cara, manteve o orçamento de frame intacto e a interação passou a responder de imediato, mesmo com o trabalho total idêntico.
Vai encarar essa entrevista em breve? O GhostPilot escuta a sua chamada ao vivo, identifica a pergunta no instante em que ela é feita e coloca uma resposta estruturada na sua tela em tempo real. Teste na sua próxima entrevista simulada ou pegue um Session Pass de $29, sem assinatura, para a hora da verdade.
Veja como funcionaPerguntas de acompanhamento que você pode esperar
- Por que dar await numa promise já resolvida não dá ao navegador a chance de pintar?
- Quando você usaria requestAnimationFrame em vez de um timeout?
- Como você quebraria uma long task sem mudar o resultado?
Mais perguntas para Desenvolvedor Frontend
Seu entrevistador vai fazer a própria versão desta. Cole a descrição real da vaga no Question Predictor gratuito e receba as 20 perguntas que essa vaga tem mais chance de fazer, com o que cada uma está de fato sondando.
Prever minhas perguntas