Das Chrome-Team arbeitet an einem Reboot für Prerender. Mit Chrome 108 (der aktuellen Version) gibt es wieder einen Prerendering-Hint. Den gab es vor Jahren schon mal. Zusammen mit dns-prefetch, prefetch und preload. Du konntest damit sagen: Wenn jemand auf URL A ist, dann ist es wahrscheinlich, dass der nächste Seitenaufruf URL B. Daher kannst Du – lieber Browser – diese zweite URL schon mal im Hintergrund laden und rendern, damit der nächste Seitenaufruf fix funktioniert. Das wurde nicht so richtig verwendet, hat daher zu mehr unnützen Ladevorgägen und reichlich Konfusion im Analytics geführt.
Ich bin ja alt genug, um zu sagen „Das hat noch nie funktioniert.” Aber möglicherweise hast Du gerade einen Use-Case dafür? Dann solltest Du Dir den Blogbeitrag einmal durchlesen. Der zeigt Dir, dass die Probleme von damals durchaus aufgenommen worden sind. Jetzt gibt es mehrere Kandidaten und man ist dabei ein Werk an Regeln zu entwickeln, mit denen der Browser entscheiden kann, unter welchen Umständen welche Ressource zu laden ist. Immerhin werden die Prerender-Requests einen weiteren HTTP-Header bekommen:
Sec-Purpose: prefetch;prerender
Damit können wir nicht nur den Request unter Umständen runter priorisieren oder blockieren, sondern auch eine Maßnahme einbauen, die das Tracking blockiert, bis die Seite wirklich für den User sichtbar ist. Das bedeutet auch, dass die Implementierung ein größeres Thema ist als ein prerender-Link im html. Caching, CDNs und CMS Infrastruktur müssen darauf abgestimmt werden, die neuen HTTP-Header korrekt zu verarbeiten.
Ich halte das nicht für ein Geschenk, sondern glaube, dass es zu komplex wird für einen zu geringen Performance-Gewinn. Aber gerade in einem mehrstufigen Sales-Funnel oder anderen linearen Prozessen kann das extrem hilfreich sein, falls das Feature breiter adoptiert wird.
Vielleicht ist eine Single Page Application Logik schneller und einfacher umgesetzt für einen ähnlichen Performance-Gewinn.
Was meinst Du? Fehleranfällig und over-engineered? Oder fantastisch und ökonomisch?