Recentemente, recebi esse tipo de aviso e é a primeira vez que o recebo:
[Violation] Long running JavaScript task took 234ms [Violation] Forced reflow while executing JavaScript took 45ms
Estou trabalhando em um projeto de grupo e não tenho ideia de onde isso vem. Isso nunca aconteceu antes. De repente, apareceu quando alguém se envolveu no projeto. Como localizo qual arquivo / função causa esse aviso? Estive procurando a resposta, mas principalmente sobre a solução de como resolvê-lo. Não consigo resolver se não consigo encontrar a fonte do problema.
Nesse caso, o aviso aparece apenas no Chrome. Tentei usar o Edge, mas não recebi nenhum aviso semelhante e ainda não o testei no Firefox.
Eu até recebo o erro de jquery.min.js
:
[Violation] Handler took 231ms of runtime (50ms allowed) jquery.min.js:2
javascript
google-chrome
dom
procador
fonte
fonte
Respostas:
Atualização : o Chrome 58 ou mais oculta essas e outras mensagens de depuração por padrão. Para exibi-los, clique na seta ao lado de 'Informações' e selecione 'Detalhado'.
O Chrome 57 ativou 'ocultar violações' por padrão. Para ativá-los novamente, é necessário ativar os filtros e desmarcar a caixa "Ocultar violações".
Acho que é mais provável que você tenha atualizado para o Chrome 56. Esse aviso é um recurso novo e maravilhoso. Na minha opinião, desative-o apenas se estiver desesperado e seu avaliador tirar marcas de você. Os problemas subjacentes existem nos outros navegadores, mas os navegadores simplesmente não estão dizendo que há um problema. O ticket do Chromium está aqui, mas não há realmente nenhuma discussão interessante sobre ele.
Essas mensagens são avisos em vez de erros, porque realmente não causam grandes problemas. Isso pode causar queda de quadros ou causar uma experiência menos suave.
No entanto, vale a pena investigar e corrigir para melhorar a qualidade do seu aplicativo. A maneira de fazer isso é prestando atenção em quais circunstâncias as mensagens aparecem e realizando testes de desempenho para diminuir onde o problema está ocorrendo. A maneira mais simples de iniciar o teste de desempenho é inserir um código como este:
Se você quiser se tornar mais avançado, também pode usar o criador de perfil do Chrome ou fazer uso de uma biblioteca de benchmarking como esta .
Depois de encontrar algum código que está demorando muito (50 ms é o limite do Chrome), você tem algumas opções:
(1) e (2) pode ser difícil ou impossível, mas às vezes é realmente fácil e deve ser sua primeira tentativa. Se necessário, sempre deve ser possível (3). Para fazer isso, você usará algo como:
ou
Você pode ler mais sobre a natureza assíncrona do JavaScript aqui .
fonte
performance.now()
, você poderia usarconsole.time
( developer.mozilla.org/en-US/docs/Web/API/Console/time )console.time('UniquetLabelName') ....code here.... console.timeEnd('UniqueLabelName')
Estes são apenas avisos, como todos mencionados. No entanto, se você estiver interessado em resolvê-los (o que você deve), precisará identificar primeiro o que está causando o aviso. Não há um motivo para você receber um aviso de força de refluxo. Alguém criou uma lista para algumas opções possíveis. Você pode acompanhar a discussão para obter mais informações.
Aqui está a essência das possíveis razões:
Veja mais aqui .
Além disso, aqui está o código-fonte do Chromium da edição original e uma discussão sobre uma API de desempenho para os avisos.
Editar: também há um artigo sobre como minimizar o refluxo do layout no PageSpeed Insight do Google . Explica o refluxo do navegador:
Além disso, explica como minimizá-lo:
fonte
Algumas idéias:
Remova metade do seu código (talvez por meio de um comentário).
O problema ainda está aí? Ótimo, você reduziu as possibilidades! Repetir.
O problema não está aí? Ok, olhe a metade que você comentou!
Você está usando algum sistema de controle de versão (por exemplo, Git)? Nesse caso,
git checkout
alguns dos seus commits mais recentes. Quando o problema foi introduzido? Veja o commit para ver exatamente qual código foi alterado quando o problema chegou.fonte
git checkout E
verificaria se o problema já existe. Se sim, continuarei a procurar o problema na primeira metade dos commits. Caso contrário, procuro o problema no segundo semestre..js
arquivo principal e o problema persistir ... pode ser uma biblioteca que você trouxe através de uma<script src="...">
tag! Talvez algo que não valha a pena se preocupar (especialmente porque é apenas um aviso)?.js
arquivo externo . aparentemente, isso importa. torna meu site lento bastante significativo. de qualquer forma, obrigado novamente por suas respostas e idéias.Para identificar a origem do problema, execute seu aplicativo e registre-o na guia Desempenho do Chrome .
Lá você pode verificar várias funções que demoraram muito tempo para serem executadas. No meu caso, aquele que se correlacionou com os avisos no console era de um arquivo carregado pela extensão do AdBlock, mas isso poderia ser outra coisa no seu caso.
Verifique esses arquivos e tente identificar se esse é o código de alguma extensão ou o seu. (Se for seu, você encontrou a fonte do seu problema.)
fonte
Procure no console do Chrome na guia Rede e encontre os scripts que demoram mais para carregar.
No meu caso, havia um conjunto de scripts Angular add que eu incluíra, mas ainda não usei no aplicativo:
Esses foram os únicos arquivos JavaScript que demoraram mais para carregar do que o tempo especificado pelo erro "Tarefa de longa execução".
Todos esses arquivos são executados em meus outros sites sem erros gerados, mas eu estava recebendo o erro "Tarefa de execução longa" em um novo aplicativo da Web que mal possuía funcionalidade. O erro parou imediatamente após a remoção.
Meu melhor palpite é que esses complementos angulares estavam procurando recursivamente em seções cada vez mais profundas do DOM suas tags de início - não encontrando nenhuma, eles precisavam atravessar todo o DOM antes de sair, o que demorou mais do que o Chrome espera - portanto, o aviso.
fonte
Encontrei a raiz desta mensagem no meu código, que pesquisou e ocultou ou mostrou nós (offline). Este foi o meu código:
A guia desempenho (criador de perfil) mostra o evento com aproximadamente 60 ms:
Agora:
A guia desempenho (criador de perfil) agora mostra o evento com aproximadamente 1 ms:
E sinto que a pesquisa funciona mais rápido agora (229 nós).
fonte
Encontrei uma solução no código fonte do Apache Cordova. Eles implementam assim:
Implementação simples, mas de maneira inteligente.
No Android 4.4, use
Promise
. Para navegadores mais antigos, usesetTimeout()
Uso:
Depois de inserir esse código de truque, todas as mensagens de aviso desaparecem.
fonte
Isso foi adicionado na versão beta do Chrome 56, mesmo que não esteja neste log de alterações do Chromium Blog: Chrome 56 Beta: aviso "Não seguro", Web Bluetooth e CSS
position: sticky
Você pode ocultar isso na barra de filtro do console com a caixa de seleção Ocultar violações .
fonte
Se você estiver usando o Chrome Canary (ou Beta), basta marcar a opção "Ocultar violações".
fonte
Este é um erro de violação do Google Chrome que mostra quando o
Verbose
nível de log está ativado.Exemplo de mensagem de erro:
Explicação:
Artigo original: minimizando o refluxo do navegador por Lindsey Simon, desenvolvedor do UX, publicado em developers.google.com.
E este é o link que o Google Chrome fornece no perfil de desempenho, nos perfis de layout (regiões malva), para mais informações sobre o aviso.
fonte
Adicionando meus insights aqui como esse encadeamento foi a pergunta "ir para" stackoverflow sobre o tópico.
Meu problema estava em um aplicativo de interface do usuário de material (estágios iniciais)
quando fiz alguns cálculos forçando a renderização da página (um componente, "exibir resultados", depende do que está definido em outros, "seções de entrada").
Tudo estava bem até eu atualizar o "estado" que força o "componente de resultados" a ser renderizado novamente. O principal problema aqui foi que eu tinha um tema de interface do usuário material ( https://material-ui.com/customization/theming/#a-note-on-performance ) no mesmo renderizador (App.js / return ..) como o "componente de resultados", SummaryAppBarPure
A solução foi elevar o ThemeProvider um nível acima (Index.js) e agrupar o componente App aqui, não forçando o ThemeProvider a recalcular e desenhar / layout / reflow.
antes
no App.js:
no index.js
depois de
no App.js:
no index.js
fonte
O refluxo forçado geralmente acontece quando você tem uma função chamada várias vezes antes do final da execução.
Por exemplo, você pode ter o problema em um smartphone, mas não em um navegador clássico.
Sugiro usar um
setTimeout
para resolver o problema.Isso não é muito importante, mas repito, o problema surge quando você chama uma função várias vezes, e não quando a função leva mais de 50 ms. Eu acho que você está enganado em suas respostas.
setTimeOut
base na duração da violação.fonte
Este não é um erro, apenas uma mensagem simples. Para executar esta mensagem, mude
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
(exemplo)para
<!DOCTYPE html>
(a fonte do Firefox espera isso).A mensagem foi mostrada no Google Chrome 74 e Opera 60. Depois de mudar, ficou claro, 0 detalhado.
Uma abordagem de solução
fonte