Prerendering und Prefetching
Beim Prerendering und Prefecthing geht es um zwei unterschiedliche, aber ähnliche Techniken zur schnelleren Darstellung von Webseiten im Browser, nachdem der User auf einen Link geklickt hat.
Es gibt Situationen in denen eine Webseite mit hoher Wahrscheinlichkeit weiß, welche Webseite ein Benutzer als nächstes besucht, z.B. das erste Ergebnis bei der Google Suche oder eine Folgeseite bei einem mehrseitigen Artikel. In genau diesen Fällen erscheint es sinnvoll mit dem Laden dieser Seite zu beginnen während der Benutzer noch die aktuelle Seite betrachtet, so dass beim Click für diese Seite schon möglichst viel Vorarbeit geleistet ist.
Es gibt einige Bedenken und Vorurteile (z.B. dass man damit vermeintlich ungewollt illegale Links aufrufen kann), die gegen den Einsatz dieser Techniken sprechen, die bei genauerer Betrachtung aber recht unbegründet sind; die Entwickler der Browser gehen hier mit Bedacht vor. Außerdem kann man dies in den jeweiligen Einstellungen auch deaktivieren.
Die Requests zu diesen beiden Techniken sind in den Standardentwicklerwerkzeugen der Browser leider nicht sichtbar, so dass man zur Analyse und zum Debugging auf externe Tools zurückgreifen muss, z.B. Wireshark.
HTTP Request Header
Sollten beim Testen unerwartete Ergebnisse zu beobachten sein sollte man bedenken, dass viele Webserver “Prefetch” Anfragen unterdrücken, weil deren Betreiber den Traffic fürchten, der nicht direkt zu einer Page Impression führt.
Man kann dies im HTTP Request Header wie folgt feststellen:
| X-moz: prefetch | Diesen nicht standardisierten Header schickt Firefox mit, sobald es eine Prefetch Anweisung ausführt. |
| X-Purpose: instant | Google Chrome lädt z.T. eine Webseite, noch bevor man in der URL-Eingabezeile auf Enter drückt, und kennzeichnet dies durch diesen Header |
| Page Visibility W3C Working Draft | Beim Google Chrome Prefetching wird derzeit kein Extra-Header mitgeschickt, man kann dies aber durch die Chrome eigene Page Visibility API in Javascript herausfinden und dort dann im Code entsprechend reagieren. Unter den Entwicklern wird diskutuiert ob in Zukunft ein entsprechender X-Purpose-Header mitgeschickt werden soll. |
Der Server kann Prefechtiung auch direkt untersagen, in dem er folgenden Header (oder analog im entsprechenden http-equiv-element im head) mitschickt:
x-dns-prefetch-control: off
Prefetching in Firefox 7
Unterstützte Link-Typen
- dns-prefetch
- prefech
- next
Firefox lädt nur Seiten die im HTTP-Header mittles Link-Element vom Typ “prefetch” oder aber mittels Link-Element vom Typ “next” (allgemeine Informationen zum Link-Element) im aktuellen Dokument angegeben werden (mehr dazu findet man im FAQ von Mozilla). Alternativ ist auch die gleichwertige Schreibweise mittles http-equiv im head-Teil des HTML-Dokumentes zulässig. Dabei muss es eine URL ohne Aufrufparameter sein, die mit dem Protokoll HTTP ausgeliefert wird, da sonst kein Caching erfolgen würde und der Request keinen Mehrwert bringen würde.
Es wird nur das angegebene Objekt (Seite oder Bild) geladen; keine weiteren abhängigen script-, link-, oder img-Elemente einer bereits im Voraus geladenen Seite. Allerdings macht Firefox für die beteiligten Hosts schon einmal alle nötigen DNS-Lookups. Beim Prefetching gibt es keine same-origin Policy, da dies die Browsersicherheit nicht erhöhen würde. Jedes externe Element kann vorgeladen werden, genau wie es direkt in der Webseite geladen werden könnte.
Die Geschwindigkeitsvorteile beim Prefetching sind leider nicht wirklich groß, da der meiste (größte) Content oft in Sub-Ressourcen (CSS, JS, Medien) steckt, die eben nicht vorgeladen werden. Auch per Javascript nachgeladene Fragmente oder Modifikationen werden nicht berücksichtigt.
Prerendering in Chrome 14
Unterstützte Link-Typen
- dns-prefetch
- prerender
Prerendering erweitert das Konzept des Prefetchings, ersetzt es seit Chrome 13 sogar komplett. Statt nur das Hauptdokument zu laden werden auch alle Abhängigkeiten geladen und auch alle Elemente fertig geparst. Das Anzeigen einer vorgerenderten Seite kann man dann am ehesten mit einem Tab-Wechsel vergleichen.
Nur noch DNS-Prefetching Anweisungen führen nur dazu, dass die DNS Einträge der entsprechenden Links vorab aufgelöst werden.
Deshalb gibt es auch einen neuen Typ für link-Elemente – “prerender”. Dieser sorgt dafür, dass der Browser nach dem erfolgreichen Laden der aktuellen Seite damit beginnt die dort angegebene Seite zu redern. Zum Testen stellt Google eine Seite bereit, mit der man einfach jede Seite vorrendern lassen und dann einfach “umschalten” kann. Die Ergebnisse sind z.T. wirklich beeindruckend. Hier wird auch deutlich: diese Link-Elemente können auch während der Benutzer bereits der Seite ist mittels Javascript angelegt und verändert werden.
Eine Erkennung wie der Aufruf erfolgt ist (also ob die Seite wirklich angezeigt wird) ist nur im Javascript Kontext möglich, mit der Page Visibility API. Google Analytics z.B. nutzt diese bereits um zu unterscheiden wie die Seite geladen wurde um die Views korrekt zu ermitteln.
Google Chrome ignoriert die link-Typen prefetch und next. Es wird pro Browserinstanz immer genau eine Seite vorgerenderet, aber nur wenn das letzte prerendern mindestens 0,5s zurück liegt.
Einen Einblick in die aktuelle Arbeit des Prerenderers erhält man unter chrome://net-internals/#prerenderer.
In einigen Fällen stoppt das Prerendern ohne weitere Meldung direkt wenn es dazu kommen könnte, dass der User inkorrekten Content sehen könnte. Hier eine Liste, ohne Anspruch auf Vollständigkeit:
- ein Download wird initiiert
- HTMLAudio oder Video in der Seite
- ein POST, PUT oder DELETE in einem XMLHTTPRequest
- HTTP Authentifizierung
- HTTPS
- Seiten die eine Malware-Warnung auslösen
- ein Popup oder eine neue Window Erzeugung
- sobald eine Webseite ungewöhnlich viele Ressourcen beansprucht
- Plugins wie z.B. würden geladen
DNS-Prefetching, bzw. Pre-Resolving
DNS-Prefetching, also lediglich das vorab Auflösen der Hostnamen der später zu ladenden Ressourcen, hat mit Abstand das Beste Kosten-Nutzen Verhältnis. Dies wirkt sich umso stärker aus, je größer die Latenz der Verbindung ist, also am besten z.B. bei mobilen Anschlüssen.
Dies geschieht mit dem link type “dns-prefetch”. Chrome befrägt den DNS Server z.B. auch bereits bei der Eingabe der URL und holt auch bei jedem Start die Adressen der 10 zuletzt aufgerufenen Hosts.
Prefetching in Internet Explorer 9, Safari 5.0.1 und Opera 11
Zu guter Letzt noch ein Wort zu den anderen großen Browsern: seit der Version 9 kann auch der Browser aus dem Hause Microsoft DNS-Prefetching (verhält sich wie Chrome, löst zusätzlich pretch link-Elemente auf als wäre es dns-prefetch), ebenso wie Safari 5.0.1. Opera benutzt bisher noch kein DNS-Prefetching.
