Resource hints are declarations in HTML or HTTP headers that ask the browser to prepare work before it would otherwise discover it. Four names show up in almost every PageSpeed Insights audit and WordPress “optimisation” plugin: dns-prefetch, preconnect, preload, and prefetch. They are not interchangeable, and they are not a substitute for making the Largest Contentful Paint (LCP) resource discoverable in the initial HTML.
What follows is a decision guide for agencies and product teams: which hint to use, how to preload an LCP image when the browser cannot discover it early, when preconnect helps cross-origin performance, how prefetch differs from preload, and where font preloads stop helping. For metric thresholds, keep What Are Core Web Vitals? A Practical Guide for 2026 and LCP, INP, CLS: What Each Core Web Vital Means and How to Fix It open. Image sizing and lazy-loading rules belong with preload work, so use Image Optimisation Strategies for Better LCP Scores and Lazy Loading for LCP and CLS: When to Use loading="lazy" (and When Not To) beside this guide.
What resource hints change for Core Web Vitals (and what they do not)
Hints change when the browser starts DNS, TCP/TLS, or a fetch. They do not compress files, resize a hero image, or fix a render-blocking stylesheet on their own. Google’s resource hints course and preload critical assets guidance treat them as assists for late-discovered critical work, not as a general “speed up everything” layer.
LCP benefits most when the LCP image or font is discoverable early, or when a carefully scoped preload with fetchpriority="high" covers a late-discovered candidate. Interaction to Next Paint (INP) and Cumulative Layout Shift (CLS) usually move for other reasons (busy main thread, missing reserved space). Adding twenty preconnect tags will not repair a 4 MB hero or a lazy-loaded above-the-fold banner.
For agencies, the reporting risk is the same as with other lab tips: a plugin adds hints sitewide, Lighthouse’s unused-preload warnings appear, and the client report claims “we implemented preconnect” without naming origins or measuring before and after. Label the hint, the origin or URL, and the dated lab row. Without those labels, the next person on the account cannot tell whether the change was real or only cosmetic.
dns-prefetch vs preconnect vs preload vs prefetch: which hint to use
Use one decision table when a client asks which tag belongs in <head>. The rows match what web.dev’s preconnect and dns-prefetch article and the resource hints learning path describe. Put the table in the client report once so the team stops arguing over tags that mean different things.
| Hint | What it starts early | Best when | Avoid when |
|---|---|---|---|
dns-prefetch |
DNS lookup only for a cross-origin host | You will request that host soon, but it is not among the most urgent early requests | You need an early TLS connection for a known critical origin (use preconnect instead) |
preconnect |
DNS + TCP + TLS to a cross-origin origin | Exact URL is unknown yet, but a critical fetch will hit that origin soon (for example an image CDN) | You already know the exact critical URL (prefer preload); or you are opening connections to many origins at once |
preload |
Fetch of a specific current-document resource | Late-discovered critical asset for *this* page load (LCP image not in HTML, @font-face file, CSS @import) |
The resource is already discoverable in HTML; or you preload speculative next-page URLs |
prefetch |
Low-priority fetch likely needed on a *future* navigation | Next-page document or asset with clear probability | You need the resource for the current LCP; or you confuse it with Speculation Rules prerender |
dns-prefetch versus preconnect is a cost trade-off. preconnect is stronger for a critical third-party origin and more expensive if overused. Prefer a short list of critical origins for preconnect, and dns-prefetch for the rest, then measure. That pairing is the practical answer when someone asks “dns-prefetch vs preconnect.”
How to preload the LCP image (and when preload is the wrong fix)
The first rule for preload LCP work is still discoverability. Optimize Largest Contentful Paint asks whether the LCP resource appears in the initial HTML so the preload scanner can see it. An <img> with src or srcset in the document usually does not need a duplicate preload. A CSS background-image, an image injected only after JavaScript runs, or a late-discovered responsive candidate often does.
When you preload, set as="image", match the real URL (or responsive attributes), and use fetchpriority="high" on the preload. Chrome’s LCP request discovery insight still expects high fetch priority on the preload and on the image element when both exist. For responsive heroes, follow web.dev’s caution: use imagesrcset / imagesizes on the preload and avoid a bare href that downloads the wrong fallback on browsers without responsive preload support.
<link
rel="preload"
as="image"
href="/media/hero-1200.webp"
type="image/webp"
fetchpriority="high"
>
<img
src="/media/hero-1200.webp"
width="1200"
height="675"
fetchpriority="high"
alt="…"
>
If the LCP image is already in HTML with fetchpriority="high" and without loading="lazy", skip the preload and fix file size, dimensions, or CDN latency instead. Preload is the wrong fix when the real problem is a lazy-loaded hero (see the lazy-loading guide linked above) or a 3 MB unoptimised file. Same-origin delivery still beats a third-party image host plus preconnect when you can arrange it.
Preconnect for performance on cross-origin origins
Preconnect performance gains show up when an important early request must open a new origin before the real URL is known. Classic cases include an image CDN whose path depends on breakpoints, or a font host you will hit after CSS parses. Preconnect to required origins in Lighthouse flags missing connections; it does not mean every third party deserves a tag.
Keep the list short. Each preconnect spends time on DNS, TCP, and TLS, and too many compete for limited connections. Prefer same-origin or proxied assets for LCP when the platform allows it. When a cross-origin LCP host is unavoidable, one early preconnect to that host is often enough, with dns-prefetch for analytics or chat widgets that load later.
Cross-origin font files also need CORS-aware loading when you preload them. Pair font preconnect / preload with subsetting and font-display choices from Font Subsetting for Web Performance: 4 Tools to Reduce Font File Size and Improve LCP. Preloading full family files on every template usually wastes more bandwidth than it saves.
Prefetch versus preload: current page versus next navigation
Prefetch versus preload is the comparison that most plugin marketing pages blur. preload is for a resource required to render or complete the current page load at high priority relative to its type. prefetch is a low-priority hint for something the user is likely to need on a later visit. Using prefetch for the current LCP image gives that image too low a priority. Using preload for speculative next-page HTML can take bandwidth away from the current hero.
Document-level rel=prefetch is also not the same product as Speculation Rules prefetch or prerender, which WordPress and Chrome have been expanding. For CMS plugin behaviour and when speculative loading helps or hurts, see WordPress Speculation and Prerender Plugins vs Core Web Vitals. Keep classic resource-hint language separate from speculation JSON in client reports so nobody thinks a link rel=prefetch row is the same as a prerender.
Font preload limits (pair with subsetting, not instead of it)
Fonts defined in CSS @font-face rules are late-discovered until the stylesheet arrives, so a single WOFF2 preload can help text LCP candidates and shorten the time when text stays invisible. Limits matter more than most theme defaults admit. Preload only the faces used above the fold on that template. Prefer WOFF2. Include crossorigin when the font is cross-origin so the preload and the CSS request share a cache entry. Do not preload every weight in the brand kit “just in case.”
If the font file is still hundreds of kilobytes after preload, the real gain is subsetting and fewer families, not more hints. Unused preload warnings in Lighthouse often mean a template preloads a face that page never uses. Agencies should treat font preload as a per-template list in the performance budget, reviewed when themes or design systems change.
Resource-hint mistakes that hurt lab and field scores
Hint sprawl. Ten preconnect origins and a dozen preload rows fight the browser’s own prioritisation. Start from the LCP request chain in PageSpeed Insights or Chrome DevTools, then add the minimum hints that close a real gap. If you cannot name the request each hint helps, delete the hint.
Preloading what HTML already discovers. Duplicate work and unused-preload audits follow. Prefer fixing markup so the scanner sees the image. A redundant preload is not harmless spare capacity.
Lazy-loading the LCP candidate while preloading something else. The hero still waits; the client sees green tips that do not move field LCP. Fix lazy rules first. Only then revisit preload.
Confusing prefetch with preload. Next-page speculation belongs in a separate task from current-page LCP. Mixing the words in a status report is how wrong priorities get released. Keep the vocabulary aligned with the decision table above.
Untested plugin defaults. Many “enable all resource hints” toggles invent origins from third-party scripts. Audit the rendered <head> on revenue and conversion templates, not only the plugin settings screen. A settings screen can look clean while a theme filter still injects tags later.
No-Vary-Search for prefetch and speculation (short note)
When you prefetch or prerender documents, query strings often break cache hits: /product and /product?utm_source=newsletter look like different URLs by default. The HTTP No-Vary-Search response header tells caches which query parameters do not change the response, so a prefetched document can still satisfy a navigation that adds tracking parameters. Speculation Rules can also declare an expected value via expects_no_vary_search.
Treat that as a checklist item beside speculation work (see the WordPress speculation post and MDN’s No-Vary-Search page), not as a replacement for choosing preload versus prefetch on the current page. Only ignore parameters that truly leave the HTML unchanged. A deeper Speculation Rules how-to is planned later on the Watcher calendar; keep this section short on purpose.
How to verify resource hints after you deploy them
Make one change at a time on a labelled URL. Capture mobile and desktop lab rows in PageSpeed Insights or Lighthouse with the same strategy before and after. Confirm the LCP element and request chain still match the story you told the client. Watch for unused preload warnings and for regressions in Total Blocking Time when too many early fetches compete.
Field Core Web Vitals move on their own clock. A correct preload can still take weeks to show in CrUX. Keep synthetic budgets on the journey URLs that matter, and re-read field categories on a schedule rather than after every deploy. The same logic as synthetic versus real-user monitoring applies here: hints are how you implement the early fetch; dated lab history is how agencies prove that fetch worked.
FAQ
Should I always preload the LCP image?
No. Preload when the LCP resource is not discoverable in the initial HTML, or when you need an early high-priority fetch the scanner cannot see yet. If the hero <img> is already in the document with fetchpriority="high" and without lazy loading, fix file weight and discovery first. Preload is a fix for late discovery, not a default for every template.
Is preconnect better than dns-prefetch?
For a critical cross-origin origin on the LCP or font path, preconnect does more (TCP and TLS as well as DNS). It also costs more if you overuse it. Use preconnect sparingly and dns-prefetch for lower-priority hosts, then re-test the same URL.
What is the difference between prefetch and preload?
preload targets a resource for the current page load. prefetch targets a likely future navigation at lower priority. Do not prefetch the current LCP image when you meant to preload it. If the goal is next-page speed, say so in the task title.
Can resource hints fix a poor INP score?
Rarely by themselves. INP is about interaction delay and main-thread work. Hints mainly change early network timing for loads and navigations, so keep INP work on scripts and long tasks.
Do WordPress optimisation plugins handle this safely?
Sometimes. Audit the rendered head on key templates. Sitewide “add all hints” modes often create unused preloads and excess preconnects. Prefer explicit lists for LCP and font origins, reviewed per theme update.
CTA
Pick the hint from the table before you paste tags into <head>. Preload only late-discovered critical assets for the current page, keep preconnect lists short, leave prefetch for likely next navigations, and verify with dated lab runs on the URLs clients actually care about. For portfolio monitoring across many domains after those fixes, start with Apogee Watcher or run a public check from the homepage tools.
References
- Assist the browser with resource hints (web.dev)
- Preload critical assets to improve loading speed (web.dev)
- Establish network connections early to improve perceived page speed (web.dev)
- Optimize Largest Contentful Paint (web.dev)
- LCP request discovery (Chrome for Developers)
- Preconnect to required origins (Chrome for Developers)
- No-Vary-Search header (MDN)
- What Are Core Web Vitals? A Practical Guide for 2026 (Apogee Watcher)
- LCP, INP, CLS: What Each Core Web Vital Means and How to Fix It (Apogee Watcher)
- Image Optimisation Strategies for Better LCP Scores (Apogee Watcher)
-
Lazy Loading for LCP and CLS: When to Use
loading="lazy"(and When Not To) (Apogee Watcher) - Font Subsetting for Web Performance: 4 Tools to Reduce Font File Size and Improve LCP (Apogee Watcher)
- WordPress Speculation and Prerender Plugins vs Core Web Vitals (Apogee Watcher)
Top comments (0)