Hier erfährst du, was Eingabeverzögerung ist und wie du sie für eine schnellere Interaktion reduzieren kannst.
Interaktionen im Web sind kompliziert und es gibt zahlreiche Aktivitäten im Browser, um sie zu fördern. Sie alle haben jedoch gemeinsam, dass sie eine gewisse Eingabeverzögerung verursachen, bevor ihre Ereignis-Callbacks ausgeführt werden. In diesem Leitfaden erfahren Sie, was Eingabeverzögerung ist und wie Sie sie minimieren können, damit die Interaktionen auf Ihrer Website schneller ausgeführt werden.
Was ist Eingabeverzögerung?
Die Eingabeverzögerung ist der Zeitraum von der ersten Interaktion des Nutzers mit einer Seite, z. B. Tippen auf einen Bildschirm, Klicken mit der Maus oder Drücken einer Taste, bis zu dem Beginn der Ereignisrückrufe für die Interaktion. Jede Interaktion beginnt mit einer gewissen Eingabeverzögerung.
Ein Teil der Eingabeverzögerung ist unvermeidbar: 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 wahrnehmbar. Es gibt andere Dinge, die auf der Seite selbst passieren und dazu führen können, dass die Eingabeverzögerungen so lange dauern, dass Probleme auftreten.
Was bedeutet Eingabeverzögerung?
Generell ist es wichtig, jeden Teil einer Interaktion so kurz wie möglich zu halten, damit Ihre Website unabhängig vom Gerät des Nutzers möglichst den Grenzwert für die Interaktion mit dem nächsten Paint (INP) erreicht. Die Eingabeverzögerungen zu prüfen, ist nur ein Teil der Erreichung dieses Grenzwerts.
Sie könnten versucht sein, sich die Grenzwerte für die First Input Delay (FID) anzusehen, um die Zulässigkeit für Eingabeverzögerungen zu bestimmen. Der „gute“ Grenzwert für FID beträgt jedoch 100 Millisekunden oder weniger. Wenn Sie diesen Grenzwert überschreiten, weisen Sie die Hälfte Ihres Budgets für INP allein der Eingabeverzögerung zu. Dies ist nicht empfehlenswert, wenn Sie bedenken, dass eine Interaktion auch Zeit benötigt, um Ereignis-Callbacks auszuführen und den Browser den nächsten Frame darzustellen.
Um den „guten“ Grenzwert von INP zu erreichen, sollten Sie eine möglichst kürzeste Eingabeverzögerung anstreben. Sie sollten jedoch nicht davon ausgehen, dass sie vollständig beseitigt wird, da dies unmöglich ist. Solange Sie die übermäßige Arbeit des Hauptthreads vermeiden, während Nutzer mit Ihrer Seite interagieren, sollte die Eingabeverzögerung niedrig genug sein, um Probleme zu vermeiden.
Eingangsverzögerung minimieren
Wie bereits erwähnt, ist eine gewisse Eingabeverzögerung unvermeidbar, andererseits eine gewisse Eingabeverzögerung vermeidbar. Hier sind einige Dinge, die Sie berücksichtigen sollten, wenn Sie Probleme mit langen Eingabeverzögerungen haben.
Vermeiden Sie wiederkehrende Timer, die zu viel Arbeit im Hauptthread einleiten.
Es gibt zwei häufig verwendete Timerfunktionen in JavaScript, die zur Eingabeverzögerung beitragen können: setTimeout
und setInterval
. Der Unterschied zwischen den beiden besteht darin, dass setTimeout
die Ausführung eines Callbacks nach einer bestimmten Zeit plant. setInterval
hingegen plant einen Callback, der dauerhaft alle n Millisekunden ausgeführt wird oder so lange, bis der Timer mit clearInterval
gestoppt wird.
setTimeout
ist an sich kein Problem. Es kann sogar hilfreich sein, um langwierige Aufgaben zu vermeiden. Sie hängt jedoch davon ab, wann das Zeitlimit auftritt und ob der Nutzer versucht, mit der Seite zu interagieren, wenn der Zeitüberschreitungs-Callback ausgeführt wird.
Außerdem kann setTimeout
in einer Schleife oder rekursiv ausgeführt werden, wobei es sich ähnlich wie setInterval
verhält, wobei die nächste Iteration vorzugsweise erst nach Abschluss der vorherigen geplant wird. Das bedeutet, dass die Schleife bei jedem Aufruf von setTimeout
an den Hauptthread übergeben wird. Sie sollten jedoch darauf achten, dass der Callback nicht übermäßig viel Arbeit in Anspruch nimmt.
setInterval
führt einen Callback in einem Intervall aus und behindert Interaktionen daher viel eher. Im Gegensatz zu einer einzelnen Instanz eines setTimeout
-Aufrufs, bei dem es sich um einen einmaligen Callback handelt, der einer Nutzerinteraktion möglicherweise im Weg steht, ist es aufgrund des wiederkehrenden Charakters von setInterval
viel wahrscheinlicher, dass er einer Interaktion gestört wird. Dadurch erhöht sich die Eingabeverzögerung der Interaktion.
Wenn Timer in eigenen Code ausgeführt werden, haben Sie die Kontrolle über sie. Bewerten Sie, ob Sie sie brauchen, oder geben Sie Ihr Bestes, um den darin enthaltenen Arbeitsaufwand so weit wie möglich zu reduzieren. Bei Timern von Drittanbietern sieht das jedoch anders aus. Häufig haben Sie keine Kontrolle über die Funktionsweise von Drittanbieter-Skripts. Um Leistungsprobleme im Code von Drittanbietern zu beheben, müssen Sie häufig gemeinsam mit Stakeholdern ermitteln, ob ein bestimmtes Drittanbieterskript erforderlich ist. Wenden Sie sich in diesem Fall an einen Skriptanbieter des Drittanbieters, um herauszufinden, wie Leistungsprobleme behoben werden können, die diese auf Ihrer Website verursachen könnten.
Lange Aufgaben vermeiden
Eine Möglichkeit, lange Eingabeverzögerungen abzuschwächen, besteht darin, lange Aufgaben zu vermeiden. Wenn Sie übermäßig viele Hauptthread-Arbeiten haben, die den Hauptthread während Interaktionen blockieren, erhöht dies die Eingabeverzögerung für sie, bevor die langen Aufgaben abgeschlossen werden konnten.
Neben der Minimierung des Arbeitsaufwands in einer Aufgabe – und Sie sollten sich immer bemühen, möglichst wenig Arbeit am Hauptthread zu erledigen, können Sie die Reaktionsfähigkeit auf Nutzereingaben verbessern, indem Sie lange Aufgaben aufteilen.
Interaktionsüberschneidungen berücksichtigen
Eine besonders schwierige Aufgabe bei der INP-Optimierung kann sein, wenn sich Interaktionen überschneiden. Eine Interaktionsüberschneidung bedeutet, dass Sie nach der Interaktion mit einem Element eine weitere Interaktion mit der Seite durchführen, bevor die erste Interaktion den nächsten Frame rendern konnte.
Die Quellen der Interaktionsüberschneidung können so einfach sein, dass Nutzende in kurzer Zeit viele Interaktionen ausführen. Dies kann vorkommen, wenn Nutzer Text in Formularfelder eingeben, wo viele Tastaturinteraktionen in sehr kurzer Zeit erfolgen 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 gestellt werden, haben Sie mehrere Möglichkeiten:
- Sie können Eingaben entprellen, um zu begrenzen, wie oft ein Ereignisrückruf in einem bestimmten Zeitraum ausgeführt wird.
- Verwenden Sie
AbortController
, um ausgehendefetch
-Anfragen abzubrechen, damit der Hauptthread bei der Verarbeitung vonfetch
-Callbacks nicht überlastet wird. Hinweis: Das Attributsignal
einerAbortController
-Instanz kann auch zum Abbrechen von Ereignissen verwendet werden.
Eine weitere Ursache für eine erhöhte Eingabeverzögerung aufgrund von sich überschneidenden Interaktionen können teure Animationen sein. Insbesondere durch Animationen in JavaScript können viele requestAnimationFrame
-Aufrufe ausgelöst werden, die Nutzerinteraktionen behindern könnten. Um dies zu umgehen, sollten Sie nach Möglichkeit CSS-Animationen verwenden, um potenziell teure Animationsframes zu vermeiden. In diesem Fall sollten Sie jedoch nicht zusammengesetzte Animationen vermeiden, damit Animationen hauptsächlich in GPU- und Compositor-Threads ausgeführt werden und nicht im Hauptthread.
Fazit
Auch wenn die Eingabeverzögerungen nicht den Großteil der Zeit ausmachen, die Ihre Interaktionen benötigen, ist es wichtig zu verstehen, dass jeder Teil einer Interaktion viel Zeit in Anspruch nimmt, die Sie reduzieren können. Wenn Sie eine lange Eingabeverzögerung beobachten, können Sie sie reduzieren. Indem Sie wiederkehrende Timer-Rückrufe vermeiden, lange Aufgaben aufteilen und sich mögliche Interaktionsüberschneidungen bewusst sind, können Sie die Eingabeverzögerung reduzieren und so die Interaktivität Ihrer Website-Nutzer beschleunigen.
Hero-Image aus Unsplash von Erik Mclean