Lesson 1 of 30
Knowing LCP is slow tells you nothing about what to fix. Breaking it into its four sub-parts tells you exactly which category of problem you're looking at.
13 min read
Every option explains itself — why the right one is right, and why each wrong one is wrong. Miss one and it comes back later on a spaced-repetition schedule.
Question 1 of 3
A page's LCP is slow, but TTFB is fast and the LCP image downloads quickly once its fetch starts. The gap between TTFB and the fetch actually starting is large. Which LCP sub-part is the bottleneck?
Hints without spoilers, and a plain explanation of why a wrong answer was wrong — answered only from this lesson. Free account, no card.
Sign up freeWhat interviewers actually ask about this, and what a strong answer has to cover.
A strong answer covers
Likely follow-ups
You already know LCP measures how long until the biggest visible element renders. What that single number doesn't tell you is why it's slow — and "make the hero image smaller" is a guess, not a diagnosis. Chrome's own tooling (the Performance panel, and the web-vitals library's attribution build) breaks LCP into four sequential sub-parts that always sum to the total:
Each sub-part points to a completely different fix. That's the entire diagnostic value: the largest sub-part tells you which category of problem you have, so you stop guessing.
// Slow: the browser can't discover this image until JS runs and mounts it
function Hero() {
const [src, setSrc] = useState(null);
useEffect(() => {
fetchHeroImageUrl().then(setSrc);
}, []);
return src ? <img src={src} alt="" /> : null;
}
LCP is one number, but it's really four sub-parts laid end to end on a timeline.
This component has a near-zero TTFB and a fast Resource Load Time once the fetch starts — but a large Resource Load Delay, because the browser's preload scanner (the fast HTML parser that looks ahead for images and scripts before the main JS even runs) has nothing to find. The <img> tag doesn't exist in the initial HTML at all; it only shows up after React mounts, which only happens after JS downloads, parses, and executes. The fix isn't "optimize the image" — the image was never the bottleneck. It's making the resource discoverable earlier: render the <img src> directly in the initial HTML (or add a <link rel="preload" as="image"> hint) so the preload scanner finds it on the very first pass, and add fetchpriority="high" so the browser fetches it ahead of lower-priority resources.
<script> tags without defer/async, synchronous CSS, or a long JavaScript task that's holding the thread when the image is ready to paint."LCP is slow — how do you find out why?" is a common senior-frontend question, and naming the four sub-parts (rather than listing generic fixes like "compress images") is exactly the difference between a candidate who's memorized advice and one who can actually diagnose a real page.