Jetzt neu: NoState Prefetch

Katie Hempenius
Katie Hempenius

Veröffentlicht: 20. Juli 2018

Einleitung

NoState Prefetch ist ein neuer Mechanismus in Chrome, der eine Alternative zum eingestellten Prerendering-Prozess darstellt und für Funktionen wie <link rel="prerender"> verwendet wird. Wie beim Prerendering werden Ressourcen im Voraus abgerufen. Im Gegensatz zum Prerendering wird jedoch kein JavaScript ausgeführt und kein Teil der Seite im Voraus gerendert. Ziel von NoState Prefetch ist es, weniger Arbeitsspeicher als beim Prerendering zu verwenden und gleichzeitig die Seitenladezeiten zu verkürzen.

NoState Prefetch ist keine API, sondern ein Mechanismus, der von Chrome zur Implementierung verschiedener APIs und Funktionen verwendet wird. Die Resource Hints API sowie das Vorabrufen von Seiten über die Chrome-Adressleiste werden beide mit NoState Prefetch implementiert. Wenn Sie Chrome 63 oder höher verwenden, nutzt Ihr Browser bereits NoState Prefetch für Funktionen wie <link rel="prerender">.

In diesem Artikel wird die Funktionsweise von NoStatePrefetch erläutert. Außerdem erfahren Sie, warum es eingeführt wurde, und erhalten eine Anleitung zur Verwendung der Chrome-Histogramme, um Statistiken zur Nutzung von NoStatePrefetch aufzurufen.

Motivation

Es gab zwei Hauptgründe für die Einführung von NoState Prefetch:

Arbeitsspeichernutzung reduzieren

NoState Prefetch verwendet nur etwa 45 MiB Arbeitsspeicher. Die Wartung des Preload-Scanners ist der primäre Speicheraufwand für NoState Prefetch und dieser Aufwand bleibt in verschiedenen Anwendungsfällen relativ konstant. Eine Erhöhung der Größe oder des Volumens von Abrufen hat keine wesentlichen Auswirkungen auf die Menge des von NoState Prefetch verwendeten Arbeitsspeichers.

Im Gegensatz dazu werden beim Prerendering in der Regel 100 MiB Arbeitsspeicher verbraucht und der Arbeitsspeicherverbrauch ist auf 150 MiB begrenzt. Aufgrund des hohen Arbeitsspeicherverbrauchs ist die Funktion nicht für Low-End-Geräte (d.h. mit ≤ 512 MB RAM) geeignet. Daher wird in Chrome auf Low-End-Geräten kein Prerendering durchgeführt, sondern stattdessen eine Vorverbindung hergestellt.

Unterstützung neuer Webplattformfunktionen erleichtern

Beim Vorrendern dürfen keine nutzerorientierten Aktionen (z.B. Musik- oder Videowiedergabe) oder zustandsbehafteten Aktionen (z.B. Ändern von Sitzungs- oder lokalem Speicher) erfolgen. Es kann jedoch schwierig und komplex sein, diese Aktionen beim Rendern einer Seite zu verhindern. Beim NoState-Prefetch werden nur Ressourcen vorab abgerufen. Es wird kein Code ausgeführt und die Seite wird nicht gerendert. So lässt sich einfacher verhindern, dass nutzerorientierte und zustandsbehaftete Aktionen ausgeführt werden.

Implementierung

