Start · Sprachen · JavaScript · Referenz · PerformanceLongAnimationFrameTiming.toJSON()

PerformanceLongAnimationFrameTiming.toJSON()

Methode

Gibt ein einfaches Objekt mit allen Eigenschaften eines <code>PerformanceLongAnimationFrameTiming</code>-Eintrags zurück, das sich mit <code>JSON.stringify()</code> serialisieren lässt.

seit JavaScript Chrome/Edge 123+, Opera 109+; nicht in Firefox und Kategorie: webapi

Signatur

PerformanceLongAnimationFrameTiming.prototype.toJSON()

Beschreibung

Die Methode toJSON() wandelt einen Eintrag der Long Animation Frames API (LoAF) in ein gewöhnliches JavaScript-Objekt um. Das Objekt enthält alle öffentlichen Eigenschaften des Eintrags: name, entryType ("long-animation-frame"), startTime, duration, renderStart, styleAndLayoutStart, firstUIEventTimestamp, blockingDuration und scripts.

Gebraucht wird das vor allem, wenn du Leistungsdaten an einen Analyse- oder Monitoring-Server schicken willst (Real User Monitoring, RUM). Die Eigenschaften eines PerformanceEntry liegen als Getter auf dem Prototyp und nicht als eigene Eigenschaften auf dem Objekt. Deshalb würde JSON.stringify() ohne toJSON() nur {} liefern. JSON.stringify() ruft toJSON() aber von selbst auf, wenn es die Methode findet.

Die Eigenschaft scripts ist ein Array aus PerformanceScriptTiming-Objekten. Diese haben ihre eigene toJSON()-Methode. Beim Serialisieren mit JSON.stringify() werden sie deshalb vollständig mit umgewandelt, also zum Beispiel mit invoker, sourceURL, sourceFunctionName und duration.

Rückgabewert

Typ
Object
Beschreibung
Ein einfaches Objekt mit allen Eigenschaften des PerformanceLongAnimationFrameTiming-Eintrags, geeignet für die JSON-Serialisierung.

Beispiele

Lange Animation-Frames als JSON ausgeben

const observer = new PerformanceObserver((list) => {
  for (const entry of list.getEntries()) {
    console.log(entry.toJSON());
  }
});

observer.observe({ type: 'long-animation-frame', buffered: true });
{ name: 'long-animation-frame', entryType: 'long-animation-frame', startTime: 1234.5, duration: 87, renderStart: 1310.2, styleAndLayoutStart: 1312.8, firstUIEventTimestamp: 0, blockingDuration: 37, scripts: [...] }

Direkt mit JSON.stringify() serialisieren

const observer = new PerformanceObserver((list) => {
  const [entry] = list.getEntries();
  // JSON.stringify ruft toJSON() automatisch auf
  console.log(JSON.stringify(entry, null, 2));
});

observer.observe({ type: 'long-animation-frame', buffered: true });
{ "name": "long-animation-frame", "entryType": "long-animation-frame", "duration": 87, ... }

LoAF-Daten per sendBeacon an einen RUM-Server senden

const buffer = [];

const observer = new PerformanceObserver((list) => {
  for (const entry of list.getEntries()) {
    // Nur Frames mit spürbarer Blockierung melden
    if (entry.blockingDuration > 50) {
      buffer.push(entry.toJSON());
    }
  }
});

if (PerformanceObserver.supportedEntryTypes.includes('long-animation-frame')) {
  observer.observe({ type: 'long-animation-frame', buffered: true });
}

document.addEventListener('visibilitychange', () => {
  if (document.visibilityState === 'hidden' && buffer.length > 0) {
    navigator.sendBeacon('/analytics/loaf', JSON.stringify(buffer));
    buffer.length = 0;
  }
});

// Wichtig · Fallstricke

  • Kompatibilität: Die Long Animation Frames API gibt es nur in Chromium-Browsern ab Version 123. Firefox und Safari unterstützen sie nicht. Prüfe deshalb vorher, ob der Eintragstyp verfügbar ist: PerformanceObserver.supportedEntryTypes.includes('long-animation-frame').
  • Ohne toJSON() bzw. JSON.stringify() bringen Object.keys(entry) und der Spread-Operator ({...entry}) nur ein leeres Ergebnis. Die Eigenschaften sind Getter auf dem Prototyp.
  • Das Array scripts enthält beim direkten Aufruf von toJSON() weiterhin PerformanceScriptTiming-Objekte. Echte, flache JSON-Daten bekommst du erst mit JSON.stringify().
  • Datenschutz: sourceURL und sourceFunctionName in scripts können interne URLs oder Funktionsnamen offenlegen. Filtere die Daten vor dem Versand bei Bedarf. Für fremde Skripte ohne passende CORS-Freigabe liefert der Browser nur eingeschränkte Informationen.
  • Die Datenmenge kann groß werden. Sammle die Einträge, filtere sie (zum Beispiel nach blockingDuration) und sende sie gebündelt.