Signatur
Beschreibung
Die Eigenschaft initiatorType eines PerformanceResourceTiming-Eintrags zeigt, wodurch eine Ressource angefordert wurde. Ihr Wert ist eine kleingeschriebene Zeichenkette, zum Beispiel "img", "script", "link", "css", "fetch", "xmlhttprequest", "beacon", "iframe", "video", "audio", "navigation" oder "other".
Die Zuordnung funktioniert so:
- Wurde die Ressource über ein HTML-Element angefordert, steht dort der lokale Name des Elements (
img,script,link,input,object…). - Kam die Anforderung aus CSS (
url(),@import, Web-Fonts), lautet der Wert"css". - Bei Anfragen per
fetch(),XMLHttpRequestodernavigator.sendBeacon()steht dort"fetch","xmlhttprequest"bzw."beacon". - Beim Hauptdokument (
PerformanceNavigationTiming) ist der Wert"navigation".
In der Praxis braucht man initiatorType für Real-User-Monitoring (RUM) und Performance-Analysen: Ladezeiten und Übertragungsgrößen lassen sich damit nach Ressourcentyp gruppieren, etwa um langsame Bilder, blockierende Skripte oder viele API-Aufrufe zu finden. Zu beachten ist, dass der Wert den Auslöser der Anfrage beschreibt und nicht den Inhaltstyp: Ein per fetch() geladenes Bild hat den Wert "fetch", nicht "img".
Rückgabewert
"img", "script", "css", "fetch", "xmlhttprequest", "navigation" oder "other".Beispiele
Alle geladenen Ressourcen mit Auslöser auflisten
const entries = performance.getEntriesByType('resource');
for (const entry of entries) {
console.log(`${entry.initiatorType.padEnd(15)} ${Math.round(entry.duration)} ms ${entry.name}`);
}
Ladezeit und Übertragungsgröße nach Typ gruppieren
const stats = performance
.getEntriesByType('resource')
.reduce((acc, { initiatorType, duration, transferSize }) => {
const s = (acc[initiatorType] ??= { anzahl: 0, dauerMs: 0, bytes: 0 });
s.anzahl += 1;
s.dauerMs += Math.round(duration);
s.bytes += transferSize;
return acc;
}, {});
console.table(stats);
Langsame API-Aufrufe live mit PerformanceObserver erkennen
const observer = new PerformanceObserver((list) => {
for (const entry of list.getEntries()) {
const istApi = entry.initiatorType === 'fetch' || entry.initiatorType === 'xmlhttprequest';
if (istApi && entry.duration > 500) {
console.warn(`Langsamer API-Aufruf (${Math.round(entry.duration)} ms): ${entry.name}`);
}
}
});
observer.observe({ type: 'resource', buffered: true });
// Testaufruf
await fetch('/api/reports?jahr=2024');
// Wichtig · Fallstricke
- Auslöser, nicht Inhaltstyp:
initiatorTypesagt nichts über den MIME-Typ aus. Ein Bild perfetch()ergibt"fetch", ein Stylesheet per<link rel="stylesheet">ergibt"link", eine darin referenzierte Schrift aber"css". Wer den Inhaltstyp braucht, kann die Dateiendung inentry.nameauswerten oder in neueren Chromium-VersionencontentTypenutzen. - Uneinheitliche Werte: Je nach Browser und Version können Ressourcen unterschiedlich zugeordnet werden (z. B.
"other"statt eines konkreten Werts, oder"link"beipreload). Für Auswertungen besser eine Standard-Kategorie für unbekannte Werte vorsehen. - Puffergröße: Der Resource-Timing-Puffer umfasst standardmäßig nur etwa 250 Einträge. Bei vielen Ressourcen
performance.setResourceTimingBufferSize()erhöhen oder einenPerformanceObservernutzen. - Cross-Origin:
initiatorTypeist auch bei fremden Ursprüngen verfügbar, detaillierte Zeitwerte und Größen (transferSizeusw.) jedoch nur mit dem HeaderTiming-Allow-Origin. - Kompatibilität: Wird in allen modernen Browsern und in Node.js (ab 18 über
perf_hooks, dort beifetchals"fetch") unterstützt.