Web Performance

Preload, prefetch og preconnect: hvornår de hver især faktisk hjælper

Resource hints er nyttige, når de matcher reelle flaskehalse i browseren. Brugt i blinde tilføjer de prioritetsstøj og kan nogle gange gøre sider langsommere.

The Wux Webtools Team The Wux Webtools Team 10 min læsning AI-assisteret, menneskelig gennemgået
A simplified browser loading waterfall showing early resource hints for a web page.
Indholdsfortegnelse
  1. Resource hints er ikke magi
  2. Hvad browseren allerede gør godt
  3. Preload: til ressourcer på den aktuelle side, der opdages for sent
  4. Preload og LCP-billeder
  5. Prefetch: til den næste side, ikke denne
  6. Preconnect: til dyre forbindelser til vigtige origins
  7. DNS-prefetch: den lettere fætter
  8. Sådan beslutter du: en praktisk arbejdsgang
  9. 1. Identificér flaskehalsen
  10. 2. Tilføj ét hint ad gangen
  11. 3. Tjek bivirkninger på prioritet
  12. 4. Verificér headers og caching
  13. Almindelige fejl
  14. At preloade for meget
  15. At bruge prefetch til påkrævede ressourcer
  16. At preconnecte til alle tredjeparter
  17. At glemme mobile forhold
  18. En simpel beslutningstabel
  19. Den rolige regel

Resource hints er ikke magi

preload, prefetch og preconnect bliver ofte behandlet som en performance-tjekliste. Tilføj et par tags til <head>, kør Lighthouse igen, og få det bedre. Sådan fungerer de ikke.

Disse hints er instruktioner til browserens indlæsningspipeline. De kan hjælpe, når du ved noget, browseren ikke kan opdage tidligt nok. De kan skade, når du gætter, overprioriterer ikke-kritisk arbejde eller varmer forbindelser op, som brugerne aldrig får brug for.

Den korte version:

  • Brug preload til ressourcer, der kræves på den aktuelle side, men opdages for sent.
  • Brug prefetch til sandsynlige fremtidige navigationsressourcer, ikke til nødvendige ressourcer på den aktuelle side.
  • Brug preconnect til vigtige tredjeparts-origins, hvor forbindelsesopsætning er en reel forsinkelse.

Det praktiske spørgsmål er ikke “hvilket hint er hurtigst?” Det er “hvad venter browseren på, og kan dette hint fjerne den ventetid?”

Hvad browseren allerede gør godt

Moderne browsere er ikke passive filhentere. De parser HTML, scanner fremad efter ressourcer, tildeler prioriteter, genbruger forbindelser, udskyder arbejde, der ikke er synligt, og tilpasser sig netværksforhold.

Det betyder, at resource hints bør bruges selektivt. Hvis et stylesheet, script, billede eller font allerede opdages tidligt og får den rigtige prioritet, gør et ekstra hint måske ingenting. Endnu værre: Det kan konkurrere med ressourcer, der betyder mere.

Før du tilføjer hints, så kig på en waterfall-trace i DevTools eller en laboratorierapport. Hvis du bruger Lighthouse, så begynd med diagnostikken frem for scoren; vi har en separat guide til at læse en Lighthouse-rapport uden at gå i panik — men bemærk, at den korrekte URL skelner mellem store og små bogstaver, så brug den linkede artikel fra din sides navigation, hvis det er nødvendigt.

Det reelle bevis er som regel synligt tre steder:

  1. En kritisk ressource starter sent, fordi browseren opdager den sent.
  2. En forbindelse til en vigtig origin tager mærkbar tid før den første request.
  3. En ressource til næste side er meget forudsigelig og billig at hente i inaktiv tid.

Hvis ingen af disse er sande, er et hint sandsynligvis pynt.

Preload: til ressourcer på den aktuelle side, der opdages for sent

preload fortæller browseren: “Hent denne ressource nu, fordi den aktuelle side får brug for den.”

Et typisk eksempel er en webfont, der refereres inde i CSS. Browseren skal hente HTML, opdage CSS, hente CSS, parse det, opdage fonten og derefter anmode om fonten. Hvis den font er vigtig for tekst i den synlige del af siden, kan opdagelsen ske så sent, at det forårsager layout shifts eller forsinket tekstgengivelse.

Et preload kan flytte den request tidligere:

