FJS26 · V45 · EXTRA

Prestanda

Vad en fullstackare kan göra redan nu, och vad som väntar framöver.

Chas Academy · Frontendutveckling


Idag

01Prestanda: varför, och hur man mäter~55 min02Optimera nu, och framöver~35 min
PRESTANDA2 / 22
01

Prestanda

Varför det spelar roll, och hur man mäter.

PRESTANDA


Varför bry sig?

  • Användarna lämnar. En sida som känns seg tappar besökare innan den hunnit visa något.
  • Sökmotorer mäter det. Core Web Vitals är en del av Googles signaler för sidupplevelse.
  • Inte alla har din dator. Billig mobil och dåligt nät är vardag för många. Det är också en tillgänglighetsfråga.
  • Det kostar. Varje onödig megabyte betalas av användaren, och ofta av servern.
PRESTANDA4 / 22

PRESTANDA

Upplevd hastighet

Prestanda handlar inte om hur snabb servern är, utan om hur det känns för användaren: hur fort något syns, hur fort sidan svarar och om den står still.

  • Syns det? Laddning
  • Svarar det? Interaktivitet
  • Står det still? Visuell stabilitet
PRESTANDA5 / 22

MÄTA


Fem mått längs laddningen

Från klick till användbar sidatidFörfråganTTFBförsta byten från servernFCPförsta texten synsLCPstörsta elementet syns?CLShoppar något?INPklick → svar
PRESTANDA6 / 22

MÄTA · CORE WEB VITALS


De tre som räknas

Googles tre mått på sidupplevelse. Gränserna gäller för 75 procent av besöken.

LCP

Largest Contentful Paint. När det största elementet syns. Bra: högst 2,5 s. Dåligt: över 4 s.

INP

Interaction to Next Paint. Tiden från klick till att sidan svarar. Bra: högst 200 ms. Dåligt: över 500 ms.

CLS

Cumulative Layout Shift. Hur mycket innehållet hoppar. Bra: högst 0,1. Dåligt: över 0,25.

PRESTANDA7 / 22

MÄTA


Två stödmått

Inte Core Web Vitals, men de hjälper dig att hitta orsaken när LCP är dålig.

TTFB

Time to First Byte. Hur snabbt servern svarar. Bra: högst 0,8 s. Här bor backend: hosting, databasfrågor, cache.

FCP

First Contentful Paint. När något alls syns. Bra: högst 1,8 s. Blockerande CSS och JS gör den sen.

PRESTANDA8 / 22

MÄTA · VERKTYG


Fyra sätt att mäta

Lighthouse

I DevTools. Labbdata: en simulerad mobil på strypt nät. Ger poäng och konkreta förslag.

PageSpeed Insights

pagespeed.web.dev. Fältdata från riktiga Chrome-användare, om sajten har tillräckligt med trafik, plus en Lighthouse-körning.

Performance-fliken

I DevTools. Spelar in laddningen och visar exakt vad som tar tid, och vilket element som är LCP.

Network-fliken

Vattenfallet: varje fil, hur stor den är och när den laddas. Bra för att hitta den där bilden på 4 MB.

PRESTANDA9 / 22

MÄTA · LIGHTHOUSE


Så läser du rapporten

  • Fyra kategorier: Performance, Accessibility, Best Practices och SEO. Poäng 0–100, grönt från 90.
  • Performance vägs ihop av fem mått: TBT 30 %, LCP 25 %, CLS 25 %, FCP 10 % och Speed Index 10 %.
  • TBT (Total Blocking Time) är labbets ersättare för INP: hur länge JavaScript blockerar sidan.
  • Kör i inkognito. Tillägg i webbläsaren påverkar resultatet.
  • Poängen varierar mellan körningar. Läs Diagnostics och förslagen, inte bara siffran.
PRESTANDA10 / 22

Övning · i teamen

Lighthouse på er quiz-app

Kör Lighthouse (Mobile) på er u03. Skriv ner poängen i alla fyra kategorier, och de tre största problemen under Performance. Vilket element är LCP?

Tid

[15 min]

Mål

En lista med tre saker ni kan åtgärda. Vi tar några exempel i helgrupp.

PRESTANDA11 / 22
02

Optimera

Det du kan göra redan nu med HTML, CSS och JavaScript. Sedan vad som väntar.

”

Mät först. Börja med det som ger mest. Oftast är det bilderna.

OPTIMERA NU · BILDER


Bilden som inte hoppar

Vanlig bild längre ner

width och height reserverar platsen, så sidan inte hoppar (CLS). loading="lazy" väntar tills den är nära.

<img src="img/team.webp"
     width="800" height="600"
     alt="Teamet vid tavlan"
     loading="lazy"
     decoding="async">

LCP-bilden högst upp

Aldrig lazy. Be i stället webbläsaren hämta den först.

<img src="img/hero.webp"
     width="1600" height="900"
     alt=""
     fetchpriority="high">
