Signatur
Beschreibung
Die Eigenschaft finalResponseHeadersStart eines PerformanceResourceTiming-Eintrags gibt an, wann das erste Byte der endgültigen HTTP-Antwort angekommen ist. Gemeint ist die Antwort mit einem abschließenden Statuscode (2xx, 3xx, 4xx, 5xx), nicht aber eine vorläufige 1xx-Antwort wie 103 Early Hints.
Mit Early Hints hat sich die Bedeutung von responseStart verändert: Es markiert jetzt das erste Byte irgendeiner Antwort, also bei Bedarf auch das der vorläufigen 103-Antwort. Damit man die tatsächliche Server-Verarbeitungszeit bis zur endgültigen Antwort weiterhin messen kann, gibt es finalResponseHeadersStart. Zusammen mit firstInterimResponseStart lässt sich sauber auseinanderhalten, wann die Early Hints ankamen und wann die eigentliche Antwort folgte.
Typische Anwendungsfälle:
- Die „echte“ Time to First Byte (TTFB) der endgültigen Antwort berechnen, auch wenn Early Hints aktiv sind.
- Messen, wie viel Zeit Early Hints gewinnen, als Abstand zwischen
firstInterimResponseStartundfinalResponseHeadersStart. - Die Leistung im Feld (RUM) über
PerformanceObserverfür Navigationen und Ressourcen erfassen.
Weil PerformanceNavigationTiming von PerformanceResourceTiming erbt, gibt es die Eigenschaft auch im Navigationseintrag des Dokuments selbst. Dort ist sie am aufschlussreichsten, denn Early Hints werden praktisch nur für Navigationen versendet.
Rückgabewert
performance.timeOrigin, gemessen unmittelbar nach dem ersten Byte der endgültigen Antwort. Gab es keine vorläufige Antwort, ist der Wert gleich responseStart. Bei ursprungsfremden Ressourcen ohne passenden Timing-Allow-Origin-Header ist er 0.Beispiele
TTFB der endgültigen Navigationsantwort ermitteln
const [nav] = performance.getEntriesByType('navigation');
if (nav && 'finalResponseHeadersStart' in nav) {
// TTFB der endgültigen Antwort, unabhängig von Early Hints
const finalTtfb = nav.finalResponseHeadersStart - nav.startTime;
console.log(`Endgültige TTFB: ${finalTtfb.toFixed(1)} ms`);
} else {
// Fallback für Browser ohne Unterstützung
console.log(`TTFB (Fallback): ${nav.responseStart.toFixed(1)} ms`);
}
Zeitgewinn durch 103 Early Hints messen
const [nav] = performance.getEntriesByType('navigation');
const interim = nav.firstInterimResponseStart ?? 0;
const final = nav.finalResponseHeadersStart ?? 0;
if (interim > 0 && final > 0) {
console.log(`Early Hints kamen ${(final - interim).toFixed(1)} ms vor der endgültigen Antwort an.`);
} else {
console.log('Keine Early Hints empfangen oder keine Browser-Unterstützung.');
}
Ressourcen per PerformanceObserver überwachen
const observer = new PerformanceObserver((list) => {
for (const entry of list.getEntries()) {
const final = entry.finalResponseHeadersStart;
if (!final) continue; // 0 = ohne Timing-Allow-Origin oder nicht unterstützt
const serverWait = final - entry.requestStart;
console.log(`${entry.name}: Server-Wartezeit ${serverWait.toFixed(1)} ms`);
}
});
observer.observe({ type: 'resource', buffered: true });
// Wichtig · Fallstricke
- Browser-Kompatibilität: Die Eigenschaft gibt es bislang nur in Chromium-basierten Browsern ab Version 115. In Firefox und Safari ist sie
undefined. Prüfe deshalb vor der Nutzung mit'finalResponseHeadersStart' in entryund falle bei Bedarf aufresponseStartzurück. - Ursprungsfremde Ressourcen: Ohne den Antwort-Header
Timing-Allow-Originliefert die Eigenschaft0. Wer daraus Differenzen berechnet, ohne vorher zu prüfen, bekommt negative oder unsinnige Werte. - Verhältnis zu
responseStart: Ohne vorläufige 1xx-Antwort sind beide Werte gleich. Mit Early Hints istresponseStartkleiner, weil es das erste Byte der 103-Antwort markiert. Bestehende TTFB-Auswertungen auf Basis vonresponseStartkönnen sich dadurch scheinbar verbessern. - Weiterleitungen: Der Wert bezieht sich auf die endgültige Antwort der letzten Anfrage. Zwischengeschaltete 3xx-Weiterleitungen fließen über
redirectStart/redirectEndin die Gesamtzeit ein. - Die Zeitstempel können aus Datenschutzgründen gerundet werden (Schutz vor Timing-Angriffen). Mit ganz kleinen Differenzen sollte man daher vorsichtig umgehen.