<link rel='preload' href='/fonts/inter-var.woff2' as='font' type='font/woff2' crossorigin>

Attributten as er vigtig. Den fortæller browseren, hvilken type ressource dette er, hvilket påvirker prioritet, caching, content security policy og request-headers. Fonts har også som regel brug for crossorigin, selv når de serveres fra samme site, fordi font-hentning bruger CORS-tilstand.

Gode kandidater til preload inkluderer:

  • Den primære webfont, der bruges til synlig tekst.
  • Et hero-billede, der er Largest Contentful Paint-elementet og ikke kan opdages tidligt.
  • En kritisk CSS-fil, der indlæses indirekte.
  • Et modul eller script, der skal bruges meget tidligt, men er skjult bag et andet script.

Dårlige kandidater til preload inkluderer:

  • Alle fontvægte i designsystemet.
  • Billeder under folden.
  • Scripts, der ikke er nødvendige for initial rendering.
  • Ressourcer, som browseren allerede opdager i den første HTML-del.

Preload er kraftfuldt, fordi det påvirker prioriteten på den aktuelle side. Det er også derfor, det er let at misbruge. Hvis du preloader fem store assets, hjælper du ikke længere browseren. Du diskuterer med den.

Fonts er det klassiske tilfælde. At preloade én primær fontfil kan hjælpe. At preloade seks vægte og kursiver gør som regel tingene værre. Hvis fonts er din flaskehals, så ryd først op i fontsættet; vores guide til hvorfor web fonts stadig er den letteste performance-gevinst på de fleste sites dækker den oprydning mere detaljeret.

Preload og LCP-billeder

Preloading af et LCP-billede kan være nyttigt, når billedet ikke er synligt i den oprindelige HTML. Almindelige årsager inkluderer CSS-baggrundsbilleder, klient-renderede komponenter eller responsive image-logik, der dukker op sent.

Men hvis dit hero-billede allerede findes i HTML som et <img> med fornuftige srcset, sizes, dimensioner og ingen lazy loading, kan browseren sandsynligvis finde det hurtigt. I det tilfælde kan det være mere passende at tilføje fetchpriority='high' end preload, afhængigt af siden.

En god test: Hvis billedets request starter sent i waterfallen og bliver LCP-elementet, så overvej preload. Hvis den starter tidligt, men downloader langsomt, er problemet størrelse, format, CDN-adfærd eller serverlatens — ikke opdagelse. For beslutninger om billedformater, se hvornår AVIF slår WebP, og hvornår det ikke gør.

Prefetch: til den næste side, ikke denne

prefetch fortæller browseren: “Denne ressource kan snart blive nødvendig, men den er ikke påkrævet lige nu.”

Den forskel er vigtig. Prefetch har med vilje lav prioritet. Browseren kan hente den i inaktiv tid og gemme den til senere brug. Den kan også springe den over på dårlige forbindelser, i data-saving modes eller under hukommelsespres.

Brug prefetch, når brugerens intention er stærk nok til at gøre den næste ressource sandsynlig.

Gode kandidater til prefetch inkluderer:

  • Næste trin i en checkout over flere sider.
  • Søgeresultater efter at en bruger begynder at skrive en forespørgsel, hvis den næste route er forudsigelig.
  • Dokumentationssider linket fra en indholdsfortegnelse, når brugeren aktivt læser nærliggende indhold.
  • Route chunks i en single-page app, efter at en bruger hover eller fokuserer på et navigationselement.

Dårlige kandidater til prefetch inkluderer:

  • Hele dit navigationstræ.
  • Store videoer eller billedgallerier.
  • Tredjeparts-scripts “for en sikkerheds skyld.”
  • Sider, som brugere sjældent besøger som det næste.

Prefetch er der, hvor tilbageholdenhed betaler sig. En ressource, der hentes og aldrig bruges, er ikke gratis. Den bruger båndbredde, serverkapacitet, energi og muligvis brugerens data. På mobilnetværk kan spekulativ hentning være direkte uvenligt.

For mange sites er den bedste prefetch-strategi intentionsbaseret. Prefetch ikke prissiden, så snart forsiden indlæses. Prefetch den, når brugeren åbner prismenuen, hover over prislinket eller scroller tæt på en call-to-action, der stærkt forudsiger navigation.

