Start · Sprachen · JavaScript · Referenz · PerformanceResourceTiming.firstInterimResponseStart

PerformanceResourceTiming.firstInterimResponseStart

Eigenschaft

Liefert den <code>DOMHighResTimeStamp</code> direkt nach Empfang des ersten Bytes der ersten vorläufigen 1xx-Antwort (z. B. <code>103 Early Hints</code>) oder <code>0</code>.

seit JavaScript Chromium 115+ (Chrome, Edge, Opera); nicht in Fire Kategorie: webapi

Signatur

PerformanceResourceTiming.firstInterimResponseStart

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

Typ
DOMHighResTimeStamp (number)
Beschreibung
Millisekunden relativ zu 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');
}
103 Early Hints empfangen, 184.3 ms vor der endgültigen Antwort

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 });
https://example.com/api/upload { interim: 812, final: 1034 }

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 entry prüfen.
  • 0 ist mehrdeutig: Der Wert kann bedeuten „keine 1xx-Antwort“ oder „Zeitangaben aus Datenschutzgründen versteckt“. Bei ursprungsübergreifenden Ressourcen ohne Timing-Allow-Origin-Header ist der Wert immer 0.
  • responseStart hat eine neue Bedeutung: In unterstützenden Browsern zeigt responseStart jetzt das erste Byte der ersten (möglicherweise vorläufigen) Antwort. Wer die Time to First Byte (TTFB) der endgültigen Antwort braucht, nimmt finalResponseHeadersStart.
  • 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.