Недавно я получил такое предупреждение, и это мой первый раз:
[Violation] Long running JavaScript task took 234ms [Violation] Forced reflow while executing JavaScript took 45ms
Я работаю над групповым проектом, и я понятия не имею, откуда это исходит. Этого никогда не было раньше. Внезапно это появилось, когда кто-то еще вмешался в проект. Как мне найти, какой файл / функция вызывает это предупреждение? Я искал ответ, но в основном о том, как его решить. Я не могу решить это, если я даже не могу найти источник проблемы.
В этом случае предупреждение появляется только в Chrome. Я пытался использовать Edge, но я не получил подобных предупреждений, и я еще не тестировал его в Firefox.
Я даже получаю ошибку от jquery.min.js
:
[Violation] Handler took 231ms of runtime (50ms allowed) jquery.min.js:2
javascript
google-chrome
dom
procatmer
источник
источник
Ответы:
Обновление : Chrome 58+ скрыл эти и другие сообщения отладки по умолчанию. Чтобы отобразить их, нажмите стрелку рядом с «Информация» и выберите «Подробно».
Chrome 57 по умолчанию включил «скрыть нарушения». Чтобы включить их снова, необходимо включить фильтры и снять флажок «скрывать нарушения».
Я думаю, что вы, скорее всего, обновили Chrome 56. Это предупреждение - замечательная новая функция, на мой взгляд, пожалуйста, отключайте ее, только если вы в отчаянии и ваш оценщик уберет у вас оценки. Основные проблемы есть в других браузерах, но браузеры просто не сообщают вам, что есть проблема. Билет Chromium здесь, но на самом деле нет никакой интересной дискуссии по нему.
Эти сообщения являются предупреждениями, а не ошибками, потому что это не вызовет серьезных проблем. Это может привести к тому, что кадры будут пропущены или иным образом вызвать менее гладкое впечатление.
Тем не менее, их стоит изучить и исправить, чтобы улучшить качество вашего приложения. Это можно сделать, обращая внимание на обстоятельства, при которых появляются сообщения, и проводя тестирование производительности, чтобы определить причину возникновения проблемы. Самый простой способ начать тестирование производительности - вставить такой код:
Если вы хотите стать более продвинутым, вы также можете использовать профилировщик Chrome или использовать такую библиотеку для сравнения, как эта .
Как только вы нашли некоторый код, который занимает много времени (50 мс - порог Chrome), у вас есть несколько вариантов:
(1) и (2) может быть трудным или невозможным, но иногда это действительно просто и должно быть вашими первыми попытками. При необходимости это всегда можно сделать (3). Для этого вы будете использовать что-то вроде:
или
Вы можете прочитать больше об асинхронной природе JavaScript здесь .
источник
performance.now()
, вы можете использоватьconsole.time
( developer.mozilla.org/en-US/docs/Web/API/Console/time )console.time('UniquetLabelName') ....code here.... console.timeEnd('UniqueLabelName')
Это всего лишь предупреждения, как все упоминали. Однако, если вы заинтересованы в разрешении этих проблем (что следует), вам необходимо сначала определить причину, по которой выдается предупреждение. Там нет ни одной причины, из-за которой вы можете получить предупреждение о принудительном оплавлении. Кто-то создал список для некоторых возможных вариантов. Вы можете следить за обсуждением для получения дополнительной информации.
Вот суть возможных причин:
Проверьте больше здесь .
Кроме того, вот исходный код Chromium из оригинального выпуска и обсуждение API производительности для предупреждений.
Изменить: Есть также статья о том, как минимизировать перекомпоновку макета на PageSpeed Insight от Google . Это объясняет, что такое перекомпоновка браузера:
Кроме того, это объясняет, как минимизировать это:
источник
Пара идей:
Удалите половину вашего кода (возможно, закомментировав его).
Проблема все еще там? Отлично, вы сузили возможности! Повторение.
Проблема не в этом? Хорошо, посмотрите на половину, которую вы закомментировали!
Используете ли вы какую-либо систему контроля версий (например, Git)? Если так,
git checkout
то некоторые из ваших последних коммитов. Когда возникла проблема? Посмотрите на коммит, чтобы увидеть, какой именно код изменился, когда впервые появилась проблема.источник
git checkout E
посмотрел, существует ли проблема. Если да, я продолжу искать проблему в первой половине коммитов. В противном случае я ищу проблему во втором тайме..js
файл и проблема не исчезла ... это может быть библиотека, которую вы добавили с помощью<script src="...">
тега! Может быть, о чем-то не стоит беспокоиться (тем более что это всего лишь предупреждение)?.js
файла. по-видимому, это имеет значение. это значительно замедляет мой сайт. В любом случае, еще раз спасибо за ваши ответы и идеи.Чтобы определить источник проблемы, запустите приложение и запишите его на вкладке «Производительность» Chrome .
Там вы можете проверить различные функции, которые потребовалось много времени для запуска. В моем случае, тот, который коррелировал с предупреждениями в консоли, был из файла, который был загружен расширением AdBlock, но это может быть что-то другое в вашем случае.
Проверьте эти файлы и попытайтесь определить, является ли это кодом какого-либо расширения или вашим. (Если это ваше, значит, вы нашли источник вашей проблемы.)
источник
Посмотрите в консоли Chrome на вкладке Сеть и найдите скрипты, которые загружаются дольше всего.
В моем случае был набор сценариев добавления Angular, которые я включил, но еще не использовал в приложении:
Это были единственные файлы JavaScript, которые загружались дольше, чем время, указанное в сообщении об ошибке «Long Running Task».
Все эти файлы запускаются на других моих веб-сайтах без сгенерированных ошибок, но я получаю эту ошибку "Long Running Task" в новом веб-приложении, которое едва имело какую-либо функциональность. Ошибка прекратилась сразу после удаления.
Мое предположение заключается в том, что эти надстройки Angular рекурсивно изучали все более глубокие разделы DOM для своих начальных тегов - не найдя ни одного, им пришлось пройти через весь DOM перед выходом, что заняло больше времени, чем ожидает Chrome, - таким образом, предупреждение.
источник
Я нашел корень этого сообщения в своем коде, который искал и скрывал или показывал узлы (в автономном режиме). Это был мой код:
Вкладка производительности (профилировщик) показывает, что событие занимает около 60 мс:
Сейчас:
Вкладка производительности (профилировщик) теперь показывает, что событие занимает около 1 мс:
И я чувствую, что поиск теперь работает быстрее (229 узлов).
источник
Я нашел решение в исходном коде Apache Cordova. Они реализуют так:
Простая реализация, но умный способ.
Над Android 4.4 используйте
Promise
. Для старых браузеров используйтеsetTimeout()
Использование:
После вставки этого кода, все предупреждающие сообщения исчезли.
источник
Это было добавлено в бета-версию Chrome 56, хотя в этом списке изменений нет из блога Chromium: Chrome 56 Beta: предупреждение «Not Secure», веб-Bluetooth и CSS
position: sticky
Вы можете скрыть это в панели фильтров консоли с помощью флажка Скрыть нарушения .
источник
Если вы используете Chrome Canary (или бета-версию), просто установите флажок «Скрыть нарушения».
источник
Это ошибка нарушения от Google Chrome, которая показывает, когда
Verbose
уровень ведения журнала включен.Пример сообщения об ошибке:
Объяснение:
Оригинальная статья: Минимизация перекомпоновки браузера Линдси Саймон, разработчиком UX, опубликована на developers.google.com.
И эта ссылка Google Chrome дает вам в профилировщике производительности, в профилях макетов (лиловые регионы), для получения дополнительной информации о предупреждении.
источник
Добавление моих идей здесь, поскольку эта тема была вопросом «перейти к» stackoverflow по теме.
Моя проблема была в приложении Material-UI (ранние стадии)
когда я делал некоторые расчеты, заставляющие рендеринг страницы (один компонент, «отображение результатов», зависит от того, что установлено в других, «входные разделы»).
Все было хорошо, пока я не обновил «состояние», которое заставляет «компонент результатов» перерисовываться. Основная проблема заключалась в том, что у меня была тема материала-интерфейса ( https://material-ui.com/customization/theming/#a-note-on-performance ) в том же устройстве визуализации (App.js / return ..) в качестве «компонента результатов», SummaryAppBarPure
Решение состояло в том, чтобы поднять ThemeProvider на один уровень вверх (Index.js) и обернуть здесь компонент App, не заставляя ThemeProvider пересчитывать и рисовать / layout / reflow.
перед
в App.js:
в index.js
после
в App.js:
в index.js
источник
Принудительное перекомпонование часто происходит, когда у вас есть функция, вызванная несколько раз до конца выполнения.
Например, у вас может быть проблема на смартфоне, но не на классическом браузере.
Я предлагаю использовать
setTimeout
для решения проблемы.Это не очень важно, но я повторяю, проблема возникает, когда вы вызываете функцию несколько раз, а не когда функция занимает более 50 мс. Я думаю, что вы ошибаетесь в своих ответах.
setTimeOut
основанный на продолжительности нарушения.источник
Это не ошибка, просто сообщение. Чтобы выполнить это сообщение, измените
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
(пример)на
<!DOCTYPE html>
(источник Firefox ожидает этого)Сообщение было показано в Google Chrome 74 и Opera 60. После смены было понятно, 0 многословно.
Подход к решению
источник