Husk også, at browseradfærd varierer. Nogle browsere er konservative med prefetch; nogle privatlivsindstillinger reducerer eller deaktiverer spekulativ indlæsning. Behandl prefetch som en opportunistisk forbedring, ikke som en korrekthedsmekanisme.

Preconnect: til dyre forbindelser til vigtige origins

preconnect fortæller browseren: “Begynd at oprette en forbindelse til denne origin nu.”

Det kan inkludere DNS-opslag, TCP-forbindelse og TLS-forhandling. For tredjeparts-origins kan denne opsætning tage hundredvis af millisekunder, især på netværk med høj latens. Hvis siden snart har brug for en kritisk request fra den origin, kan preconnect gøre den senere request hurtigere.

Eksempel:

<link rel='preconnect' href='https://fonts.gstatic.com' crossorigin>

Gode kandidater til preconnect inkluderer:

  • En font-origin, der bruges til renderingsblokerende tekst.
  • En kritisk API-origin, der er nødvendig under den første interaktion.
  • En CDN-origin, der serverer assets i den synlige del af siden.
  • En betalings- eller identitetsudbyder, der er nødvendig umiddelbart efter brugerhandling.

Dårlige kandidater til preconnect inkluderer:

  • Analytics- og annonceendpoints, der ikke er brugerkritiske.
  • Origins, der kun bruges i nogle sessioner.
  • Lange lister af tredjeparter.
  • Ressourcer på samme origin, hvor browseren allerede har eller snart vil åbne forbindelsen.

Preconnect har en holdeomkostning. Åbne sockets bruger hukommelse og netværksressourcer. Browsere lukker ubrugte forbindelser, men det gør ikke unødvendige preconnects harmløse.

En nyttig regel: Preconnect til højst én eller to tredjeparts-origins med høj sikkerhed på en side. Hvis du bliver fristet til at tilføje flere, har din tredjepartsarkitektur sandsynligvis mere brug for et eftersyn, end dine hints har brug for udvidelse.

DNS-prefetch: den lettere fætter

Du kan også se dns-prefetch:

<link rel='dns-prefetch' href='https://example-cdn.com'>

Dette resolver kun domænenavnet. Det åbner ikke en TCP- eller TLS-forbindelse. Det er billigere end preconnect, men også mindre hjælpsomt.

DNS-prefetch kan være rimeligt til tredjeparts-origins med lavere sikkerhed, hvor fuld preconnect føles for aggressivt. I praksis: Hvis en origin er kritisk og helt sikkert bruges snart, så foretræk preconnect. Hvis det blot er muligt, så brug enten DNS-prefetch eller gør ingenting.

Sådan beslutter du: en praktisk arbejdsgang

Begynd med måling, ikke tags.

1. Identificér flaskehalsen

Åbn en performance-trace, og kig efter sen opdagelse. Startede font-, hero-billede- eller script-requesten først, efter at en anden fil var hentet og parset? Det er en kandidat til preload.

Hvis en request først starter efter en lang DNS/TCP/TLS-opsætning til en tredjeparts-origin, er det en kandidat til preconnect.

Hvis den aktuelle side er fin, men den næste navigation forudsigeligt er langsom, kan prefetch hjælpe.

2. Tilføj ét hint ad gangen

Resource hints interagerer. Tilføj ét, test det, og behold det kun, hvis waterfallen forbedres, og brugerrettede metrics ikke går tilbage.

For preload skal du holde øje med, om den hintede ressource faktisk bruges kort tid efter. Chrome kan advare, når en preloadet ressource ikke bruges kort efter indlæsning. Tag den advarsel alvorligt.

3. Tjek bivirkninger på prioritet

Et preload kan trække båndbredde væk fra CSS, JavaScript eller billeder, der betyder mere. Et preconnect kan optage en forbindelsesplads. Et prefetch kan tilføje baggrundstrafik.

Det rigtige resultat er ikke “den hintede fil starter tidligere.” Det rigtige resultat er “siden bliver meningsfuldt bedre for brugerne.” Kig på LCP, INP, CLS og real-user monitoring, hvor det er muligt.

4. Verificér headers og caching

Hints kan sendes i HTML eller HTTP Link headers. Headers er nyttige, når serveren tidligt ved, hvad siden får brug for, men de er sværere at inspicere tilfældigt. Hvis du debugger, om et hint faktisk er til stede i produktion, betyder rå headers noget; det er præcis den slags situation, der dækkes i vores guide til debugging af redirects og HTTP headers.

