Signatur
Beschreibung
Die Methode toJSON() ist der Serialisierer der Schnittstelle LargestContentfulPaint. Sie erzeugt ein einfaches JavaScript-Objekt, das die Eigenschaften des Performance-Eintrags als Momentaufnahme enthält. Das sind die Felder aus PerformanceEntry (name, entryType, startTime, duration) und die LCP-spezifischen Felder wie renderTime, loadTime, size, id und url.
Normalerweise ruft man toJSON() nicht selbst auf. JSON.stringify() nutzt die Methode automatisch, wenn Sie einen LargestContentfulPaint-Eintrag serialisieren. Ohne toJSON() käme dabei nur {} heraus, weil die Eigenschaften als Getter am Prototyp liegen und nicht als eigene Eigenschaften der Instanz.
Typische Anwendungsfälle sind Real-User-Monitoring (RUM) und das Senden von Core-Web-Vitals-Daten an einen Analytics-Endpunkt, etwa mit navigator.sendBeacon() oder fetch(). Auch zum Protokollieren und Speichern von LCP-Messwerten ist die Methode praktisch.
Die Eigenschaft element fehlt im Ergebnis. Ein DOM-Element lässt sich nicht als JSON serialisieren. Wenn Sie das auslösende Element erfassen wollen, müssen Sie selbst eine Beschreibung ergänzen, zum Beispiel Tag-Name oder CSS-Selektor.
Rückgabewert
name, entryType ("largest-contentful-paint"), startTime, duration, renderTime, loadTime, size, id und url. element ist nicht enthalten.Beispiele
LCP-Eintrag als JSON-Objekt ausgeben
const observer = new PerformanceObserver((list) => {
const entries = list.getEntries();
const lastEntry = entries[entries.length - 1];
// Momentaufnahme als einfaches Objekt
console.log(lastEntry.toJSON());
});
observer.observe({ type: 'largest-contentful-paint', buffered: true });
JSON.stringify() ruft toJSON() automatisch auf
new PerformanceObserver((list) => {
for (const entry of list.getEntries()) {
// Ohne toJSON() käme hier nur "{}" heraus
console.log(JSON.stringify(entry));
}
}).observe({ type: 'largest-contentful-paint', buffered: true });
Finalen LCP-Wert beim Verlassen der Seite an Analytics senden
let latestLcp = null;
new PerformanceObserver((list) => {
const entries = list.getEntries();
latestLcp = entries[entries.length - 1];
}).observe({ type: 'largest-contentful-paint', buffered: true });
document.addEventListener('visibilitychange', () => {
if (document.visibilityState !== 'hidden' || !latestLcp) return;
const payload = {
...latestLcp.toJSON(),
// element wird nicht serialisiert, daher eine eigene Beschreibung ergänzen
elementTag: latestLcp.element?.tagName ?? null,
page: location.pathname,
};
navigator.sendBeacon('/analytics/lcp', JSON.stringify(payload));
latestLcp = null; // nur einmal senden
});
// Wichtig · Fallstricke
elementfehlt: Das DOM-Element, das den LCP ausgelöst hat, steht nicht im Ergebnis. Speichern Sie bei Bedarf selbst den Tag-Namen, dieidoder einen Selektor.renderTimekann0sein: Bei Bildern von einer anderen Herkunft, die ohneTiming-Allow-Origin-Header ausgeliefert werden, istrenderTimeje nach Browser0oder nur grob angegeben. Nehmen Sie dannstartTimebzw.loadTimeals Ersatz.- Nur eine Momentaufnahme: Das Ergebnis wird nicht aktualisiert. Der Browser kann weitere, größere LCP-Kandidaten melden. Der endgültige Wert steht erst nach einer Nutzereingabe oder beim Verlassen der Seite fest.
- Neuere Browser liefern mehr Felder: Aktuelle Chromium-Versionen fügen je nach Version weitere Felder hinzu, etwa
paintTimeundpresentationTime. Verlassen Sie sich nicht auf eine feste Liste von Feldern. - Browser-Unterstützung: Chromium-basierte Browser (ab 77) und Firefox (ab 122) unterstützen die Methode. Safari unterstützt die LCP-API erst in sehr neuen Versionen. Prüfen Sie vorher mit
PerformanceObserver.supportedEntryTypes.includes('largest-contentful-paint'), ob die API verfügbar ist.