Förladda, förhÀmta och andra taggar

Det finns mÄnga sÀtt att förbÀttra webbprestanda. En av dem Àr förladdning av innehÄll som kommer att behövas senare. CSS-förbearbetning, förrendering av helsidor eller upplösning av domÀnnamn. Vi gör allt i förvÀg och visar sedan resultatet direkt! LÄter coolt.

Vad som Àr Ànnu coolare Àr att det Àr vÀldigt enkelt implementerat. Fem taggar ge webblÀsaren ett kommando för att utföra preliminÀra ÄtgÀrder:

<link rel="prefetch" href="/sv/style.css" as="style" />
<link rel="preload" href="/sv/style.css" as="style" />

<link rel="preconnect" href="https://example.com" />
<link rel="dns-prefetch" href="https://example.com" />

<link rel="prerender" href="https://example.com/about.html" />


LÄt oss kort förklara vad de gör och nÀr de ska anvÀndas.

Se hur: förbelastning · prefetch · föranslut · dns-prefetch · förlÀngning

förbelastning

<link rel= "preload"> ber webblÀsaren att ladda och cachelagra en resurs (som ett skript eller en stilmall) sÄ snart som möjligt. Detta Àr anvÀndbart nÀr en resurs behövs nÄgra sekunder efter att sidan har laddats - och du vill pÄskynda processen.

WebblÀsaren gör ingenting med resursen efter laddning. Skript körs inte, stilmallar tillÀmpas inte. Resursen cachelagras och görs omedelbart tillgÀnglig pÄ begÀran.

syntax

<link rel="preload" href="/sv/style.css" as="style" />

href pekar pÄ resursen du vill ladda ner.

as kan vara vad som helst som kan laddas ner i webblÀsaren:

  • style för stilmallar,
  • script för manus,
  • font för typsnitt,
  • fetch för resurser som laddas med fetch() eller XMLHttpRequest,
  • se hela listan pĂ„ MDN.

Det Ă€r viktigt att specificera attributet as – detta hjĂ€lper webblĂ€saren att korrekt prioritera och schemalĂ€gga nedladdningar.

NÀr du ska anvÀnda den

AnvÀnd förladdning nÀr resursen behövs inom en mycket nÀra framtid. Till exempel:

  • Icke-standardtypsnitt frĂ„n en extern fil:
    <!-- index.html -->
    <link rel="stylesheet" href="index.css" />
    /* index.css */
    @font-face {
      src: url('comic-sans.woff2') format('woff2');
    }

    Som standard comic-sans.woff2 kommer att börja laddas först efter nedladdning och analys index.css. För att undvika att vÀnta sÄ lÀnge kan du ladda ner typsnittet tidigare med <link rel= "preload">:

    <link rel="preload" href="comic-sans.woff2" as="font" />
  • Om du separerar dina stilar enligt tillvĂ€gagĂ„ngssĂ€ttet Kritisk CSS i tvĂ„ delar, kritiska (för omedelbar rendering) och icke-kritiska:
    <style>
    /* Inlined critical styles */
    </style>
    
    <script>
    /* Custom JS that starts downloading non-critical styles */
    loadCSS('/app/non-critical.css');
    </script>

    Med detta tillvÀgagÄngssÀtt kommer icke-kritiska stilar bara att börja laddas nÀr JavaScript körs, vilket kan hÀnda nÄgra sekunder efter renderingen. IstÀllet för att vÀnta anvÀnder JS <link rel= "preload">för att börja ladda ner tidigare:

    <style>
    /* Inlined critical styles */
    </style>
    
    <link rel="preload" href="/sv/app/non-critical.css" as="style" />
    
    <script>
    /* Custom JS that starts downloading non-critical styles */
    loadCSS('/app/non-critical.css');
    </script>

