sandra-larsson
Educator Fullstack Developer Javascript at Chas Academy
FJS26 · V45 · EXTRA
Vad en fullstackare kan göra redan nu, och vad som väntar framöver.
Chas Academy · Frontendutveckling
Varför det spelar roll, och hur man mäter.
PRESTANDA
PRESTANDA
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.
MÄTA
MÄTA · CORE WEB VITALS
Googles tre mått på sidupplevelse. Gränserna gäller för 75 procent av besöken.
Largest Contentful Paint. När det största elementet syns. Bra: högst 2,5 s. Dåligt: över 4 s.
Interaction to Next Paint. Tiden från klick till att sidan svarar. Bra: högst 200 ms. Dåligt: över 500 ms.
Cumulative Layout Shift. Hur mycket innehållet hoppar. Bra: högst 0,1. Dåligt: över 0,25.
MÄTA
Inte Core Web Vitals, men de hjälper dig att hitta orsaken när LCP är dålig.
Time to First Byte. Hur snabbt servern svarar. Bra: högst 0,8 s. Här bor backend: hosting, databasfrågor, cache.
First Contentful Paint. När något alls syns. Bra: högst 1,8 s. Blockerande CSS och JS gör den sen.
MÄTA · VERKTYG
I DevTools. Labbdata: en simulerad mobil på strypt nät. Ger poäng och konkreta förslag.
pagespeed.web.dev. Fältdata från riktiga Chrome-användare, om sajten har tillräckligt med trafik, plus en Lighthouse-körning.
I DevTools. Spelar in laddningen och visar exakt vad som tar tid, och vilket element som är LCP.
Vattenfallet: varje fil, hur stor den är och när den laddas. Bra för att hitta den där bilden på 4 MB.
MÄTA · LIGHTHOUSE
Övning · i teamen
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?
[15 min]
En lista med tre saker ni kan åtgärda. Vi tar några exempel i helgrupp.
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
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">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">OPTIMERA NU · BILDER
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>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="...">OPTIMERA NU · RENDERINGSBLOCKERING
OPTIMERA NU · SCRIPT
Hämtas parallellt, körs efter HTML:en, i ordning. Standardvalet för er kod.
<script src="js/app.js" defer> </script>
Beter sig som defer automatiskt. Det ni använt sedan v43.
<script type="module"
src="js/main.js"></script>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>
OPTIMERA NU · TYPSNITT
Ö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">
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;
}OPTIMERA NU · FÖRLADDA
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>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"> <!-- ... -->
OPTIMERA NU
width och height, lazy på allt utom LCP-bilden.defer eller type="module". Ingen JavaScript i <head> utan något av dem.preconnect, display=swap, bara de vikter ni använder.FRAMÖVER
Minifiering, tree shaking (oanvänd kod tas bort) och hashade filnamn som går att cacha länge. Gratis när ni bygger.
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);
});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
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.
SAMMANFATTNING
width och height, defer på script, smarta typsnitt.By sandra-larsson