Signatur
Beschreibung
Die schreibgeschützte Eigenschaft firstInterimResponseStart gibt einen hochauflösenden Zeitstempel (DOMHighResTimeStamp) zurück. Er wird gesetzt, sobald der Browser das erste Byte der ersten vorläufigen Antwort mit einem 1xx-Statuscode vom Server erhält, also zum Beispiel 100 Continue oder 103 Early Hints. Hat der Server keine vorläufige Antwort geschickt, ist der Wert 0.
Seit es diese Eigenschaft gibt, hat sich auch die Bedeutung von responseStart geändert: Es markiert jetzt den Empfang des ersten Bytes der ersten Antwort, egal ob vorläufig oder endgültig. Das erste Byte der endgültigen Antwort (meist 200) steht in finalResponseHeadersStart. Damit lässt sich genau messen, wie viel früher der Browser dank Early Hints Unterressourcen vorladen konnte.
Typisch wird die Eigenschaft für Real-User-Monitoring genutzt: Man prüft, ob ein CDN oder Server tatsächlich 103 Early Hints sendet, und rechnet die Zeitspanne zwischen vorläufiger und endgültiger Antwort aus. Das ist die „Denkzeit“ des Servers, die der Browser zum Vorladen nutzen kann. Weil PerformanceNavigationTiming von PerformanceResourceTiming erbt, gibt es die Eigenschaft auch für das Hauptdokument.
Rückgabewert
performance.timeOrigin, gemessen direkt nach dem ersten Byte der ersten 1xx-Antwort. 0, wenn es keine vorläufige Antwort gab oder die Ressource ursprungsübergreifend ist und keinen Timing-Allow-Origin-Header hat.Beispiele
Early Hints beim Seitenaufruf erkennen
const [nav] = performance.getEntriesByType('navigation');
if (nav && nav.firstInterimResponseStart > 0) {
const vorsprung = nav.finalResponseHeadersStart - nav.firstInterimResponseStart;
console.log(`103 Early Hints empfangen, ${vorsprung.toFixed(1)} ms vor der endgültigen Antwort`);
} else {
console.log('Keine vorläufige 1xx-Antwort erhalten');
}
Ressourcen mit vorläufiger Antwort per PerformanceObserver sammeln
const observer = new PerformanceObserver((list) => {
for (const entry of list.getEntries()) {
if (entry.firstInterimResponseStart > 0) {
console.log(entry.name, {
interim: Math.round(entry.firstInterimResponseStart),
final: Math.round(entry.finalResponseHeadersStart)
});
}
}
});
observer.observe({ type: 'resource', buffered: true });
Funktionserkennung und Übermittlung an ein Monitoring
const reportEarlyHints = () => {
const [nav] = performance.getEntriesByType('navigation');
if (!nav || !('firstInterimResponseStart' in nav)) {
return; // Browser unterstützt die Eigenschaft nicht
}
const payload = JSON.stringify({
url: location.pathname,
earlyHints: nav.firstInterimResponseStart > 0,
interimStart: nav.firstInterimResponseStart,
finalStart: nav.finalResponseHeadersStart
});
navigator.sendBeacon('/rum', payload);
};
addEventListener('pagehide', reportEarlyHints, { once: true });
// Wichtig · Fallstricke
- Browser-Kompatibilität: Bisher nur in Chromium-Browsern (ab Version 115). Firefox und Safari kennen die Eigenschaft nicht, dort ist sie
undefined. Deshalb vorher mit'firstInterimResponseStart' in entryprüfen. 0ist mehrdeutig: Der Wert kann bedeuten „keine 1xx-Antwort“ oder „Zeitangaben aus Datenschutzgründen versteckt“. Bei ursprungsübergreifenden Ressourcen ohneTiming-Allow-Origin-Header ist der Wert immer0.responseStarthat eine neue Bedeutung: In unterstützenden Browsern zeigtresponseStartjetzt das erste Byte der ersten (möglicherweise vorläufigen) Antwort. Wer die Time to First Byte (TTFB) der endgültigen Antwort braucht, nimmtfinalResponseHeadersStart.- Es wird nur die erste 1xx-Antwort erfasst. Weitere vorläufige Antworten tauchen nicht auf.
- Kommt die Antwort aus einem Cache (z. B. HTTP-Cache oder Service Worker), gibt es meist keine vorläufige Antwort und der Wert ist
0.