ÖveranvĂ€nd inte förladdning. Om du laddar allt i rad kommer sajten inte att pĂ„ magiskt sĂ€tt snabba upp, tvĂ€rtom kommer den att hindra webblĂ€saren frĂ„n att planera sitt arbete korrekt.

Ej att förvÀxla med förhÀmtning. AnvÀnd inte <link rel= "preload">, om du inte behöver resursen direkt efter att sidan har laddats. Om du behöver det senare, till exempel för nÀsta sida, anvÀnd dÄ <link rel= "prefetch">.

detaljer

Detta Àr en obligatorisk tagg ska köras av webblÀsaren (om den stöder det), till skillnad frÄn alla andra taggar relaterad till förladdning. WebblÀsaren mÄste ladda ner resursen som anges i <link rel="preload">. I andra fall kan den ignorera förladdning, till exempel om den körs pÄ en lÄngsam anslutning.

Prioriteringar. WebblÀsare tilldelar vanligtvis olika prioriteringar till olika resurser (stilar, skript, typsnitt, etc.) för att ladda de viktigaste resurserna först. I det hÀr fallet bestÀmmer webblÀsaren prioritet efter attribut as. För webblÀsaren Chrome kan du titta pÄ full prioritetstabell.

Förladda, förhÀmta och andra taggar

prefetch

<link rel= "prefetch"> ber webblÀsaren att ladda ner och cachelagra en resurs (som ett skript eller en stilmall) i bakgrunden. InlÀsning sker med lÄg prioritet sÄ att det inte stör viktigare resurser. Detta Àr anvÀndbart om resursen behövs pÄ nÀsta sida och du vill cache den i förvÀg.

Även hĂ€r gör webblĂ€saren ingenting med resursen efter att ha laddats. Skript körs inte, stilmallar tillĂ€mpas inte. Resursen cachelagras och görs omedelbart tillgĂ€nglig pĂ„ begĂ€ran.

syntax

<link rel="prefetch" href="/sv/style.css" as="style" />

href pekar pÄ resursen du vill ladda ner.

as kan vara vad som helst som kan laddas ner i webblÀsaren:

  • style för stilmallar,
  • script för manus,
  • font för typsnitt,
  • fetch för resurser som laddas med fetch() eller XMLHttpRequest,
  • se hela listan pĂ„ MDN.

Det Ă€r viktigt att specificera attributet as - detta hjĂ€lper webblĂ€saren att korrekt prioritera och schemalĂ€gga nedladdningar.

NÀr du ska anvÀnda den

För att ladda resurser frÄn andra sidor, om du behöver en resurs frÄn en annan sida och du vill förladda den för att sedan snabba upp renderingen av den sidan. Till exempel:

  • Du har en webbutik och 40 % av anvĂ€ndarna lĂ€mnar startsidan för produktsidan. AnvĂ€nda sig av <link rel= "prefetch">, laddar CSS- och JS-filer för att rendera produktsidor.
  • Du har en ensidig applikation och olika sidor laddar olika paket. NĂ€r en anvĂ€ndare besöker en sida kan paket för alla sidor den lĂ€nkar till laddas i förvĂ€g.

Det Àr troligt att denna tagg kan anvÀndas sÀkert i vilken utstrÀckning som helst.. WebblÀsare schemalÀgger vanligtvis förhÀmtning med lÀgst prioritet, sÄ det stör ingen. TÀnk bara pÄ att det förbrukar anvÀndartrafik, vilket kan kosta pengar.

Inte för brÄdskande förfrÄgningar. AnvÀnd inte <link rel= "prefetch">, nÀr resursen behövs inom nÄgra sekunder. AnvÀnd i det hÀr fallet <link rel= "preload">.

detaljer

Valfri tagg. WebblÀsaren behöver inte följa denna instruktion, den kan ignorera den, till exempel vid en lÄngsam anslutning.

Prioritet i Chrome. I Chrome <link rel= "prefetch"> körs vanligtvis med minsta prioritet (se full prioritetstabell), det vill sÀga efter att ha laddat allt annat.

