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

PerformanceLongTaskTiming.toJSON()

Methode

Gibt ein einfaches Objekt mit allen serialisierbaren Eigenschaften eines <code>PerformanceLongTaskTiming</code>-Eintrags zurück, z. B. für <code>JSON.stringify()</code>.

seit JavaScript Chrome 58+, Edge 79+, Opera; nicht in Firefox und Kategorie: webapi

Signatur

PerformanceLongTaskTiming.prototype.toJSON()

Beschreibung

toJSON() ist der Standard-Serializer der Schnittstelle PerformanceLongTaskTiming. Die Methode gibt ein einfaches JavaScript-Objekt zurück, keinen JSON-String. Es enthält die Eigenschaften des Eintrags: name, entryType (immer "longtask"), startTime, duration und attribution. Letzteres ist ein Array mit serialisierten TaskAttributionTiming-Objekten.

Sie brauchen die Methode vor allem, wenn Sie lange Tasks (Hauptthread-Blockaden über 50 ms) erfassen und an einen Analyse- oder Monitoring-Server schicken wollen (Real User Monitoring). Die eigentlichen Einträge sind Host-Objekte, deren Eigenschaften als Getter am Prototyp liegen. Ein direkter Aufruf von JSON.stringify(entry) funktioniert nur, weil JSON.stringify intern automatisch toJSON() aufruft. Ohne diese Methode käme nur {} heraus.

Meist rufen Sie toJSON() gar nicht selbst auf, sondern verwenden JSON.stringify(). Ein direkter Aufruf lohnt sich, wenn Sie das Objekt vor dem Versand noch ändern, filtern oder mit eigenen Daten anreichern wollen.

Rückgabewert

Typ
Object
Beschreibung
Ein einfaches Objekt mit den Eigenschaften name, entryType, startTime, duration und attribution (Array aus serialisierten TaskAttributionTiming-Einträgen).

Beispiele

Lange Tasks beobachten und als Objekt ausgeben

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

observer.observe({ type: "longtask", buffered: true });

// Einen langen Task künstlich erzeugen (ca. 120 ms Blockade)
const start = performance.now();
while (performance.now() - start < 120) {}
{ name: "self", entryType: "longtask", startTime: 1234.5, duration: 121, attribution: [ { name: "unknown", entryType: "taskattribution", startTime: 0, duration: 0, containerType: "window", containerSrc: "", containerId: "", containerName: "" } ] }

Direkt als JSON-String serialisieren

const observer = new PerformanceObserver((list) => {
  for (const entry of list.getEntries()) {
    // JSON.stringify ruft intern entry.toJSON() auf
    console.log(JSON.stringify(entry));
  }
});

observer.observe({ type: "longtask", buffered: true });
{"name":"self","entryType":"longtask","startTime":1234.5,"duration":121,"attribution":[{"name":"unknown","entryType":"taskattribution","startTime":0,"duration":0,"containerType":"window","containerSrc":"","containerId":"","containerName":""}]}

Angereicherte Daten per sendBeacon an einen Monitoring-Server senden

const buffer = [];

const observer = new PerformanceObserver((list) => {
  for (const entry of list.getEntries()) {
    buffer.push({
      ...entry.toJSON(),
      page: location.pathname,
      userAgent: navigator.userAgent
    });
  }
});

if (PerformanceObserver.supportedEntryTypes?.includes("longtask")) {
  observer.observe({ type: "longtask", buffered: true });
}

// Beim Verlassen bzw. Verstecken der Seite gesammelte Einträge senden
document.addEventListener("visibilitychange", () => {
  if (document.visibilityState === "hidden" && buffer.length > 0) {
    navigator.sendBeacon("/rum/longtasks", JSON.stringify(buffer));
    buffer.length = 0;
  }
});

// Wichtig · Fallstricke

  • Rückgabewert ist kein String: toJSON() liefert ein Objekt. Einen JSON-String bekommen Sie erst mit JSON.stringify().
  • Browser-Unterstützung: Die Long Tasks API gibt es nur in Chromium-Browsern (Chrome, Edge, Opera). Firefox und Safari unterstützen PerformanceLongTaskTiming nicht. Prüfen Sie das vorher mit PerformanceObserver.supportedEntryTypes.includes("longtask").
  • Spread und Object.assign: { ...entry } ergibt ein leeres Objekt, weil die Eigenschaften Getter am Prototyp sind. Verwenden Sie deshalb { ...entry.toJSON() }.
  • Eingeschränkte Zuordnung: attribution enthält meist nur einen Eintrag mit wenig Aussagekraft (oft name: "unknown"). Genauere Angaben zu Skripten liefert die neuere Long Animation Frames API (PerformanceLongAnimationFrameTiming).
  • Datenschutz: Bei Tasks aus fremden Frames enthalten Felder wie containerSrc eventuell URLs. Bedenken Sie das, bevor Sie die Daten an Dritte senden.