Hier erfahren Sie, was Eingabeverzögerung ist und wie Sie sie für eine schnellere Interaktivität reduzieren können.
Interaktionen im Web sind kompliziert, da im Browser alle möglichen Aktivitäten stattfinden, um sie zu ermöglichen. Sie alle haben jedoch gemeinsam, dass es zu einer gewissen Eingabeverzögerung kommt, bevor ihre Ereignis-Callbacks ausgeführt werden. In diesem Leitfaden erfahren Sie, was Eingabeverzögerung ist und was Sie tun können, um sie zu minimieren, damit die Interaktionen auf Ihrer Website schneller ablaufen.
Was ist die Eingabeverzögerung?
Eingabeverzögerung ist der Zeitraum, der beginnt, wenn der Nutzer zum ersten Mal mit einer Seite interagiert, z. B. durch Tippen auf einen Bildschirm, Klicken mit einer Maus oder Drücken einer Taste, und endet, wenn die Event-Callbacks für die Interaktion ausgeführt werden. Jede Interaktion beginnt mit einer gewissen Eingabeverzögerung.
Ein Teil der Eingabeverzögerung ist unvermeidlich: Es dauert immer eine gewisse Zeit, bis das Betriebssystem ein Eingabeereignis erkennt und an den Browser übergibt. Dieser Teil der Eingabeverzögerung ist jedoch oft nicht einmal spürbar. Es gibt andere Dinge, die auf der Seite selbst passieren und die zu Eingabeverzögerungen führen können, die lang genug sind, um Probleme zu verursachen.
Überlegungen zur Eingabeverzögerung
Im Allgemeinen sollten Sie jeden Teil einer Interaktion so kurz wie möglich halten, damit Ihre Website unabhängig vom Gerät des Nutzers die INP-Schwelle (Interaction to Next Paint) für „gut“ erreicht. Die Eingabeverzögerung im Blick zu behalten, ist nur ein Teil der Lösung.
Daher sollten Sie versuchen, die Eingabeverzögerung so gering wie möglich zu halten, um den INP-Schwellenwert „gut“ zu erreichen. Sie sollten jedoch bedenken, dass Eingabeverzögerungen nicht vollständig vermieden werden können. Solange Sie übermäßige Hauptthread-Arbeit vermeiden, während Nutzer versuchen, mit Ihrer Seite zu interagieren, sollte die Eingabeverzögerung niedrig genug sein, um Probleme zu vermeiden.
Eingabeverzögerung minimieren
Wie bereits erwähnt, ist eine gewisse Eingabeverzögerung unvermeidlich, aber andererseits ist eine gewisse Eingabeverzögerung vermeidbar. Hier sind einige Dinge, die Sie beachten sollten, wenn Sie mit langen Eingabeverzögerungen zu kämpfen haben.
Wiederkehrende Timer vermeiden, die zu viel Arbeit im Hauptthread auslösen
Es gibt zwei häufig verwendete Timerfunktionen in JavaScript, die zu Eingabeverzögerungen führen können: setTimeout und setInterval. Der Unterschied zwischen den beiden besteht darin, dass mit setTimeout ein Callback für die Ausführung nach einer bestimmten Zeit geplant wird. setInterval plant hingegen einen Rückruf, der alle n Millisekunden ausgeführt wird, bis der Timer mit clearInterval beendet wird.
setTimeout ist an sich nicht problematisch, sondern kann sogar hilfreich sein, um lange Aufgaben zu vermeiden. Das hängt jedoch davon ab, wann das Zeitlimit eintritt und ob der Nutzer versucht, mit der Seite zu interagieren, wenn der Zeitlimit-Callback ausgeführt wird.
Außerdem kann setTimeout in einer Schleife oder rekursiv ausgeführt werden, wobei es eher wie setInterval funktioniert. Die nächste Iteration sollte jedoch erst geplant werden, wenn die vorherige abgeschlossen ist. Das bedeutet, dass die Schleife jedes Mal, wenn setTimeout aufgerufen wird, den Hauptthread unterbricht. Sie sollten jedoch darauf achten, dass der Callback nicht zu viel Arbeit verrichtet.
setInterval führt einen Callback in einem Intervall aus und beeinträchtigt daher viel wahrscheinlicher Interaktionen. Im Gegensatz zu einem einzelnen setTimeout-Aufruf, der ein einmaliger Callback ist, der eine Nutzerinteraktion möglicherweise behindert, ist es bei setInterval aufgrund der wiederkehrenden Natur viel wahrscheinlicher, dass er eine Interaktion behindert und somit die Eingabeverzögerung der Interaktion erhöht.
setInterval-Aufruf registriert wurde und zur Eingabeverzögerung beiträgt, wie im Leistungsbereich der Chrome-Entwicklertools dargestellt. Die zusätzliche Eingabeverzögerung führt dazu, dass die Event-Callbacks für die Interaktion später als sonst ausgeführt werden.
Wenn Zeitgeber in Ihrem eigenen Code verwendet werden, haben Sie die Kontrolle darüber. Prüfen Sie, ob Sie sie benötigen, oder versuchen Sie, den Arbeitsaufwand so weit wie möglich zu reduzieren. Bei Timern in Drittanbieterskripten ist das jedoch anders. Sie haben oft keine Kontrolle darüber, was ein Drittanbieter-Script tut. Um Leistungsprobleme in Drittanbieter-Code zu beheben, müssen Sie häufig mit Stakeholdern zusammenarbeiten, um festzustellen, ob ein bestimmtes Drittanbieter-Script erforderlich ist. Wenn ja, müssen Sie sich an einen Drittanbieter-Script-Anbieter wenden, um herauszufinden, was getan werden kann, um Leistungsprobleme zu beheben, die durch das Script auf Ihrer Website verursacht werden.
Lange Aufgaben vermeiden
Eine Möglichkeit, lange Eingabeverzögerungen zu vermeiden, besteht darin, lange Aufgaben zu vermeiden. Wenn Sie zu viele Hauptthread-Vorgänge haben, die den Hauptthread während der Interaktionen blockieren, wird die Eingabeverzögerung für diese Vorgänge verlängert, bis die langen Aufgaben abgeschlossen sind.
Neben der Minimierung des Arbeitsaufwands in einer Aufgabe – Sie sollten immer versuchen, so wenig Arbeit wie möglich im Hauptthread zu erledigen – können Sie die Reaktionsfähigkeit auf Nutzereingaben verbessern, indem Sie lange Aufgaben aufteilen.
Überschneidungen bei Interaktionen berücksichtigen
Eine besonders schwierige Aufgabe bei der Optimierung von INP kann es sein, wenn sich Interaktionen überschneiden. „Überlappende Interaktionen“ bedeutet, dass Sie nach der Interaktion mit einem Element eine weitere Interaktion mit der Seite ausführen, bevor der nächste Frame der ursprünglichen Interaktion gerendert werden konnte.
Die Ursachen für Überschneidungen bei Interaktionen können ganz einfach sein, z. B. wenn Nutzer viele Interaktionen in kurzer Zeit ausführen. Das kann passieren, wenn Nutzer Formularfelder ausfüllen, da hier viele Tastaturinteraktionen in sehr kurzer Zeit stattfinden können. Wenn die Arbeit an einem Schlüsselereignis besonders aufwendig ist, z. B. bei Feldern für die automatische Vervollständigung, bei denen Netzwerkanfragen an ein Back-End gesendet werden, haben Sie mehrere Möglichkeiten:
- Sie sollten Eingaben entprellen, um die Anzahl der Ausführungen eines Ereignis-Callbacks in einem bestimmten Zeitraum zu begrenzen.
- Verwenden Sie
AbortController, um ausgehendefetch-Anfragen abzubrechen, damit der Hauptthread nicht durch die Verarbeitung vonfetch-Callbacks überlastet wird. Hinweis: Diesignal-Property einerAbortController-Instanz kann auch zum Abbrechen von Ereignissen verwendet werden.
Eine weitere Quelle für eine erhöhte Eingabeverzögerung aufgrund von sich überschneidenden Interaktionen können aufwendige Animationen sein. Insbesondere bei Animationen in JavaScript kann es zu vielen requestAnimationFrame-Aufrufen kommen, die Nutzerinteraktionen behindern. Verwenden Sie daher nach Möglichkeit CSS-Animationen, um das Einreihen potenziell aufwendiger Animationsframes in die Warteschlange zu vermeiden. Achten Sie dabei jedoch darauf, nicht zusammengesetzte Animationen zu vermeiden, damit Animationen hauptsächlich auf der GPU und den Compositor-Threads und nicht auf dem Hauptthread ausgeführt werden.
Fazit
Eingabeverzögerungen machen zwar möglicherweise nicht den Großteil der Zeit aus, die für die Ausführung Ihrer Interaktionen benötigt wird, aber es ist wichtig zu wissen, dass jeder Teil einer Interaktion Zeit in Anspruch nimmt, die Sie reduzieren können. Wenn Sie eine lange Eingabeverzögerung feststellen, können Sie diese reduzieren. Wenn Sie wiederkehrende Timer-Callbacks vermeiden, lange Aufgaben aufteilen und auf potenzielle Überschneidungen bei Interaktionen achten, können Sie die Eingabeverzögerung verringern und die Interaktivität für die Nutzer Ihrer Website beschleunigen.
Hero-Image von Unsplash, von Erik Mclean.