Signatur
Beschreibung
Die Eigenschaft encodedBodySize eines PerformanceResourceTiming-Eintrags gibt an, wie viele Bytes des Nutzlastkörpers (Body) beim Abruf über HTTP oder aus dem Cache empfangen wurden, bevor eine Inhaltskodierung (Content-Encoding, z. B. gzip, br, zstd) entfernt wurde. HTTP-Header sind darin nicht enthalten.
Damit eignet sie sich, um die tatsächlich übertragene Nutzlast einer Ressource zu messen, etwa zur Überwachung von Bundle-Größen, für Performance-Budgets oder um den Nutzen der Kompression zu beurteilen. Im Vergleich mit decodedBodySize (Größe nach dem Dekodieren) lässt sich das Kompressionsverhältnis berechnen; transferSize enthält zusätzlich die Header und ist bei Cache-Treffern 0.
Die Werte bekommt man über performance.getEntriesByType("resource") oder deutlich besser über einen PerformanceObserver mit dem Typ "resource", der auch später geladene Ressourcen erfasst.
Beispiele
Größen aller geladenen Ressourcen ausgeben
const entries = performance.getEntriesByType('resource');
for (const entry of entries) {
const kb = (entry.encodedBodySize / 1024).toFixed(1);
console.log(`${entry.name}: ${kb} KiB übertragen`);
}
Kompressionsverhältnis mit PerformanceObserver berechnen
const observer = new PerformanceObserver((list) => {
for (const entry of list.getEntries()) {
const { name, encodedBodySize, decodedBodySize } = entry;
if (encodedBodySize === 0) continue; // keine Daten (z. B. CORS)
const ratio = decodedBodySize / encodedBodySize;
console.log(`${name}: Faktor ${ratio.toFixed(2)} komprimiert`);
}
});
observer.observe({ type: 'resource', buffered: true });
Performance-Budget für JavaScript prüfen
const BUDGET_BYTES = 170 * 1024; // 170 KiB komprimiert
const scripts = performance
.getEntriesByType('resource')
.filter((e) => e.initiatorType === 'script');
const total = scripts.reduce((sum, e) => sum + e.encodedBodySize, 0);
if (total > BUDGET_BYTES) {
console.warn(`JS-Budget überschritten: ${(total / 1024).toFixed(0)} KiB`);
} else {
console.log(`JS-Budget eingehalten: ${(total / 1024).toFixed(0)} KiB`);
}
// Wichtig · Fallstricke
- Cross-Origin: Bei Ressourcen von fremden Origins ist der Wert
0, sofern der Server keinen passendenTiming-Allow-Origin-Header sendet (z. B.Timing-Allow-Origin: *). Vor Berechnungen immer auf0prüfen, sonst droht Division durch null. - Keine Header:
encodedBodySizezählt nur den Body. Für die Gesamtübertragung inklusive HeadertransferSizeverwenden. - Cache: Bei Cache-Treffern bleibt
encodedBodySizegefüllt, währendtransferSize0ist – so lassen sich Cache-Treffer erkennen. - Puffergröße: Der Ressourcen-Puffer ist standardmäßig begrenzt (meist 250 Einträge). Bei vielen Ressourcen
performance.setResourceTimingBufferSize()erhöhen oder einenPerformanceObservernutzen. - Unterstützung in allen modernen Browsern; auch in Web Workern und Node.js (über
perf_hooks, eingeschränkt) verfügbar.