Signatur
Beschreibung
Die Eigenschaft contentType eines PerformanceResourceTiming-Eintrags gibt an, welchen Inhaltstyp die geladene Ressource hatte. Der Wert stammt aus dem Content-Type-Antwortheader, wird aber vom Browser vereinfacht: Parameter wie charset=utf-8 fallen weg, und verwandte Typen werden zusammengefasst. Alle JavaScript-MIME-Typen werden zum Beispiel zu text/javascript, alle JSON-Typen zu application/json.
Nützlich ist die Eigenschaft vor allem beim Real User Monitoring (RUM). Damit lassen sich Ladezeiten und Übertragungsgrößen nach Ressourcenart auswerten, etwa um zu sehen, wie viele Bytes Skripte, Stylesheets oder Bilder zusammen ausmachen. Das ist genauer als eine Einordnung über initiatorType, denn initiatorType beschreibt nur, wie die Ressource angefordert wurde (z. B. fetch, link, img), und nicht, was tatsächlich zurückkam.
Kennt der Browser den MIME-Typ nicht, fehlt der Header oder werden die Informationen aus Sicherheitsgründen zurückgehalten, ist der Wert ein leerer String "". Die Eigenschaft ist schreibgeschützt.
Rückgabewert
"text/css", "text/javascript", "application/json" oder "image/svg+xml". Ist der Typ unbekannt oder nicht zugänglich, kommt ein leerer String "" zurück.Beispiele
Inhaltstypen aller geladenen Ressourcen ausgeben
const entries = performance.getEntriesByType('resource');
for (const entry of entries) {
console.log(`${entry.contentType || '(unbekannt)'} – ${entry.name}`);
}
Übertragene Bytes nach Inhaltstyp zusammenrechnen
const bytesByType = performance
.getEntriesByType('resource')
.reduce((acc, { contentType, transferSize }) => {
const key = contentType || 'unbekannt';
acc[key] = (acc[key] ?? 0) + transferSize;
return acc;
}, {});
console.table(bytesByType);
Langsame JSON-Antworten per PerformanceObserver erkennen (mit Feature-Erkennung)
const supportsContentType =
'PerformanceResourceTiming' in window &&
'contentType' in PerformanceResourceTiming.prototype;
if (supportsContentType) {
const observer = new PerformanceObserver((list) => {
for (const entry of list.getEntries()) {
if (entry.contentType === 'application/json' && entry.duration > 500) {
console.warn(`Langsame API-Antwort (${Math.round(entry.duration)} ms):`, entry.name);
}
}
});
observer.observe({ type: 'resource', buffered: true });
} else {
console.info('contentType wird in diesem Browser nicht unterstützt.');
}
// Beispielanfrage
await fetch('/api/reports?range=365');
// Wichtig · Fallstricke
- Browser-Kompatibilität: Bisher nur in Chromium-Browsern verfügbar (ab Version 129). Firefox und Safari kennen die Eigenschaft nicht, dort ist der Wert
undefined. Vorher per'contentType' in PerformanceResourceTiming.prototypeprüfen. - Kein vollständiger Header: Der Wert ist absichtlich vereinfacht.
text/html; charset=utf-8wird zutext/html, undapplication/x-javascriptwird zutext/javascript. Wer den genauen Header braucht, muss ihn überfetch()undresponse.headers.get('Content-Type')lesen. - Leerer String: Der Wert ist
"", wenn der Browser den MIME-Typ nicht unterstützt, der Header fehlt oder ungültig ist, oder wenn der Browser die Angabe aus Datenschutzgründen zurückhält, etwa bei Cross-Origin-Antworten ohne CORS. Auswertungen sollten diesen Fall immer abdecken. - Kein Ersatz für
initiatorType: Ein<link rel=\"preload\">kann ein Skript laden, und einfetch()kann ein Bild laden.contentTypebeschreibt die Antwort,initiatorTypedie Art der Anfrage. - Puffergröße: Standardmäßig speichert der Browser nur eine begrenzte Zahl von Ressourceneinträgen (oft 250). Bei vielen Anfragen
performance.setResourceTimingBufferSize()erhöhen oder einenPerformanceObserververwenden.