Signatur
Beschreibung
Bei Single-Page-Applications wechselt die Ansicht, ohne dass ein neues Dokument geladen wird. Solche Wechsel nennt man Soft-Navigationen. Klassische Kennzahlen wie Largest Contentful Paint (LCP) beziehen sich nur auf den ersten Seitenaufruf. Mit der experimentellen Soft-Navigations-API legt der Browser für jede erkannte Soft-Navigation einen PerformanceSoftNavigation-Eintrag an (Eintragstyp "soft-navigation"). Die Methode getLargestInteractionContentfulPaint() liefert dazu den größten Inhalts-Paint, der nach der auslösenden Interaktion gezeichnet wurde.
Man nutzt sie im Real User Monitoring (RUM), um für jeden Routenwechsel einen LCP-ähnlichen Wert zu erheben: Wie lange dauerte es vom Klick bis zum Rendern des wichtigsten Inhalts der neuen Ansicht? Der Eintrag wird geliefert, während die Messung noch läuft. Das Ergebnis ist also eine Momentaufnahme: Wird später ein noch größeres Element gezeichnet, gibt ein erneuter Aufruf einen anderen Eintrag zurück.
Die Methode erwartet keine Argumente. Ist noch kein passender Paint erfasst, gibt sie null zurück. Sinnvoll ist der Aufruf deshalb erst, wenn die Messung weitgehend abgeschlossen ist – etwa bei der nächsten Soft-Navigation oder wenn die Seite ausgeblendet wird (visibilitychange).
Rückgabewert
InteractionContentfulPaint-Eintrag dieser Soft-Navigation mit Angaben wie startTime, size und element, oder null, wenn es noch keinen gibt.Beispiele
Unterstützung prüfen und Soft-Navigationen beobachten
const supported = PerformanceObserver.supportedEntryTypes?.includes('soft-navigation');
if (!supported) {
console.log('Soft-Navigations-API wird nicht unterstützt');
} else {
const observer = new PerformanceObserver((list) => {
for (const nav of list.getEntries()) {
const icp = nav.getLargestInteractionContentfulPaint?.();
console.log(nav.name, icp ? `${Math.round(icp.startTime - nav.startTime)} ms` : 'noch kein Paint');
}
});
observer.observe({ type: 'soft-navigation', buffered: true });
}
Endgültigen Wert beim Verlassen der Ansicht melden
let currentNav = null;
const report = (nav) => {
const icp = nav?.getLargestInteractionContentfulPaint?.();
if (!icp) return;
const payload = JSON.stringify({
url: nav.name,
icp: Math.round(icp.startTime - nav.startTime),
size: icp.size
});
navigator.sendBeacon('/rum', payload);
};
new PerformanceObserver((list) => {
for (const nav of list.getEntries()) {
// Vorherige Soft-Navigation ist abgeschlossen -> jetzt melden
report(currentNav);
currentNav = nav;
}
}).observe({ type: 'soft-navigation', buffered: true });
document.addEventListener('visibilitychange', () => {
if (document.visibilityState === 'hidden') report(currentNav);
});
Größtes Element einer Ansicht ermitteln
const [lastNav] = performance.getEntriesByType('soft-navigation').slice(-1);
const icp = lastNav?.getLargestInteractionContentfulPaint?.();
if (icp) {
console.log('Größtes Element:', icp.element?.tagName, 'Fläche:', icp.size);
}
// Wichtig · Fallstricke
- Experimentell: Die API gibt es bislang nur in Chromium-Browsern, und zwar per Origin Trial oder über das Flag „Experimental Web Platform features“. Firefox und Safari unterstützen sie nicht. Frühere Chrome-Versionen hatten nur
SoftNavigationEntryohne diese Methode. Deshalb immer mitsupportedEntryTypesund optionalem Aufruf (?.()) auf Unterstützung prüfen. - Der Rückgabewert ist nur eine Momentaufnahme. Wer zu früh aufruft, bekommt
nulloder einen zu kleinen Wert. Melde den Wert erst beim Wechsel zur nächsten Soft-Navigation oder beivisibilitychange. - Die Zeitwerte beziehen sich auf
performance.timeOrigin. Für die Dauer ab der Interaktion alsostartTimedes Navigationseintrags abziehen. - Ohne
Timing-Allow-Origin-Header istrenderTimebei Bildern von fremden Ursprüngen (Cross-Origin) eingeschränkt. - Nicht jeder Routenwechsel zählt als Soft-Navigation. Der Browser verlangt eine Nutzerinteraktion, eine URL-Änderung über die History-API und eine DOM-Änderung.