Descubre qué es la demora de entrada y aprende técnicas para reducirla y lograr una interactividad más rápida.
Las interacciones en la Web son complejas, ya que se producen todo tipo de actividades en el navegador para impulsarlas. Sin embargo, lo que tienen en común es que generan cierta demora de entrada antes de que comiencen a ejecutarse las devoluciones de llamada de sus eventos. En esta guía, aprenderás qué es la demora de entrada y qué puedes hacer para minimizarla de modo que las interacciones de tu sitio web se ejecuten más rápido.
¿Qué es el retraso de entrada?
La demora de entrada es el período que comienza cuando el usuario interactúa por primera vez con una página, como presionar una pantalla, hacer clic con el mouse o presionar una tecla, hasta que comienzan a ejecutarse las devoluciones de llamada de eventos para la interacción. Cada interacción comienza con una cierta cantidad de retraso de entrada.
Una parte de la demora de entrada es inevitable: el sistema operativo siempre tarda un poco en reconocer un evento de entrada y pasarlo al navegador. Sin embargo, esa parte del retraso de la entrada suele ser imperceptible, y hay otros factores que ocurren en la página que pueden hacer que los retrasos de la entrada sean lo suficientemente largos como para causar problemas.
Cómo pensar en la latencia de entrada
En términos generales, te recomendamos que mantengas cada parte de una interacción lo más breve posible para que tu sitio web tenga las mejores posibilidades de cumplir con el umbral "bueno" de la métrica Interaction to Next Paint (INP), independientemente del dispositivo del usuario. Mantener bajo control la demora de entrada es solo una parte para cumplir con ese umbral.
Por lo tanto, te recomendamos que intentes lograr la demora de entrada más corta posible para cumplir con el umbral "bueno" de la INP. Sin embargo, debes tener en cuenta que no puedes esperar eliminar por completo los retrasos de entrada. Siempre que evites el trabajo excesivo del subproceso principal mientras los usuarios intentan interactuar con tu página, la demora de entrada debería ser lo suficientemente baja como para evitar problemas.
Cómo minimizar el retraso de entrada
Como se mencionó anteriormente, cierta demora de entrada es inevitable, pero, por otro lado, cierta demora de entrada se puede evitar. A continuación, se incluyen algunos aspectos que debes tener en cuenta si tienes problemas con retrasos de entrada prolongados.
Evita los temporizadores recurrentes que inician un trabajo excesivo en el subproceso principal.
En JavaScript, hay dos funciones de temporizador de uso frecuente que pueden contribuir al retraso de la entrada: setTimeout y setInterval. La diferencia entre ambos es que setTimeout programa una devolución de llamada para que se ejecute después de un tiempo especificado. Por otro lado, setInterval programa una devolución de llamada para que se ejecute cada n milisegundos de forma indefinida o hasta que se detenga el temporizador con clearInterval.
setTimeout no es problemático en sí mismo; de hecho, puede ser útil para evitar tareas largas. Sin embargo, depende de cuándo se produce el tiempo de espera y de si el usuario intenta interactuar con la página cuando se ejecuta la devolución de llamada del tiempo de espera.
Además, setTimeout se puede ejecutar en un bucle o de forma recurrente, donde actúa más como setInterval, aunque preferiblemente no se programa la siguiente iteración hasta que se complete la anterior. Si bien esto significa que el bucle cederá el control al subproceso principal cada vez que se llame a setTimeout, debes asegurarte de que su devolución de llamada no termine realizando un trabajo excesivo.
setInterval ejecuta una devolución de llamada en un intervalo y, por lo tanto, es mucho más probable que se interponga en las interacciones. Esto se debe a que, a diferencia de una sola instancia de una llamada a setTimeout, que es una devolución de llamada única que puede interferir en una interacción del usuario, la naturaleza recurrente de setInterval hace que sea mucho más probable que interfiera en una interacción, lo que aumenta la demora de entrada de la interacción.
setInterval que contribuye al retraso de la entrada, como se muestra en el panel de rendimiento de las Herramientas para desarrolladores de Chrome. La demora de entrada agregada hace que las devoluciones de llamada de eventos para la interacción se ejecuten más tarde de lo que podrían hacerlo de otra manera.
Si los temporizadores se producen en código propio, tienes control sobre ellos. Evalúa si los necesitas o haz todo lo posible para reducir el trabajo en ellos tanto como sea posible. Sin embargo, los temporizadores en las secuencias de comandos de terceros son otra historia. A menudo, no tienes control sobre lo que hace una secuencia de comandos de terceros, y corregir los problemas de rendimiento en el código de terceros suele implicar trabajar con las partes interesadas para determinar si una secuencia de comandos de terceros determinada es necesaria y, de ser así, establecer contacto con un proveedor de secuencias de comandos de terceros para determinar qué se puede hacer para corregir los problemas de rendimiento que puedan causar en tu sitio web.
Evita las tareas largas
Una forma de mitigar los retrasos de entrada prolongados es evitar las tareas largas. Cuando tienes un trabajo excesivo en el subproceso principal que lo bloquea durante las interacciones, se agregará a la demora de entrada antes de que las tareas largas hayan tenido la oportunidad de finalizar.
Además de minimizar la cantidad de trabajo que realizas en una tarea (y siempre debes esforzarte por realizar la menor cantidad de trabajo posible en el subproceso principal), puedes mejorar la capacidad de respuesta a la entrada del usuario dividiendo las tareas largas.
Ten en cuenta la superposición de interacciones
Una parte particularmente difícil de optimizar la INP puede ser si tienes interacciones que se superponen. La superposición de interacciones significa que, después de interactuar con un elemento, realizas otra interacción con la página antes de que la interacción inicial haya tenido la oportunidad de renderizar el siguiente fotograma.
Las fuentes de superposición de interacciones pueden ser tan simples como que los usuarios realicen muchas interacciones en un período breve. Esto puede ocurrir cuando los usuarios escriben en campos de formulario, donde pueden ocurrir muchas interacciones con el teclado en un período muy corto. Si el trabajo en un evento clave es especialmente costoso, como en el caso común de los campos de autocompletado en los que se realizan solicitudes de red a un backend, tienes un par de opciones:
- Considera reducir el rebote de las entradas para limitar la cantidad de veces que se ejecuta una devolución de llamada de evento en un período determinado.
- Usa
AbortControllerpara cancelar las solicitudes defetchsalientes, de modo que el subproceso principal no se congestione con la administración de las devoluciones de llamada defetch. Nota: La propiedadsignalde una instancia deAbortControllertambién se puede usar para anular eventos.
Otra fuente de aumento de la demora de entrada debido a interacciones superpuestas pueden ser las animaciones costosas. En particular, las animaciones en JavaScript pueden activar muchas llamadas a requestAnimationFrame, lo que puede interferir en las interacciones del usuario. Para solucionar este problema, usa animaciones de CSS siempre que sea posible para evitar poner en cola fotogramas de animación potencialmente costosos. Sin embargo, si lo haces, asegúrate de evitar las animaciones no compuestas para que las animaciones se ejecuten principalmente en los subprocesos de la GPU y del compositor, y no en el subproceso principal.
Conclusión
Si bien las demoras de entrada pueden no representar la mayor parte del tiempo que tardan en ejecutarse las interacciones, es importante comprender que cada parte de una interacción ocupa una cantidad de tiempo que puedes reducir. Si observas un retraso de entrada prolongado, tienes oportunidades para reducirlo. Evitar las devoluciones de llamada de temporizadores recurrentes, dividir las tareas largas y tener en cuenta la posible superposición de interacciones puede ayudarte a reducir la demora de entrada, lo que genera una interactividad más rápida para los usuarios de tu sitio web.