PRESTANDA14 / 22

OPTIMERA NU · BILDER


Rätt format och rätt storlek

Moderna format med reserv

AVIF och WebP är ofta mycket mindre än JPEG. Webbläsaren tar det första den förstår.

<picture>
  <source srcset="hero.avif" type="image/avif">
  <source srcset="hero.webp" type="image/webp">
  <img src="hero.jpg" alt="..."
       width="1600" height="900">
</picture>

Olika storlek för olika skärm

En mobil ska inte ladda bilden för en 4K-skärm.

<img src="hero-800.webp"
     srcset="hero-400.webp 400w,
             hero-800.webp 800w,
             hero-1600.webp 1600w"
     sizes="(max-width: 600px) 100vw, 50vw"
     alt="...">
PRESTANDA15 / 22

OPTIMERA NU · RENDERINGSBLOCKERING


Låt HTML:en komma först

Script i <head> blockerarBlockerandeHTMLCSSapp.jssidan synsför användarentom skärm så längeMed deferHTMLCSSsidan synsför användarenapp.jsladdas parallellt, körs efter HTML:en
PRESTANDA16 / 22

OPTIMERA NU · SCRIPT


defer, async och module

defer

Hämtas parallellt, körs efter HTML:en, i ordning. Standardvalet för er kod.

<script src="js/app.js" defer>
</script>

type="module"

Beter sig som defer automatiskt. Det ni använt sedan v43.

<script type="module"
        src="js/main.js"></script>

async

Körs så fort den är hämtad, i vilken ordning som helst. För fristående saker som statistik.

<script async
  src="https://example.com/analytics.js">
</script>
PRESTANDA17 / 22

OPTIMERA NU · TYPSNITT


Typsnitt utan blank text

Google Fonts

Öppna anslutningen tidigt, och visa reservtypsnittet medan det riktiga laddas (display=swap). Ta bara vikterna du använder.

<link rel="preconnect"
  href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet"
  href="https://fonts.googleapis.com/css2?family=Lato:wght@400;700&display=swap">

Eget typsnitt

WOFF2 är det minsta formatet. Hosta själv så slipper du en extra server.

@font-face {
  font-family: "Lato";
  src: url("fonts/lato-400.woff2")
       format("woff2");
  font-display: swap;
}
PRESTANDA18 / 22

OPTIMERA NU · FÖRLADDA


Säg vad som är viktigast

preload

Hämta en resurs tidigt, innan webbläsaren hittat den själv. Bra för en bakgrundsbild i CSS som är LCP.

<link rel="preload" as="image"
      href="img/hero.webp">

<link rel="preload" as="font"
      href="fonts/lato-400.woff2"
      type="font/woff2" crossorigin>

Men inte allt

Förladdar du allt är inget prioriterat. Ett eller två saker, och bara det som syns direkt.

<!-- Nej -->
<link rel="preload" as="image" href="1.jpg">
<link rel="preload" as="image" href="2.jpg">
<link rel="preload" as="image" href="3.jpg">
<!-- ... -->
PRESTANDA19 / 22

OPTIMERA NU


Checklista för u03

  • Bilder: rätt format, komprimerade, width och height, lazy på allt utom LCP-bilden.
  • Script med defer eller type="module". Ingen JavaScript i <head> utan något av dem.
  • Typsnitt: preconnect, display=swap, bara de vikter ni använder.
  • Hämta data en gång. Inte samma fetch i varje klick.
  • Inga bibliotek för något som går på tre rader egen kod.
  • Kör Lighthouse igen efteråt. Blev det bättre?
PRESTANDA20 / 22

FRAMÖVER


Det som väntar i kursen

Bygga med Vite

Minifiering, tree shaking (oanvänd kod tas bort) och hashade filnamn som går att cacha länge. Gratis när ni bygger.

Code splitting

Ladda kod först när den behövs. I React: lazy() per sida.

button.addEventListener("click", async () => {
  const { drawChart } =
    await import("./chart.js");
  drawChart(data);
});

Servern

Cache-headers, komprimering (gzip, Brotli) och ett CDN som serverar filerna nära användaren. Snabba databasfrågor ger låg TTFB.

Cache-Control: public,
  max-age=31536000, immutable

Rendering

Server-side rendering och statiska sidor, till exempel med Next.js: HTML:en är klar när den kommer. Bra för både LCP och SEO.

PRESTANDA21 / 22

SAMMANFATTNING


Att ta med sig

  • Mät först. Lighthouse i DevTools, PageSpeed Insights för riktiga användare.
  • Core Web Vitals: LCP högst 2,5 s, INP högst 200 ms, CLS högst 0,1.
  • Nu: små bilder med width och height, defer på script, smarta typsnitt.
  • Framöver: bundler, cache, CDN och rendering på servern.
PRESTANDA22 / 22

Prestanda

By sandra-larsson

Prestanda

  • 0