Prefetching, Preloading, Preebrowsing

Avatar of Robin Rendle
Robin Rendle am

DigitalOcean bietet Cloud-Produkte für jede Phase Ihrer Reise. Starten Sie mit 200 $ kostenlosem Guthaben!

Wenn wir über Frontend-Performance sprechen, denken wir an Dinge wie Konkatenation, Minifizierung, Caching oder Gzipping von Assets auf dem Server, damit die Seite schneller geladen wird und Benutzer ihre Ziele so schnell wie möglich erreichen können.

Das Vorabrufen von Ressourcen ist eine weitere Technik zur Leistungssteigerung. Wir können sie verwenden, um dem Browser mitzuteilen, welche Assets der Benutzer möglicherweise in Zukunft benötigt – noch bevor er sie überhaupt benötigt.

Patrick Hamann erklärt

Pre-fetching ist eine Möglichkeit, dem Browser Hinweise auf Ressourcen zu geben, die definitiv in Zukunft verwendet werden oder werden könnten. Einige Hinweise beziehen sich auf die aktuelle Seite, andere auf mögliche zukünftige Seiten.

Als Entwickler kennen wir unsere Anwendungen besser als der Browser. Wir können diese Informationen nutzen, um den Browser über Kernressourcen zu informieren.

Diese Praxis, zu erraten, was Benutzer benötigen, bevor sie es brauchen, wurde als Prebrowsing bezeichnet. Es handelt sich jedoch nicht um eine einzelne Technik, sondern sie gliedert sich in eine Reihe verschiedener Techniken: dns-prefetch, subresource, das Standard-prefetch, preconnect und prerender.

DNS-Prefetching

Dies informiert den Client darüber, dass wir später Assets von einer bestimmten URL benötigen werden, damit der Browser die DNS-Auflösung so schnell wie möglich durchführen kann. Sagen wir, wir benötigen eine Ressource wie ein Bild oder eine Audiodatei von der URL example.com. Im <head> des Dokuments würden wir schreiben

<link rel="dns-prefetch" href="//example.com">

Wenn wir dann eine Datei davon anfordern, müssen wir nicht mehr auf die DNS-Auflösung warten. Dies ist besonders nützlich, wenn wir Code von Drittanbietern oder Ressourcen von sozialen Netzwerken verwenden, von denen wir möglicherweise ein Widget über ein <script> laden.

In seinem epischen Beitrag zur Frontend-Performance schlägt Harry Roberts vor, diese Technik zu verwenden

Diese einfache Zeile weist unterstützende Browser an, mit dem Vorabrufen der DNS für diese Domäne einen Bruchteil einer Sekunde bevor sie tatsächlich benötigt wird zu beginnen. Das bedeutet, dass der DNS-Lookup-Prozess bereits im Gange ist, wenn der Browser auf das Skriptelement trifft, das das Widget tatsächlich anfordert. Es gibt dem Browser einfach einen kleinen Vorsprung.

Dies mag wie eine so geringfügige Leistungsverbesserung erscheinen, dass sie nicht sehr wichtig ist, aber das ist nicht unbedingt der Fall – Chrome macht ständig etwas Ähnliches. Es löst die DNS automatisch vorab auf (und manchmal sogar die Seite vorab), wenn Sie nur einen kleinen Teil der Domäne in die Adressleiste eingeben, wodurch Millisekunden bei jeder Anfrage eingespart werden.

Preconnect

Ähnlich wie bei der DNS-Prefetch-Methode löst Preconnect die DNS auf, aber es führt auch den TCP-Handshake und die optionale TLS-Aushandlung durch. Es kann wie folgt verwendet werden

<link rel="preconnect" href="https://css-tricks.de">

Für weitere Informationen hat Ilya Grigorik einen großartigen Beitrag über diesen praktischen Ressourcenhinweis verfasst.

Moderne Browser tun ihr Bestes, um vorherzusagen, welche Verbindungen die Website vor der eigentlichen Anfrage benötigen wird. Durch die frühzeitige Einleitung von „Preconnects“ kann der Browser die notwendigen Sockets im Voraus einrichten und die kostspieligen DNS-, TCP- und TLS-Roundtrips aus dem kritischen Pfad der eigentlichen Anfrage eliminieren. Allerdings können moderne Browser, so intelligent sie auch sind, nicht zuverlässig alle Preconnect-Ziele für jede Website vorhersagen.

Die gute Nachricht ist, dass wir endlich dem Browser helfen können; wir können dem Browser mitteilen, welche Sockets wir benötigen werden, bevor die eigentlichen Anfragen gestellt werden, über den neuen Preconnect-Hinweis, der in Firefox 39 und Chrome 46 verfügbar ist!

Prefetching

Wenn wir sicher sind, dass eine bestimmte Ressource in Zukunft benötigt wird, können wir den Browser bitten, diesen Artikel anzufordern und ihn für spätere Referenzen im Cache zu speichern. Zum Beispiel ein Bild oder ein Skript oder wirklich alles, was vom Browser gecached werden kann.

<link rel="prefetch" href="image.png">

Im Gegensatz zu DNS-Prefetching fordern wir diese Ressource tatsächlich an, laden sie herunter und speichern sie im Cache. Dies hängt jedoch von einer Reihe von Bedingungen ab, da Prefetching vom Browser ignoriert werden kann. Beispielsweise kann ein Client die Anforderung einer großen Schriftdatei über ein langsames Netzwerk abbrechen. Firefox ruft nur dann Ressourcen im Voraus ab, wenn „der Browser im Leerlauf ist“.