Caching betyder også noget. Preloading af en ressource med uoverensstemmende credentials, forkert as eller forskellige URL-parametre kan forårsage dobbelte downloads. Det er en af de mest almindelige måder, et velment preload bliver til en performance-bug.

Almindelige fejl

At preloade for meget

Hvis alt er kritisk, er intet det. Begræns preload til ressourcer, der er nødvendige for initial rendering eller øjeblikkelig interaktivitet. En typisk side bør have nul til tre preloads, ikke tyve.

At bruge prefetch til påkrævede ressourcer

Prefetch har lav prioritet og er valgfrit. Brug det ikke til assets, som den aktuelle side kræver. Hvis siden har brug for det nu, så overvej preload eller normal HTML-opdagelse.

At preconnecte til alle tredjeparter

Sider med mange tredjeparter har ofte ti eller flere eksterne origins. At preconnecte til dem alle skaber støj. Vælg den ene eller de to, der både er kritiske og forudsigeligt bruges.

At glemme mobile forhold

Resource hints er mest værdifulde på langsommere forbindelser, men også farligst dér. Et spildt prefetch på en hurtig desktopforbindelse er en afrundingsfejl. På et begrænset mobilabonnement er det en dårlig handel.

En simpel beslutningstabel

| Situation | Bedste hint | Hvorfor | |---|---:|---| | Kritisk font opdaget gennem CSS | preload | Den aktuelle side har brug for den, opdagelsen er sen | | Hero-billede skjult bag CSS eller klient-rendering | preload | Kan forbedre LCP, hvis billedet starter sent | | Sandsynlig næste route efter brugerintention | prefetch | Hjælper fremtidig navigation uden at blokere den aktuelle side | | Kritisk tredjeparts font/API-origin | preconnect | Fjerner forbindelsesopsætning fra den kritiske sti | | Mulig, men usikker tredjeparts-origin | dns-prefetch eller ingen | Lavere omkostning, lavere sikkerhed | | Billede under folden | ingen | Lad lazy loading og browserprioritet virke |

Den rolige regel

Resource hints fungerer bedst, når de er kedelige og specifikke. Én font. Ét LCP-billede. Én vigtig tredjeparts-origin. Én sandsynlig næste route efter intention.

De fungerer dårligt, når de bruges som optimisme: måske får brugeren brug for dette, måske bør browseren hente det, måske betyder flere hints mere hastighed.

Browsere optimerer allerede aggressivt. Din opgave er ikke at micromanage hver request. Din opgave er at rette de få tilfælde, hvor browseren mangler information på det rigtige tidspunkt.

Ofte stillede spørgsmål

Bør jeg preloade alle mine fonts?
Nej. Preload kun de fontfiler, der er nødvendige for synlig tekst tidligt på siden. At preloade hver vægt og stil spilder som regel båndbredde og kan forsinke vigtigere ressourcer.
Er prefetch sikkert at bruge til alle interne links?
Som regel ikke. Det kan skabe unødvendig baggrundstrafik og spilde brugerdata. Foretræk intentionsbaseret prefetching, for eksempel efter hover, fokus, menuåbning eller et forudsigeligt næste trin.
Hvad er forskellen på preconnect og dns-prefetch?
Preconnect udfører DNS-, TCP- og TLS-opsætning for en origin. DNS-prefetch resolver kun domænenavnet. Preconnect er stærkere, men dyrere, så det bør bruges med større sikkerhed.
Kan resource hints forbedre Core Web Vitals?
Ja, især LCP, når de løser sen opdagelse eller forbindelsesopsætning for en kritisk ressource. De hjælper ikke, hvis det reelle problem er for store assets, langsom serverrespons, renderingsblokerende kode eller dårlig caching.
Bør resource hints tilføjes i HTML eller HTTP headers?
Begge dele kan fungere. HTML er lettere at ræsonnere om for sidespecifikke hints. HTTP Link headers kan være nyttige, når serveren kender kritiske ressourcer, før HTML parses, men de kræver omhyggelig test for at undgå dubletter eller forældede hints.

Kilder & videre læsning

  1. MDN: rel=preload
  2. MDN: Resource hints
  3. web.dev: Preconnect and DNS-prefetch
  4. W3C: Resource Hints
Om forfatteren
The Wux Webtools Team

Sidst opdateret:

Fortsæt med at læse