föranslut

<link rel= "preconnect"> ber webblÀsaren att ansluta till domÀnen i förvÀg nÀr du vill pÄskynda anslutningsinstallationen i framtiden.

WebblÀsaren mÄste upprÀtta en anslutning om den hÀmtar nÄgra resurser frÄn en ny tredjepartsdomÀn. Till exempel, om den laddar Google Fonts, React-fonter frÄn ett CDN eller begÀr ett JSON-svar frÄn en API-server.

Att etablera en ny anslutning tar vanligtvis nÄgra hundra millisekunder. Det görs en gÄng, men tar ÀndÄ tid. Om du har upprÀttat en anslutning i förvÀg kommer du att spara tid och ladda ner resurser frÄn denna domÀn snabbare.

syntax

<link rel= "preconnect" href="https://api.my-app.com" />

href anger det domÀnnamn som du vill bestÀmma IP-adressen för. Kan anges med ett prefix (https://domain.com) eller utan det (//domain.com).

NÀr du ska anvÀnda den

AnvÀnd för domÀner som kommer att behövas snart för att ladda ner en viktig stil, ett skript eller en bild dÀrifrÄn, men du kÀnner inte till resursens URL Àn. Till exempel:

  • Din applikation Ă€r vĂ€rd pĂ„ my-app.com och gör AJAX-förfrĂ„gningar till api.my-app.com: Du kĂ€nner inte till de specifika frĂ„gorna i förvĂ€g eftersom de görs dynamiskt frĂ„n JS. HĂ€r Ă€r det ganska lĂ€mpligt att anvĂ€nda en tagg för att föransluta till domĂ€nen.
  • Din applikation Ă€r vĂ€rd pĂ„ my-app.com och anvĂ€nder Google Fonts. De laddas ner i tvĂ„ steg: först laddas CSS-filen ner frĂ„n domĂ€nen fonts.googleapis.com, dĂ„ begĂ€r den hĂ€r filen typsnitt med fonts.gstatic.com. Du kan inte veta vilka specifika teckensnittsfiler kommer frĂ„n fonts.gstatic.com du behöver tills du laddar CSS-filen, sĂ„ vi kan bara göra en preliminĂ€r anslutning i förvĂ€g.

AnvÀnd den hÀr taggen för att snabba upp nÄgot tredjepartsskript eller stil lite pÄ grund av förutbestÀmd anslutning.

ÖveranvĂ€nd inte. Att upprĂ€tta och underhĂ„lla en anslutning Ă€r en dyr operation för bĂ„de klienten och servern. AnvĂ€nd denna tagg för maximalt 4-6 domĂ€ner.

detaljer

Valfri tagg. WebblÀsaren behöver inte följa denna instruktion och kan ignorera den, till exempel om mÄnga anslutningar redan har upprÀttats eller i nÄgot annat fall.

Vad omfattar anslutningsprocessen?. För att ansluta till varje webbplats mÄste webblÀsaren göra följande:

  • DNS-upplösning. Hitta serverns IP-adress (216.58.215.78) för det angivna domĂ€nnamnet (google.com).
  • TCP-handslag. Byt paket (klient → server → klient) för att initiera en TCP-anslutning med servern.
  • TLS-handslag (endast HTTPS-webbplatser). TvĂ„ omgĂ„ngar av paketutbyte (klient → server → klient → server → klient) för att initiera en sĂ€ker TLS-session.

Notera: HTTP/3 kommer att förbÀttra och pÄskynda handskakningsmekanismen, men det Àr fortfarande lÄngt kvar.

dns-prefetch

<link rel= "dns-prefetch"> ber webblÀsaren att utföra DNS-upplösning för domÀnen i förvÀg om du snart ska ansluta till den och vill pÄskynda den initiala anslutningen.

WebblÀsaren mÄste faststÀlla domÀnens IP-adress om den kommer att hÀmta nÄgra resurser frÄn en ny tredjepartsdomÀn. Till exempel laddar Google Fonts, React-fonter frÄn ett CDN eller begÀr ett JSON-svar frÄn en API-server.

För varje ny domĂ€n tar DNS-postupplösningen vanligtvis cirka 20-120 ms. Detta pĂ„verkar bara laddningen av den första resursen frĂ„n en given domĂ€n, men introducerar fortfarande en fördröjning. Om vi ​​utför DNS-upplösning i förvĂ€g kommer vi att spara tid och ladda resursen snabbare.

syntax

<link rel= "dns-prefetch" href="https://api.my-app.com" />

href anger det domÀnnamn som du vill stÀlla in IP-adressen för. Kan anges med ett prefix (https://domain.com) eller utan det (//domain.com).

NÀr du ska anvÀnda den

AnvÀnd för domÀner som kommer att behövas snart att ladda ner resurser dÀrifrÄn som webblÀsaren inte kÀnner till i förvÀg. Till exempel:

  • Din applikation Ă€r vĂ€rd pĂ„ my-app.com och gör AJAX-förfrĂ„gningar till api.my-app.com: Du kĂ€nner inte till de specifika frĂ„gorna i förvĂ€g eftersom de görs dynamiskt frĂ„n JS. HĂ€r Ă€r det ganska lĂ€mpligt att anvĂ€nda en tagg för att föransluta till domĂ€nen.
  • Din applikation Ă€r vĂ€rd pĂ„ my-app.com, och anvĂ€nder Google Fonts. De laddas ner i tvĂ„ steg: först laddas CSS-filen ner frĂ„n domĂ€nen fonts.googleapis.com, dĂ„ begĂ€r den hĂ€r filen typsnitt med fonts.gstatic.com. Du kan inte veta vilka specifika teckensnittsfiler kommer frĂ„n fonts.gstatic.com du kommer att behöva den tills du laddar CSS-filen, sĂ„ vi kan bara göra en preliminĂ€r anslutning i förvĂ€g.

AnvÀnd den hÀr taggen för att snabba upp nÄgot tredjepartsskript eller stil lite pÄ grund av förutbestÀmd anslutning.

Observera liknande egenskaper som <link rel= "dns-prefetch"/> О <link rel= "preconnect">. Det brukar inte vara meningsfullt att anvÀnda dem tillsammans för en domÀn: <link rel= "preconnect"> inkluderar redan <link rel= "dns-prefetch"/> och mycket mer. Detta kan motiveras i tvÄ fall:

  • Vill du stödja Ă€ldre webblĂ€sare?. <link rel= "dns-prefetch" /> stöds av sedan IE10 och Safari 5. <link rel= "preconnect"> stöddes ett tag i Chrome och Firefox, men lades bara till i Safari i 11.1 och stöds fortfarande inte i IE/Edge. Om du behöver stödja dessa webblĂ€sare, anvĂ€nd <link rel= "dns-prefetch" /> som reservalternativ för <link rel= "preconnect">.
  • Du vill pĂ„skynda anslutningar till fler Ă€n 4-6 domĂ€ner. MĂ€rka <link rel= "preconnect"> Det rekommenderas inte att anvĂ€nda med fler Ă€n 4-6 domĂ€ner, eftersom att upprĂ€tta och underhĂ„lla en anslutning Ă€r en dyr operation. <link rel= "dns-prefetch" /> förbrukar mindre resurser, sĂ„ anvĂ€nd den vid behov.

detaljer

Valfri tagg. WebblÀsaren behöver inte följa denna instruktion, sÄ den kanske inte utför DNS-upplösning, till exempel om det finns mÄnga sÄdana taggar pÄ sidan eller i nÄgot annat fall.

Vad Àr DNS. Varje server pÄ Internet har en unik IP-adress, som ser ut 216.58.215.78. Namnet pÄ webbplatsen skrivs vanligtvis in i webblÀsarens adressfÀlt (t.ex. google.com), och DNS-servrar (Domain Name System) matchar det med serverns IP-adress (216.58.215.78).

För att faststĂ€lla en IP-adress mĂ„ste webblĂ€saren frĂ„ga DNS-servern. Det tar 20−120 ms nĂ€r du ansluter till en ny tredjepartsdomĂ€n.

DNS cachelagras, Àven om det inte Àr sÀrskilt tillförlitligt. Vissa operativsystem och webblÀsare cachelagrar DNS-förfrÄgningar: detta sparar tid pÄ upprepade frÄgor, men det gÄr inte att lita pÄ cachelagring. PÄ Linux fungerar det vanligtvis inte alls. Chrome har en DNS-cache, men den varar bara i en minut. Windows cachar DNS-svar i fem dagar.

förlÀngning

<link rel= "prerender"> ber webblÀsaren att ladda ner URL:en och visa den pÄ en osynlig flik. NÀr anvÀndaren klickar pÄ lÀnken ska sidan visas omedelbart. Detta Àr anvÀndbart om du Àr sÀker pÄ att anvÀndaren kommer att besöka en viss sida och vill pÄskynda visningen av den.

Trots (eller pÄ grund av) den exceptionella effektiviteten av denna tagg, 2019 <link rel= "prerender"> dÄligt stöd i större webblÀsare. Se mer information. nedan.

syntax

<link rel="prerender" href="https://my-app.com/pricing" />

href pekar pÄ webbadressen som du vill börja rendera i bakgrunden.

NÀr du ska anvÀnda den

NÀr du Àr riktigt sÀker pÄ att anvÀndaren kommer att gÄ till en viss sida. Om du har en "tunnel" genom vilken 70 % av besökarna pÄ sida A gÄr till sida B, dÄ <link rel= "prerender"> pÄ sida A hjÀlper till att visa sida B mycket snabbt.

ÖveranvĂ€nd inte. Förrendering Ă€r extremt dyrt vad gĂ€ller bandbredd och minne. AnvĂ€nd inte <link rel= "prerender"> för mer Ă€n en sida.

detaljer

Valfri tagg. WebblÀsaren behöver inte följa denna instruktion och kan ignorera den, till exempel vid en lÄngsam anslutning eller nÀr det inte finns tillrÀckligt med ledigt minne.

För att spara minne Chrome gör inte full renderingOch endast förladda NoState. Det betyder att Chrome lÀser in sidan och alla dess resurser, men inte renderar eller kör JavaScript.

Firefox och Safari stöder inte den hÀr taggen alls. Detta bryter inte mot specifikationen, eftersom webblÀsare inte behöver följa denna instruktion; men fortfarande ledsen. Implementeringsbugg Firefox har varit öppet i sju Är. Det finns rapporter om att Safari stöder inte den hÀr taggen heller.

Sammanfattning

AnvÀnda sig av:

  • <link rel= "preload"> - nĂ€r du behöver en resurs pĂ„ nĂ„gra sekunder
  • <link rel= "prefetch"> - nĂ€r du behöver resursen pĂ„ nĂ€sta sida
  • <link rel= "preconnect"> - nĂ€r du vet att du kommer att behöva en resurs snart, men du vet Ă€nnu inte dess fullstĂ€ndiga URL
  • <link rel= "dns-prefetch"> - pĂ„ samma sĂ€tt, nĂ€r du vet att du kommer att behöva en resurs snart, men du Ă€nnu inte kĂ€nner till dess fullstĂ€ndiga URL (för Ă€ldre webblĂ€sare)
  • <link rel= "prerender"> â€” nĂ€r du Ă€r sĂ€ker pĂ„ att anvĂ€ndare kommer att gĂ„ till en viss sida och du vill snabba upp dess visning

KĂ€lla: will.com

LĂ€gg en kommentar