Récemment, j'ai reçu ce genre d'avertissement, et c'est la première fois que je l'obtiens:
[Violation] Long running JavaScript task took 234ms [Violation] Forced reflow while executing JavaScript took 45ms
Je travaille sur un projet de groupe et je n'ai aucune idée d'où cela vient. Cela n'était jamais arrivé auparavant. Soudain, il est apparu lorsque quelqu'un d'autre s'est impliqué dans le projet. Comment savoir quel fichier / fonction provoque cet avertissement? J'ai cherché la réponse, mais surtout la solution pour la résoudre. Je ne peux pas le résoudre si je ne peux même pas trouver la source du problème.
Dans ce cas, l'avertissement n'apparaît que sur Chrome. J'ai essayé d'utiliser Edge, mais je n'ai reçu aucun avertissement similaire et je ne l'ai pas encore testé sur Firefox.
J'obtiens même l'erreur de jquery.min.js
:
[Violation] Handler took 231ms of runtime (50ms allowed) jquery.min.js:2
javascript
google-chrome
dom
procatmer
la source
la source
Réponses:
Mise à jour : Chrome 58+ a masqué ces messages de débogage et d'autres par défaut. Pour les afficher, cliquez sur la flèche à côté de «Info» et sélectionnez «Verbose».
Chrome 57 a activé `` masquer les violations '' par défaut. Pour les réactiver, vous devez activer les filtres et décocher la case «masquer les violations».
Je pense qu'il est plus probable que vous ayez mis à jour vers Chrome 56. Cet avertissement est une merveilleuse nouvelle fonctionnalité, à mon avis, veuillez la désactiver uniquement si vous êtes désespéré et votre évaluateur vous prendra des marques. Les problèmes sous-jacents sont présents dans les autres navigateurs, mais les navigateurs ne vous disent tout simplement pas qu'il y a un problème. Le ticket Chromium est là mais il n'y a pas vraiment de discussion intéressante à ce sujet.
Ces messages sont des avertissements au lieu d'erreurs car cela ne va pas vraiment causer de problèmes majeurs. Cela peut entraîner la perte d'images ou provoquer une expérience moins fluide.
Ils méritent cependant d'être étudiés et corrigés pour améliorer la qualité de votre application. Pour ce faire, faites attention aux circonstances dans lesquelles les messages apparaissent et effectuez des tests de performances pour déterminer où le problème se produit. La façon la plus simple de démarrer les tests de performances consiste à insérer du code comme celui-ci:
Si vous souhaitez devenir plus avancé, vous pouvez également utiliser le profileur de Chrome ou utiliser une bibliothèque d'analyse comparative comme celle-ci .
Une fois que vous avez trouvé du code qui prend beaucoup de temps (50 ms est le seuil de Chrome), vous avez deux options:
(1) et (2) peuvent être difficiles ou impossibles, mais c'est parfois très facile et devrait être vos premiers essais. Si nécessaire, il devrait toujours être possible de le faire (3). Pour ce faire, vous utiliserez quelque chose comme:
ou
Vous pouvez en savoir plus sur la nature asynchrone de JavaScript ici .
la source
performance.now()
, vous pouvez utiliserconsole.time
( developer.mozilla.org/en-US/docs/Web/API/Console/time )console.time('UniquetLabelName') ....code here.... console.timeEnd('UniqueLabelName')
Ce ne sont que des avertissements, comme tout le monde l'a mentionné. Cependant, si vous souhaitez résoudre ces problèmes (ce que vous devriez), vous devez d'abord identifier la cause de l'avertissement. Il n'y a aucune raison pour laquelle vous pouvez obtenir un avertissement de refusion forcée. Quelqu'un a créé une liste pour certaines options possibles. Vous pouvez suivre la discussion pour plus d'informations.
Voici l'essentiel des raisons possibles:
Vérifiez plus ici .
En outre, voici le code source Chromium du problème d'origine et une discussion sur une API de performances pour les avertissements.
Modifier: il existe également un article sur la façon de minimiser la redistribution de la mise en page sur PageSpeed Insight by Google . Il explique ce qu'est la refusion du navigateur:
De plus, il explique comment le minimiser:
la source
Quelques idées:
Supprimez la moitié de votre code (peut-être en le commentant).
Le problème est-il toujours là? Génial, vous avez réduit les possibilités! Répéter.
Le problème n'est-il pas là? Ok, regardez la moitié que vous avez commentée!
Utilisez-vous un système de contrôle de version (par exemple, Git)? Si c'est le cas,
git checkout
certains de vos engagements les plus récents. Quand le problème a-t-il été introduit? Regardez le commit pour voir exactement quel code a changé lorsque le problème est arrivé pour la première fois.la source
git checkout E
verrais si le problème existe déjà. Si oui, je continuerai de chercher le problème dans la première moitié des commits. Sinon, je cherche le problème dans la seconde moitié..js
fichier principal et que le problème persiste ... il pourrait s'agir d'une bibliothèque que vous avez importée via une<script src="...">
balise! Peut-être que quelque chose ne vaut pas la peine de s'inquiéter (d'autant plus que ce n'est qu'un avertissement)?.js
fichier externe . apparemment, cela compte. ça ralentit mon site assez important. de toute façon, merci encore pour vos réponses et vos idées.Afin d'identifier la source du problème, exécutez votre application et enregistrez-la dans l'onglet Performances de Chrome .
Là, vous pouvez vérifier diverses fonctions qui ont pris du temps à s'exécuter. Dans mon cas, celui qui correspondait aux avertissements dans la console provenait d'un fichier chargé par l'extension AdBlock, mais cela pourrait être autre chose dans votre cas.
Vérifiez ces fichiers et essayez d'identifier s'il s'agit d'un code d'extension ou du vôtre. (Si c'est le vôtre, vous avez trouvé la source de votre problème.)
la source
Regardez dans la console Chrome sous l'onglet Réseau et trouvez les scripts qui prennent le plus de temps à charger.
Dans mon cas, il y avait un ensemble de scripts complémentaires Angular que j'avais inclus mais pas encore utilisés dans l'application:
Il s'agissait des seuls fichiers JavaScript dont le chargement prenait plus de temps que le temps spécifié par l'erreur «Long Running Task».
Tous ces fichiers s'exécutent sur mes autres sites Web sans générer d'erreurs, mais j'obtenais cette erreur «Tâche de longue durée» sur une nouvelle application Web qui n'avait pratiquement aucune fonctionnalité. L'erreur s'est arrêtée immédiatement lors de la suppression.
Ma meilleure supposition est que ces modules complémentaires angulaires cherchaient de manière récursive dans des sections de plus en plus profondes du DOM pour leurs balises de démarrage - n'en trouvant aucun, ils devaient parcourir l'intégralité du DOM avant de quitter, ce qui a pris plus de temps que prévu Chrome - d'où l'avertissement.
la source
J'ai trouvé la racine de ce message dans mon code, qui a cherché et caché ou montré des nœuds (hors ligne). C'était mon code:
L'onglet des performances (profileur) montre l'événement prenant environ 60 ms:
Maintenant:
L'onglet de performance (profileur) montre maintenant l'événement prenant environ 1 ms:
Et je pense que la recherche fonctionne plus rapidement maintenant (229 nœuds).
la source
J'ai trouvé une solution dans le code source d'Apache Cordova. Ils implémentent comme ceci:
Implémentation simple, mais intelligente.
Sur Android 4.4, utilisez
Promise
. Pour les navigateurs plus anciens, utilisezsetTimeout()
Usage:
Après avoir inséré ce code astuce, tous les messages d'avertissement ont disparu.
la source
Cela a été ajouté dans la version bêta de Chrome 56, même s'il ne figure pas dans ce journal des modifications du blog Chromium: Chrome 56 Beta: avertissement «Non sécurisé», Web Bluetooth et CSS
position: sticky
Vous pouvez masquer cela dans la barre de filtre de la console avec la case à cocher Masquer les violations .
la source
Si vous utilisez Chrome Canary (ou Beta), cochez simplement l'option "Masquer les violations".
la source
Il s'agit d'une erreur de violation de Google Chrome qui indique lorsque le
Verbose
niveau de journalisation est activé.Exemple de message d'erreur:
Explication:
Article original: Réduire la refusion du navigateur par Lindsey Simon, développeur UX, publié sur developers.google.com.
Et c'est le lien que Google Chrome vous donne dans le profileur de performances, sur les profils de mise en page (les régions mauves), pour plus d'informations sur l'avertissement.
la source
L'ajout de mes idées ici car ce fil était la question "aller à" stackoverflow sur le sujet.
Mon problème était dans une application Material-UI (premiers stades)
quand j'ai fait quelques calculs forçant le rendu de la page (un composant, "afficher les résultats", dépend de ce qui est défini dans les autres, "sections d'entrée").
Tout allait bien jusqu'à ce que je mette à jour l '"état" qui force le "composant de résultats" à se restituer. Le problème principal ici était que j'avais un thème matériel-interface utilisateur ( https://material-ui.com/customization/theming/#a-note-on-performance ) dans le même moteur de rendu (App.js / return ..) comme "composant de résultats", SummaryAppBarPure
La solution consistait à élever le ThemeProvider d'un niveau (Index.js) et à envelopper le composant App ici, ne forçant ainsi pas le ThemeProvider à recalculer et à dessiner / disposition / redistribution.
avant
dans App.js:
dans index.js
après
dans App.js:
dans index.js
la source
La redistribution forcée se produit souvent lorsque vous avez une fonction appelée plusieurs fois avant la fin de l'exécution.
Par exemple, vous pouvez avoir le problème sur un smartphone, mais pas sur un navigateur classique.
Je suggère d'utiliser un
setTimeout
pour résoudre le problème.Ce n'est pas très important, mais je le répète, le problème survient lorsque vous appelez une fonction plusieurs fois, et non lorsque la fonction prend plus de 50 ms. Je pense que vous vous trompez dans vos réponses.
setTimeOut
basé sur la durée de la violation.la source
Ce n'est pas une erreur juste un simple message. Pour exécuter ce message, changez
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
(exemple)en
<!DOCTYPE html>
(la source Firefox s'y attend)Le message a été affiché dans Google Chrome 74 et Opera 60. Après avoir changé, il était clair, 0 verbeux.
Une approche solution
la source