Wie Bram Stein in seinem Beitrag zu diesem Thema erklärt, könnte dies enorme Leistungsvorteile für Webfonts haben. Derzeit müssen Schriftdateien auf die Konstruktion von DOM und CSSOM warten, bevor sie überhaupt heruntergeladen werden. Wenn wir sie jedoch vorab abrufen, kann dieser Engpass leicht umgangen werden.

Hinweis: Obwohl das Vorabrufen von Assets früher schwierig zu testen war, zeigen Chrome und Firefox jetzt vorab abgerufene Ressourcen im Network-Panel an. Außerdem ist es hilfreich zu bedenken, dass es für Link-Prefetching keine Same-Origin-Beschränkung gibt.

Subressourcen (siehe Hinweis)

Eine weitere Prefetching-Technik hilft bei der Identifizierung der Ressourcen mit der höchsten Priorität, die vor den vorab abgerufenen Elementen angefordert werden sollten. Zum Beispiel könnten wir in Chrome und Opera Folgendes zum head unseres Dokuments hinzufügen

<link rel="subresource" href="styles.css">

Laut den Chromium-Dokumenten funktioniert es so

„LINK rel=subresource“ bietet einen neuen Link-Relationstyp mit anderer Semantik als LINK rel=prefetch. Während rel=prefetch einen Download von Ressourcen mit niedriger Priorität für nachfolgende Seiten bietet, ermöglicht rel=subresource das frühzeitige Laden von Ressourcen innerhalb der aktuellen Seite.

Wenn die Ressource also für die aktuelle Seite benötigt wird oder so schnell wie möglich benötigt wird, dann ist es wahrscheinlich am besten, subresource zu verwenden, andernfalls bleiben Sie bei prefetch.

Wichtige Hinweise: Andy Davies klärt, wie sie tatsächlich funktionieren. Außerdem scheint es aus Chrome entfernt zu werden.

Seiten vorab rendern

Dies ist die Atombombe, da prerender uns die Möglichkeit gibt, alle Assets eines bestimmten Dokuments im Voraus zu laden, wie zum Beispiel

<link rel="prerender" href="https://css-tricks.de">

Steve Souders hat eine großartige Erklärung zu dieser Technik verfasst.

Dies ist, als würde man die URL in einem versteckten Tab öffnen – alle Ressourcen werden heruntergeladen, das DOM wird erstellt, die Seite wird layoutet, die CSS wird angewendet, das JavaScript wird ausgeführt usw. Wenn der Benutzer zur angegebenen href navigiert, wird die versteckte Seite eingeblendet, sodass sie sofort geladen zu werden scheint. Google Suche hat diese Funktion seit Jahren unter dem Namen Instant Pages. Microsoft hat kürzlich angekündigt, Prerender auf ähnliche Weise in Bing auf IE11 zu verwenden.

Aber Vorsicht! Sie sollten wahrscheinlich sicher sein, dass der Benutzer auf diesen Link klickt, sonst lädt der Client alle notwendigen Assets zum Rendern der Seite ohne Grund herunter.

Souders fährt fort

Wie bei jeder dieser antizipatorischen Arbeiten besteht das Risiko, dass die Vorhersage falsch ist. Wenn die antizipatorische Arbeit teuer ist (z. B. die CPU von anderen Prozessen stiehlt, Akku verbraucht oder Bandbreite verschwendet), ist Vorsicht geboten. Es scheint schwierig zu sein, vorherzusagen, zu welcher Seite Benutzer als nächstes wechseln werden, aber Szenarien mit hoher Sicherheit existieren.

  • Wenn der Benutzer eine Suche mit einem offensichtlichen Ergebnis durchgeführt hat, wird die Ergebnisübersichtsseite wahrscheinlich als nächstes geladen.
  • Wenn der Benutzer zu einer Anmeldeseite navigiert hat, kommt wahrscheinlich als nächstes die angemeldete Seite.
  • Wenn der Benutzer einen mehrseitigen Artikel oder eine paginierte Ergebnismenge liest, ist die Seite nach der aktuellen Seite wahrscheinlich die nächste.

Schließlich kann die Page Visibility API verwendet werden, um zu verhindern, dass Skripte ausgeführt werden, bevor sie auf dem Bildschirm des Benutzers angezeigt werden.

OK, mit diesen Designüberlegungen aus dem Weg können wir über zukünftige Ergänzungen zur Spezifikation sprechen, die ebenfalls von Interesse sein könnten.

Zukünftige Option: Preloading

Eine neue Spezifikation namens preload schlägt vor, dass es manchmal am besten ist, ein Asset **immer** herunterzuladen, unabhängig davon, ob der Browser dies für eine gute Idee hält oder nicht. Im Gegensatz zum Vorabrufen von Assets, das ignoriert werden kann, **müssen** vorab geladene Assets vom Browser angefordert werden.

<link rel="preload" href="image.png">

Obwohl Preloading derzeit von keinem Browser unterstützt wird, ist die Idee dahinter sicherlich interessant.

Zusammenfassung

Vorauszusehen, was unsere Benutzer als nächstes tun werden, ist schwierig und erfordert sicherlich viel Planung und Tests. Aber die Leistungsvorteile sind es definitiv wert, verfolgt zu werden. Wenn wir bereit sind, mit diesen Prefetching-Techniken zu experimentieren, werden wir die Benutzererfahrung sicherlich spürbar verbessern.

Weitere Informationen zu Prefetching-, Preloading- und Prebrowsing-Techniken