Website Spec
Performance Recommended Updated 2026-05-29

Resource hints overview

Five resource hints — dns-prefetch, preconnect, preload, modulepreload, prefetch — cover every stage of the request lifecycle. Pick the right one for the job.

What it is

Resource hints are <link rel> declarations that tell the browser to do work earlier than the HTML parser would otherwise discover it. The W3C Resource Hints specification defines four; HTML adds two more (preload, modulepreload).

HintWhat it doesUse when
dns-prefetchResolve DNS for the origin.Cheap fallback for older browsers; large numbers of secondary origins.
preconnectDNS + TCP + TLS handshake to the origin.You will definitely request from this origin in the next ~10 seconds.
preloadFetch a specific resource at high priority.Late-discovered critical resource (LCP image, font referenced from CSS).
modulepreloadFetch and parse an ES module, including its dependency graph.Critical JS module that would otherwise be discovered after the parser hits <script type="module">.
prefetchFetch a resource at low priority for a future navigation.The user’s next likely page (article → comments, search → first result).

Why it matters

The browser’s parser discovers resources in source order. Anything referenced from CSS, JavaScript, or a late <link> is found late, after several round-trips. Hints move discovery to the start of the document so work overlaps with the rest of HTML parsing.

Used wrongly, hints harm performance — preloading 20 things slows the LCP element because everything fights for the same bandwidth. Treat each hint as a deliberate decision.

How to implement

A practical decision flow:

  1. Is this for the current page?

    • Yes → next question.
    • No, it’s the next navigation → prefetch (as document for HTML, otherwise blank).
  2. Is it a specific URL the browser would otherwise discover late?

    • Yes, and it’s an ES module → modulepreload.
    • Yes, anything else → preload with the correct as= (image, font, style, script, fetch).
    • No, you don’t know the URL yet but you know the origin → next question.
  3. How many requests will you make to that origin?

    • 1+ — use preconnect (with crossorigin if the requests use CORS).
    • 0–1 maybe — use dns-prefetch only. Cheaper.

Example head with each hint serving a distinct purpose:

<!-- We'll request the hero from the CDN -->
<link rel="preconnect" href="https://cdn.example.com" crossorigin>

<!-- Analytics may or may not fire on this page -->
<link rel="dns-prefetch" href="https://stats.example.com">

<!-- Font is referenced from CSS, would be discovered late -->
<link rel="preload" href="/fonts/inter.woff2" as="font" type="font/woff2" crossorigin>

<!-- LCP image, eager loading + high priority -->
<link rel="preload" href="/hero.avif" as="image" fetchpriority="high">

<!-- Critical module imported by /app.mjs -->
<link rel="modulepreload" href="/router.mjs">

<!-- After the user reads this article they often hit the next one -->
<link rel="prefetch" href="/articles/next" as="document">

See preload-prefetch-preconnect for syntax details and gotchas.

Common mistakes

  • Preloading the same resource that is already referenced by a <link rel="stylesheet"> higher in the head. The preload scanner finds it; the hint is noise.
  • Mixing preload and prefetch semantics. preload is for the current page; prefetch is for the next one.
  • Forgetting crossorigin on font preloads or preconnects to CORS origins.
  • modulepreload on a non-module script. Use preload as="script" for classic scripts.
  • More than ~5 hints in the head. Each one competes for bandwidth.

Verification

  • DevTools → Network → check the start time and priority of hinted resources. Hints should pull them left.
  • Chrome console logs unused preloads after a few seconds.
  • Lighthouse “Preload key requests” and “Preconnect to required origins” cover the common cases.

Related topics

Sources & further reading

Search
esc close navigate open