Common causes
- Slow server response time (high TTFB)
- Render-blocking JavaScript or CSS
- Large, unoptimised hero images or fonts
- Client-side rendering delaying visible content
Diagnostic snippet
new PerformanceObserver((list) => {
const lcp = list.getEntries().at(-1);
console.log('LCP',
(lcp.startTime / 1000).toFixed(2) + 's',
lcp.element);
}).observe({ type: 'largest-contentful-paint', buffered: true });