Découvrez ce qu'est le délai d'entrée et apprenez à le réduire pour une interactivité plus rapide.
Les interactions sur le Web sont complexes, car elles impliquent toutes sortes d'activités dans le navigateur. Cependant, ils ont tous en commun d'entraîner un certain délai d'entrée avant que leurs rappels d'événements ne commencent à s'exécuter. Dans ce guide, vous allez découvrir ce qu'est le délai d'entrée et ce que vous pouvez faire pour le réduire afin que les interactions de votre site Web s'exécutent plus rapidement.
Qu'est-ce que le délai de réponse à l'entrée utilisateur ?
Le délai d'entrée est la période qui s'écoule entre la première interaction de l'utilisateur avec une page (par exemple, en appuyant sur un écran, en cliquant avec une souris ou en appuyant sur une touche) et le début de l'exécution des rappels d'événement pour l'interaction. Chaque interaction commence par un certain délai d'entrée.
Une partie du délai d'entrée est inévitable : il faut toujours un certain temps au système d'exploitation pour reconnaître un événement d'entrée et le transmettre au navigateur. Cependant, cette partie du délai d'entrée n'est souvent même pas perceptible, et d'autres événements se produisent sur la page elle-même, ce qui peut rendre les délais d'entrée suffisamment longs pour causer des problèmes.
Comment envisager le délai d'entrée
En règle générale, vous devez faire en sorte que chaque partie d'une interaction soit aussi courte que possible afin que votre site Web ait les meilleures chances d'atteindre le seuil "bon" de la métrique Interaction to Next Paint (INP), quel que soit l'appareil de l'utilisateur. Contrôler le délai d'entrée n'est qu'une partie de l'équation.
Par conséquent, vous devez viser le délai d'entrée le plus court possible pour atteindre le seuil "bon " de l'INP. Sachez toutefois que vous ne pouvez pas espérer éliminer complètement les délais d'entrée. Tant que vous évitez de surcharger le thread principal lorsque les utilisateurs tentent d'interagir avec votre page, le délai d'entrée devrait être suffisamment faible pour éviter les problèmes.
Comment réduire le délai d'entrée
Comme indiqué précédemment, un certain délai d'entrée est inévitable, mais d'un autre côté, certains délais d'entrée peuvent être évités. Voici quelques points à prendre en compte si vous rencontrez des problèmes de latence d'entrée.
Évitez les minuteurs récurrents qui déclenchent un travail excessif sur le thread principal
Il existe deux fonctions de minuteur couramment utilisées en JavaScript qui peuvent contribuer au délai d'entrée : setTimeout et setInterval. La différence entre les deux est que setTimeout planifie l'exécution d'un rappel après un délai spécifié. setInterval, en revanche, planifie l'exécution d'un rappel toutes les n millisecondes, indéfiniment ou jusqu'à ce que le minuteur soit arrêté avec clearInterval.
setTimeout n'est pas problématique en soi. En fait, cela peut être utile pour éviter les tâches longues. Toutefois, cela dépend du moment où le délai avant expiration se produit et de la tentative de l'utilisateur d'interagir avec la page lors de l'exécution du rappel de délai avant expiration.
De plus, setTimeout peut être exécuté en boucle ou de manière récursive, où il agit davantage comme setInterval, mais de préférence sans planifier l'itération suivante tant que la précédente n'est pas terminée. Cela signifie que la boucle cédera la place au thread principal chaque fois que setTimeout sera appelé. Vous devez donc veiller à ce que son rappel n'effectue pas un travail excessif.
setInterval exécute un rappel à intervalles réguliers et est donc beaucoup plus susceptible d'interférer avec les interactions. En effet, contrairement à une seule instance d'un appel setTimeout, qui est un rappel ponctuel susceptible d'interférer avec une interaction utilisateur, la nature récurrente de setInterval augmente considérablement la probabilité qu'il interfère avec une interaction, ce qui augmente le délai d'entrée de l'interaction.
setInterval précédent contribuant au délai d'entrée, comme illustré dans le panneau "Performances" des outils pour les développeurs Chrome. Le délai d'entrée ajouté entraîne l'exécution des rappels d'événements pour l'interaction plus tard que prévu.
Si les minuteurs se produisent dans du code propriétaire, vous pouvez les contrôler. Évaluez si vous en avez besoin ou faites de votre mieux pour réduire au maximum le travail qu'ils contiennent. Cependant, les minuteurs dans les scripts tiers sont une autre histoire. Vous n'avez souvent aucun contrôle sur ce que fait un script tiers. Pour résoudre les problèmes de performances dans le code tiers, vous devez souvent collaborer avec les parties prenantes pour déterminer si un script tiers donné est nécessaire. Si c'est le cas, vous devez contacter un fournisseur de scripts tiers pour déterminer ce qui peut être fait pour résoudre les problèmes de performances qu'il peut causer sur votre site Web.
Éviter les tâches longues
Pour réduire les longs délais d'entrée, vous pouvez éviter les tâches longues. Lorsque le thread principal est surchargé et qu'il est bloqué pendant les interactions, cela augmente le délai d'entrée avant que les tâches longues n'aient pu se terminer.
En plus de minimiser la quantité de travail que vous effectuez dans une tâche (et vous devez toujours vous efforcer d'effectuer le moins de travail possible sur le thread principal), vous pouvez améliorer la réactivité aux entrées utilisateur en divisant les tâches longues.
Faites attention au chevauchement des interactions
L'optimisation de l'INP peut s'avérer particulièrement difficile si vous avez des interactions qui se chevauchent. Le chevauchement d'interactions signifie qu'après avoir interagi avec un élément, vous effectuez une autre interaction avec la page avant que l'interaction initiale n'ait eu l'occasion d'afficher l'image suivante.
Les sources de chevauchement d'interactions peuvent être aussi simples que des utilisateurs effectuant de nombreuses interactions sur une courte période. Cela peut se produire lorsque les utilisateurs saisissent des données dans des champs de formulaire, où de nombreuses interactions au clavier peuvent se produire sur une très courte période. Si le travail sur un événement clé est particulièrement coûteux (comme dans le cas courant des champs de saisie semi-automatique où des requêtes réseau sont envoyées à un backend), vous avez plusieurs options :
- Envisagez d'utiliser la fonctionnalité anti-rebond pour les entrées afin de limiter le nombre de fois qu'un rappel d'événement s'exécute sur une période donnée.
- Utilisez
AbortControllerpour annuler les requêtesfetchsortantes afin que le thread principal ne soit pas encombré par la gestion des rappelsfetch. Remarque : La propriétésignald'une instanceAbortControllerpeut également être utilisée pour annuler des événements.
Les animations coûteuses peuvent également augmenter le délai d'entrée en raison d'interactions qui se chevauchent. En particulier, les animations en JavaScript peuvent déclencher de nombreux appels requestAnimationFrame, ce qui peut interférer avec les interactions des utilisateurs. Pour contourner ce problème, utilisez des animations CSS chaque fois que possible afin d'éviter de mettre en file d'attente des frames d'animation potentiellement coûteux. Toutefois, si vous le faites, veillez à éviter les animations non composées afin que les animations s'exécutent principalement sur les threads du GPU et du compositeur, et non sur le thread principal.
Conclusion
Même si les délais d'entrée ne représentent pas la majeure partie du temps d'exécution de vos interactions, il est important de comprendre que chaque partie d'une interaction prend un certain temps que vous pouvez réduire. Si vous observez un délai d'entrée long, vous pouvez le réduire. Éviter les rappels de minuteur récurrents, diviser les tâches longues et être conscient des chevauchements d'interactions potentiels peut vous aider à réduire le délai d'entrée, ce qui permet d'accélérer l'interactivité pour les utilisateurs de votre site Web.