Im Folgenden wird beschrieben, wie NoState Prefetch funktioniert.

  1. NoStatePrefetch wird ausgelöst.

    Ein Prerender-Ressourcenhinweis (d.h. <link rel="prerender">) und einige Chrome-Funktionen lösen NoState Prefetch aus, sofern die folgenden beiden Bedingungen erfüllt sind: a) Der Nutzer verwendet kein Low-End-Gerät und b) der Nutzer verwendet kein Mobilfunknetz.

  2. Für NoState-Prefetch wird ein neuer, dedizierter Renderer erstellt.

    In Chrome ist ein Renderer ein Prozess, der für das Abrufen eines HTML-Dokuments, das Parsen des Dokuments, das Erstellen des Renderbaums und das Rendern des Ergebnisses auf dem Bildschirm verantwortlich ist. Jeder Tab in Chrome sowie jeder NoState-Prefetch-Prozess hat einen eigenen Renderer, um die Isolation zu gewährleisten. So werden die Auswirkungen von Problemen (z.B. einem Tab-Absturz) minimiert und verhindert, dass Schadcode auf andere Tabs oder andere Teile des Systems zugreift.

  3. Die Ressource, die mit NoState Prefetch geladen wird, wird abgerufen. Der HTMLPreloadScanner scannt dann diese Ressource, um alle untergeordneten Ressourcen zu ermitteln, die abgerufen werden müssen. Wenn für die Hauptressource oder eine ihrer untergeordneten Ressourcen ein Service Worker registriert ist, werden diese Anfragen über den entsprechenden Service Worker weitergeleitet.

    NoState Prefetch unterstützt nur die HTTP-Methode GET. Es werden keine untergeordneten Ressourcen abgerufen, für die andere HTTP-Methoden erforderlich sind. Außerdem werden keine Ressourcen abgerufen, für die Nutzeraktionen erforderlich sind, z.B. Authentifizierungs-Pop-ups, SSL-Clientzertifikate oder manuelle Überschreibungen.

  4. Unterressourcen, die abgerufen werden, werden mit der Netzwerdpriorität „IDLE“ abgerufen.

    „IDLE“ ist die niedrigste mögliche Netzwerdpriorität in Chrome.

  5. Alle Ressourcen, die vom NoState-Prefetch abgerufen werden, werden gemäß ihren Cache-Headern im Cache gespeichert.

    Beim NoState-Prefetching werden alle Ressourcen im Cache gespeichert, außer denen mit dem Cache-Control-Header no-store. Eine Ressource wird vor der Verwendung neu validiert, wenn ein Vary-Antwortheader oder ein no-cache-Cache-Control-Header vorhanden ist oder wenn die Ressource älter als 5 Minuten ist.

  6. Der Renderer wird beendet, nachdem alle untergeordneten Ressourcen geladen wurden.

    Wenn für untergeordnete Ressourcen eine Zeitüberschreitung auftritt, wird der Renderer nach 30 Sekunden beendet.

  7. Der Browser nimmt keine Zustandsänderungen vor, außer dass er den Cookie-Speicher und den lokalen DNS-Cache aktualisiert. Das ist wichtig, weil es sich hierbei um den „NoState“-Teil von „NoState Prefetch“ handelt.

    An diesem Punkt im „normalen“ Seitenladevorgang würde der Browser wahrscheinlich Aktionen ausführen, die den Browserstatus ändern, z. B. JavaScript ausführen, sessionStorage oder localStorage ändern, Musik oder Videos abspielen, die History API verwenden oder den Nutzer auffordern. Die einzigen Statusänderungen, die bei NoState Prefetch auftreten, sind die Aktualisierung des DNS-Cache beim Eintreffen von Antworten und die Aktualisierung des Cookie-Speichers, wenn eine Antwort den Header Set-Cookie enthält.

  8. Wenn die Ressource benötigt wird, wird sie in das Browserfenster geladen.

    Im Gegensatz zu einer vorgerenderten Seite ist die Seite jedoch nicht sofort sichtbar, sondern muss erst vom Browser gerendert werden. Der Browser verwendet nicht den Renderer, der für das NoState-Prefetching verwendet wurde, sondern einen neuen Renderer. Wenn die Seite nicht im Voraus gerendert wird, sinkt der Arbeitsspeicherverbrauch von NoStatePrefetch. Das kann sich aber auch auf die Seitenladezeiten auswirken.

    Wenn die Seite einen Service Worker hat, wird dieser Seitenaufruf noch einmal über den Service Worker geleitet.

    Wenn NoState Prefetch das Abrufen von untergeordneten Ressourcen nicht abgeschlossen hat, wenn die Seite benötigt wird, setzt der Browser den Seitenladevorgang dort fort, wo NoState Prefetch aufgehört hat. Der Browser muss dann zwar immer noch Ressourcen abrufen, aber nicht so viele, wie es ohne NoState Prefetch der Fall gewesen wäre.

Auswirkungen auf die Webanalyse

Seiten, die mit NoState Prefetch geladen werden, werden von Webanalysetools zu leicht unterschiedlichen Zeiten registriert, je nachdem, ob das Tool Daten clientseitig oder serverseitig erfasst.

Clientseitige Analyseskripts erfassen einen Seitenaufruf, wenn die Seite dem Nutzer angezeigt wird. Diese Skripts basieren auf der Ausführung von JavaScript. Bei NoState Prefetch wird jedoch kein JavaScript ausgeführt.

Serverseitige Analysetools erfassen Messwerte, wenn eine Anfrage bearbeitet wird. Bei Ressourcen, die über NoState Prefetch geladen werden, kann es einen erheblichen Zeitraum zwischen der Verarbeitung einer Anfrage und der tatsächlichen Verwendung der Antwort durch den Client geben (sofern sie überhaupt verwendet wird). Seit Chrome 69 wird mit NoState Prefetch der Header Purpose: Prefetch zu allen Anfragen hinzugefügt, damit sie sich vom normalen Browsen unterscheiden.

Jetzt ansehen

NoStatePrefetch wurde im Dezember 2017 in Chrome 63 eingeführt. Sie wird derzeit für Folgendes verwendet:

  • Ressourcenhinweis prerender implementieren
  • Das erste Ergebnis in den Google-Suchergebnissen abrufen
  • Seiten abrufen, die laut Chrome-Adressleiste wahrscheinlich als Nächstes besucht werden

Mit Chrome Internals können Sie sehen, wie Sie NoStatePrefetch verwendet haben.

Wenn Sie die Liste der Websites aufrufen möchten, die mit NoState Prefetch geladen wurden, rufen Sie chrome://net-internals/#prerender auf.

Wenn Sie Statistiken zur Verwendung von NoState Prefetch aufrufen möchten, rufen Sie chrome://histograms auf und suchen Sie nach „NoStatePrefetch“. Es gibt drei verschiedene NoState Prefetch-Histogramme – eines für jeden Anwendungsfall von NoState Prefetch:

  • „NoStatePrefetch“ (Statistiken zur Nutzung von Prerender-Ressourcenhinweisen)
  • „gws_NoStatePrefetch“ (Statistiken zur Nutzung durch die Google-Suchergebnisseite)
  • „omnibox_NoStatePrefetch“ (Statistiken zur Verwendung der Chrome-Adressleiste)