Recientemente, recibí este tipo de advertencia, y esta es la primera vez que la recibo:
[Violation] Long running JavaScript task took 234ms [Violation] Forced reflow while executing JavaScript took 45ms
Estoy trabajando en un proyecto grupal y no tengo idea de dónde viene esto. Esto nunca pasó antes. De repente, apareció cuando alguien más se involucró en el proyecto. ¿Cómo encuentro qué archivo / función causa esta advertencia? He estado buscando la respuesta, pero principalmente sobre la solución sobre cómo resolverla. No puedo resolverlo si ni siquiera puedo encontrar la fuente del problema.
En este caso, la advertencia solo aparece en Chrome. Intenté usar Edge, pero no recibí ninguna advertencia similar, y aún no lo he probado en Firefox.
Incluso recibo el error de jquery.min.js
:
[Violation] Handler took 231ms of runtime (50ms allowed) jquery.min.js:2
javascript
google-chrome
dom
procatmer
fuente
fuente
Respuestas:
Actualización : Chrome 58+ ocultó estos y otros mensajes de depuración de forma predeterminada. Para mostrarlos, haga clic en la flecha al lado de 'Información' y seleccione 'Detallado'.
Chrome 57 activó 'ocultar violaciones' de forma predeterminada. Para volver a activarlos, debe habilitar los filtros y desmarcar la casilla 'ocultar violaciones'.
Creo que es más probable que haya actualizado a Chrome 56. Esta advertencia es una nueva característica maravillosa, en mi opinión, solo desactívela si está desesperado y su asesor le quitará las marcas. Los problemas subyacentes están allí en los otros navegadores, pero los navegadores simplemente no le dicen que hay un problema. El boleto de Chromium está aquí, pero en realidad no hay ninguna discusión interesante al respecto.
Estos mensajes son advertencias en lugar de errores porque en realidad no va a causar problemas importantes. Puede hacer que los cuadros se caigan o causar una experiencia menos fluida.
Sin embargo, vale la pena investigar y corregir para mejorar la calidad de su aplicación. La forma de hacerlo es prestando atención a las circunstancias en que aparecen los mensajes y realizando pruebas de rendimiento para reducir dónde se produce el problema. La forma más sencilla de comenzar las pruebas de rendimiento es insertar un código como este:
Si desea avanzar más, también puede usar el generador de perfiles de Chrome o utilizar una biblioteca de evaluación comparativa como esta .
Una vez que haya encontrado algún código que tarde mucho tiempo (50 ms es el umbral de Chrome), tiene un par de opciones:
(1) y (2) pueden ser difíciles o imposibles, pero a veces es realmente fácil y deberían ser tus primeros intentos. Si es necesario, siempre debe ser posible hacer (3). Para hacer esto usarás algo como:
o
Puede leer más sobre la naturaleza asincrónica de JavaScript aquí .
fuente
performance.now()
, podría usarconsole.time
( developer.mozilla.org/en-US/docs/Web/API/Console/time )console.time('UniquetLabelName') ....code here.... console.timeEnd('UniqueLabelName')
Estas son solo advertencias como todos mencionaron. Sin embargo, si está interesado en resolverlos (que debería), primero debe identificar qué está causando la advertencia. No hay una sola razón por la cual puede obtener una advertencia de reflujo de fuerza. Alguien ha creado una lista para algunas opciones posibles. Puedes seguir la discusión para más información.
Aquí está la esencia de las posibles razones:
Consulta más aquí .
Además, aquí está el código fuente de Chromium del problema original y una discusión sobre una API de rendimiento para las advertencias.
Editar: También hay un artículo sobre cómo minimizar el reflujo de diseño en PageSpeed Insight de Google . Explica qué es el reflujo del navegador:
Además, explica cómo minimizarlo:
fuente
Un par de ideas:
Elimina la mitad de tu código (quizás comentando).
¿El problema sigue ahí? ¡Genial, has reducido las posibilidades! Repetir.
¿El problema no está ahí? Ok, mira la mitad que comentaste!
¿Está utilizando algún sistema de control de versiones (por ejemplo, Git)? Si es así,
git checkout
algunos de sus compromisos más recientes. ¿Cuándo se introdujo el problema? Mire la confirmación para ver exactamente qué código cambió cuando llegó el problema por primera vez.fuente
git checkout E
vería si el problema ya existe. En caso afirmativo, continuaré buscando el problema en la primera mitad de las confirmaciones. De lo contrario, busco el problema en la segunda mitad..js
archivo principal y el problema persiste ... ¡podría ser una biblioteca que trajo a través de una<script src="...">
etiqueta! ¿Quizás algo por lo que no valga la pena preocuparse (especialmente porque es solo una advertencia)?.js
archivo externo . Al parecer, sí importa. ralentiza mi sitio bastante significativo. de todos modos, gracias de nuevo por sus respuestas e ideas.Para identificar la fuente del problema, ejecute su aplicación y regístrela en la pestaña Rendimiento de Chrome .
Allí puede verificar varias funciones que tardaron mucho en ejecutarse. En mi caso, el que se correlacionó con las advertencias en la consola fue de un archivo que fue cargado por la extensión AdBlock, pero esto podría ser algo más en su caso.
Verifique estos archivos e intente identificar si este es el código de alguna extensión o el suyo. (Si es tuyo, entonces has encontrado la fuente de tu problema).
fuente
Busque en la consola de Chrome debajo de la pestaña Red y encuentre los scripts que tardan más en cargarse.
En mi caso, había un conjunto de scripts adicionales de Angular que había incluido pero que aún no había usado en la aplicación:
Estos fueron los únicos archivos JavaScript que tardaron más en cargarse que el tiempo que especificó el error "Tarea de ejecución larga".
Todos estos archivos se ejecutan en mis otros sitios web sin generar errores, pero recibí este error de "Tarea de ejecución prolongada" en una nueva aplicación web que apenas tenía funcionalidad. El error se detuvo inmediatamente al eliminarlo.
Mi mejor conjetura es que estos complementos angulares buscaban recursivamente en secciones cada vez más profundas del DOM para sus etiquetas de inicio; al no encontrar ninguna, tuvieron que atravesar todo el DOM antes de salir, lo que llevó más tiempo de lo que Chrome esperaba, por lo tanto, la advertencia.
fuente
Encontré la raíz de este mensaje en mi código, que buscaba y ocultaba o mostraba nodos (sin conexión). Este fue mi código:
La pestaña de rendimiento (generador de perfiles) muestra que el evento tarda unos 60 ms:
Ahora:
La pestaña de rendimiento (generador de perfiles) ahora muestra que el evento dura aproximadamente 1 ms:
Y siento que la búsqueda funciona más rápido ahora (229 nodos).
fuente
Encontré una solución en el código fuente de Apache Cordova. Implementan así:
Implementación simple, pero de manera inteligente.
Sobre el Android 4.4, use
Promise
. Para navegadores antiguos, usesetTimeout()
Uso:
Después de insertar este código de truco, todos los mensajes de advertencia desaparecen.
fuente
Esto se agregó en Chrome 56 beta, a pesar de que no está en este registro de cambios del Blog de Chromium: Chrome 56 Beta: advertencia "No seguro", Web Bluetooth y CSS
position: sticky
Puede ocultar esto en la barra de filtro de la consola con la casilla de verificación Ocultar infracciones .
fuente
Si está utilizando Chrome Canary (o Beta), simplemente marque la opción 'Ocultar infracciones'.
fuente
Este es un error de violación de Google Chrome que se muestra cuando el
Verbose
nivel de registro está habilitado.Ejemplo de mensaje de error:
Explicación:
Artículo original: minimizar el reflujo del navegador por Lindsey Simon, UX Developer, publicado en developers.google.com.
Y este es el enlace que Google Chrome le brinda en el perfilador de rendimiento, en los perfiles de diseño (las regiones malva), para obtener más información sobre la advertencia.
fuente
Agregar mis ideas aquí ya que este hilo era la pregunta de "ir a" stackoverflow sobre el tema.
Mi problema estaba en una aplicación Material-UI (primeras etapas)
cuando hice algunos cálculos forzando la representación de la página (un componente, "mostrar resultados", depende de lo que esté configurado en otros, "secciones de entrada").
Todo estuvo bien hasta que actualicé el "estado" que obliga al "componente de resultados" a volver a rendir. El problema principal aquí fue que tenía un tema material-ui ( https://material-ui.com/customization/theming/#a-note-on-performance ) en el mismo renderizador (App.js / return ..) como el "componente de resultados", SummaryAppBarPure
La solución fue elevar el ThemeProvider un nivel (Index.js) y ajustar el componente de la aplicación aquí, sin forzar al ThemeProvider a recalcular y dibujar / diseñar / refluir.
antes de
en App.js:
en index.js
después
en App.js:
en index.js
fuente
El reflujo forzado a menudo ocurre cuando tiene una función llamada varias veces antes del final de la ejecución.
Por ejemplo, puede tener el problema en un teléfono inteligente, pero no en un navegador clásico.
Sugiero usar a
setTimeout
para resolver el problema.Esto no es muy importante, pero repito, el problema surge cuando se llama a una función varias veces, y no cuando la función tarda más de 50 ms. Creo que te equivocas en tus respuestas.
setTimeOut
basada en la duración de la violación.fuente
Esto no es un error, solo un simple mensaje. Para ejecutar este mensaje, cambie
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
(ejemplo)a
<!DOCTYPE html>
(la fuente de Firefox lo espera)El mensaje se mostró en Google Chrome 74 y Opera 60. Después de cambiarlo estaba claro, 0 detallado.
Un enfoque de solución
fuente