Fix Resource Load Delay for Better LCP
The median site with poor LCP spends 1.3 seconds on resource load delay—time wasted before even starting to download the LCP image.
What's the Problem?
Resource load delay is the time between when the browser receives the HTML and when it starts downloading the LCP resource. This happens when:
- The LCP image URL isn't in the initial HTML (e.g., set by JavaScript or CSS)
- Other resources are queued ahead of the LCP resource
- The browser doesn't know the image is important
Why it hurts LCP: Every millisecond spent waiting to start downloading is a millisecond added to LCP.
How to Identify This Issue
Chrome DevTools
- Performance tab → record → reload
- Find your LCP image in the Network section
- Look at when the request starts vs. when HTML arrived
- Large gap = resource load delay
WebPageTest
Look at the waterfall chart. If the LCP image request starts late (far to the right), you have resource load delay.
The Fix
1. Preload the LCP Image
Tell the browser to start downloading the LCP image immediately.
<head>
<!-- Preload LCP image -->
<link
rel="preload"
href="/images/hero.webp"
as="image"
fetchpriority="high"
>
</head>
For responsive images:
<link
rel="preload"
as="image"
href="/images/hero.webp"
imagesrcset="/images/hero-400.webp 400w, /images/hero-800.webp 800w"
imagesizes="100vw"
fetchpriority="high"
>
2. Use fetchpriority="high"
Tell the browser this resource is critical.
<img
src="/images/hero.webp"
fetchpriority="high"
alt="Hero image"
>
The fetchpriority attribute has grown from 0.03% adoption in 2022 to 15% in 2024.
3. Include LCP Resource in HTML
If your LCP image URL is set by JavaScript or CSS, move it to HTML.
<!-- Before: image URL in CSS (discovered late) -->
<div class="hero" style="background-image: url(hero.webp)"></div>
<!-- After: image in HTML (discovered immediately) -->
<img src="hero.webp" class="hero" alt="Hero">
// Before: image URL from JavaScript (discovered late)
useEffect(() => {
setHeroImage('/hero.webp')
}, [])
// After: image in initial render
<img src="/hero.webp" alt="Hero" />
4. Avoid Lazy-Loading LCP
Never use loading="lazy" on your LCP image.
<!-- Wrong: lazy-loading LCP image -->
<img src="hero.webp" loading="lazy" alt="Hero">
<!-- Correct: eager loading (default) with high priority -->
<img src="hero.webp" loading="eager" fetchpriority="high" alt="Hero">
About 10% of LCP images are incorrectly lazy-loaded.
5. Reduce Request Chains
If your LCP resource depends on other resources loading first, eliminate the chain.
<!-- Before: chain of dependencies -->
<!-- HTML → CSS → background-image URL → image download -->
<!-- After: direct preload -->
<link rel="preload" href="hero.webp" as="image" fetchpriority="high">
Framework-Specific Solutions
priority prop on next/image:import Image from 'next/image'
<Image
src="/hero.jpg"
priority // Adds preload + fetchpriority
alt="Hero"
/>
preload prop on NuxtImg:<NuxtImg
src="/hero.jpg"
preload
alt="Hero"
/>
useHead for manual preload:useHead({
link: [{ rel: 'preload', href: '/hero.webp', as: 'image', fetchpriority: 'high' }]
})
Verify the Fix
After implementing:
- Check Network tab — LCP image should start downloading earlier
- Run Lighthouse — look for preload suggestions
- Compare LCP scores before/after
Expected improvement: Eliminating 1.3 seconds of resource load delay can improve LCP by 1.3 seconds.
Common Mistakes
- Preloading too many resources — Only preload the most critical 2-3 resources. Too many preloads compete for bandwidth.
- Wrong preload attributes — Incorrect
asattribute or missingcrossoriginfor fonts causes double downloads. - Preloading dynamic URLs — If the image URL changes per page, use server-side rendering to set the correct preload.
Related Issues
Often appears alongside:
- Large Images — Preloading a 2MB image doesn't help much
- Lazy-Loading Above Fold — Related anti-pattern
Test Your Entire Site
Resource load delay varies by page. Unlighthouse scans your entire site and identifies pages where LCP resources are discovered late.