Start · Sprachen · JavaScript · Referenz · PerformanceResourceTiming.domainLookupStart

PerformanceResourceTiming.domainLookupStart

Eigenschaft

Liefert einen <code>DOMHighResTimeStamp</code> unmittelbar bevor der Browser die DNS-Abfrage für eine Ressource startet.

seit JavaScript Baseline: alle modernen Browser (Resource Timing L Kategorie: webapi

Signatur

PerformanceResourceTiming.domainLookupStart

Beschreibung

Die schreibgeschützte Eigenschaft domainLookupStart eines PerformanceResourceTiming-Eintrags gibt den Zeitpunkt an, direkt bevor der Browser mit der Namensauflösung (DNS-Lookup) für die Domain einer Ressource beginnt. Der Wert ist ein hochauflösender Zeitstempel in Millisekunden relativ zu performance.timeOrigin.

Zusammen mit domainLookupEnd lässt sich die DNS-Dauer einer Anfrage berechnen: domainLookupEnd - domainLookupStart. Das ist nützlich, um langsame DNS-Server, fehlende dns-prefetch-/preconnect-Hinweise oder zu viele verschiedene Drittanbieter-Domains zu erkennen.

Wird eine persistente Verbindung wiederverwendet oder stammt die Ressource aus dem Cache bzw. dem DNS-Cache, entspricht domainLookupStart in der Regel domainLookupEnd (und oft fetchStart) – die DNS-Dauer ist dann 0.

Rückgabewert

Typ
DOMHighResTimeStamp (number)
Beschreibung
Zeitstempel in Millisekunden vor Beginn der DNS-Abfrage. 0 bei Cross-Origin-Ressourcen ohne passenden Timing-Allow-Origin-Header.

Beispiele

DNS-Dauer aller geladenen Ressourcen ermitteln

const entries = performance.getEntriesByType('resource');

for (const entry of entries) {
  const dns = entry.domainLookupEnd - entry.domainLookupStart;
  if (dns > 0) {
    console.log(`${entry.name}: DNS ${dns.toFixed(1)} ms`);
  }
}
https://cdn.example.com/app.js: DNS 23.4 ms

Neue Ressourcen per PerformanceObserver überwachen

const observer = new PerformanceObserver((list) => {
  for (const entry of list.getEntries()) {
    const dns = entry.domainLookupEnd - entry.domainLookupStart;
    if (dns > 50) {
      console.warn(`Langsamer DNS-Lookup (${dns.toFixed(0)} ms) für ${new URL(entry.name).hostname}`);
    }
  }
});

observer.observe({ type: 'resource', buffered: true });
Langsamer DNS-Lookup (87 ms) für fonts.example.net

DNS-Zeit pro Domain aggregieren (Kandidaten für dns-prefetch)

const dnsPerHost = new Map();

for (const entry of performance.getEntriesByType('resource')) {
  // Eingeschränkte Cross-Origin-Einträge (0-Werte) ausfiltern
  if (entry.domainLookupStart === 0) continue;
  const host = new URL(entry.name).hostname;
  const dns = entry.domainLookupEnd - entry.domainLookupStart;
  dnsPerHost.set(host, Math.max(dnsPerHost.get(host) ?? 0, dns));
}

console.table(Object.fromEntries(dnsPerHost));
┌───────────────────┬────────┐ │ cdn.example.com │ 23.4 │ │ api.example.com │ 0 │ └───────────────────┴────────┘

// Wichtig · Fallstricke

  • Cross-Origin-Einschränkung: Bei Ressourcen anderer Herkunft liefert die Eigenschaft 0, sofern der Server keinen Header Timing-Allow-Origin (z. B. Timing-Allow-Origin: * oder die eigene Origin) sendet. Vor Berechnungen immer auf 0 prüfen, sonst entstehen verfälschte Werte.
  • Bei wiederverwendeten Verbindungen, DNS-Cache oder HTTP-Cache ist die Differenz zu domainLookupEnd 0 – das ist kein Fehler.
  • Der Zeitstempel ist relativ zu performance.timeOrigin, nicht zur Unix-Epoche; für absolute Zeiten performance.timeOrigin + wert verwenden.
  • Die Zeitauflösung kann aus Datenschutzgründen (Schutz vor Timing-Angriffen) gerundet sein, abhängig von Cross-Origin-Isolation.
  • Der Ressourcen-Puffer ist standardmäßig begrenzt (oft 250 Einträge); mit performance.setResourceTimingBufferSize() anpassen oder einen PerformanceObserver nutzen.
  • Wird von allen modernen Browsern unterstützt, auch in Web Workern.