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
Del 1, ungefär en och en halv timme.
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.
Del 2, ungefär en och en halv timme.
SEO
Search Engine Optimization: att göra det lätt för sökmotorer att hitta, förstå och visa din sida för rätt sökningar.
SEO · SERP
SEO
SEO
SEO · <HEAD>
Titeln blir den blå länken i sökresultatet. Beskrivningen blir ofta texten under.
<html lang="sv">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, initial-scale=1">
<title>Europas huvudstäder – Quiz</title>
<meta name="description"
content="Tio frågor om Europas huvudstäder.
Hur många klarar du?">
<link rel="canonical"
href="https://example.com/quiz/europa">
</head>title: unik per sida, det viktigaste först, runt 50–60 tecken. description: en mening som lockar till klick. canonical: vilken adress som är originalet om samma innehåll finns på flera. keywords: ignoreras av Google sedan länge.
SEO · <BODY>
En h1 per sida, sedan h2, h3 i ordning. Sökmotorn läser strukturen som ett innehållsregister.
<main> <h1>Europas huvudstäder</h1> <h2>Så fungerar quizet</h2> <p>...</p> <h2>Topplista</h2> </main>
alt beskriver bilden. Länktexten beskriver målet. Sökmotorer följer <a href>, inte klick-händelser.
<img src="paris.webp" alt="Eiffeltornet i kvällsljus">
<!-- Nej -->
<a href="/regler">Klicka här</a>
<div onclick="go('/regler')">Regler</div>
<!-- Ja -->
<a href="/regler">Läs reglerna</a>SEO
/quiz/europa säger mer än /index.html?id=7f3a.SEO · LINKBUILDING
SEO · LINKBUILDING
Kallas off-page SEO: det händer utanför din kod.
Gör något värt att länka till: en guide, ett verktyg, öppen kod. Branschregister, partners och gästinlägg. Kvalitet före antal: en relevant och betrodd länk slår hundra okända.
Köpta länkar, länkfarmar och länkspam i kommentarsfält. Google känner igen mönstren och kan sänka hela sajten.
Då räknas de inte som röster.
<a href="..." rel="sponsored"> <a href="..." rel="ugc"> <a href="..." rel="nofollow">
När någon delar din länk i Slack, LinkedIn eller Messenger.
SOCIALA MEDIER
SOCIALA MEDIER
Bilden ska ha absolut URL. 1200 × 630 px fungerar nästan överallt.
<meta property="og:type" content="website"> <meta property="og:title" content="Europas huvudstäder – Quiz"> <meta property="og:description" content="Tio frågor. Hur många klarar du?"> <meta property="og:image" content="https://example.com/og/europa.png"> <meta property="og:url" content="https://example.com/quiz/europa"> <meta property="og:locale" content="sv_SE">
X läser Open Graph som reserv. Det som behövs i tillägg är korttypen, för stor bild.
<meta name="twitter:card" content="summary_large_image"> <meta name="twitter:image:alt" content="Karta över Europa">
robots.txt, sitemap och structured data.
HJÄLP CRAWLERN
Ligger i roten. Säger vad crawlers får besöka. Inget skydd: hemliga sidor ska ha inloggning.
User-agent: * Disallow: /admin/ Sitemap: https://example.com/sitemap.xml
En lista över sidorna du vill ha indexerade. Skicka in den i Google Search Console.
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns=
"http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://example.com/</loc>
<lastmod>2026-11-04</lastmod>
</url>
</urlset>HJÄLP CRAWLERN
Berätta med maskinläsbar data vad sidan handlar om. Ordförrådet kommer från schema.org.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Person",
"name": "[Ditt namn]",
"jobTitle": "Fullstackutvecklare",
"url": "https://[din-portfolio].se",
"sameAs": [
"https://github.com/[du]",
"https://www.linkedin.com/in/[du]"
]
}
</script>Kan ge rich results i Google: betyg, priser, evenemang, recept. Och det är exakt den sortens data AI-tjänster har lätt att läsa. Testa med Googles Rich Results Test eller Schema Markup Validator.
Det som blir viktigt när ni bygger med React.
JAVASCRIPT OCH SEO
FRAMÖVER
I en app med flera vyer ska varje vy ha egen titel. React 19 lyfter <title> och <meta> till <head> automatiskt.
function QuizPage({ quiz }) {
return (
<>
<title>{quiz.name} – Quiz</title>
<meta name="description"
content={quiz.summary} />
<h1>{quiz.name}</h1>
</>
);
}Med Next.js blir HTML:en, och metadatan, klar på servern. Bäst för SEO, delningskort och AI-crawlers.
// app/quiz/[slug]/page.tsx
export async function generateMetadata({ params }) {
const quiz = await getQuiz((await params).slug);
return {
title: quiz.name,
openGraph: { images: [quiz.image] },
};
}AEO
Att bli källan när svaret kommer från en AI i stället för en lista med länkar: ChatGPT, Perplexity, Googles AI Overviews. Kallas också GEO, Generative Engine Optimization.
AEO
AEO
AI-företagen har egna crawlers med egna namn. Man kan stänga ute träning men tillåta sök.
# Inte för träning User-agent: GPTBot Disallow: / User-agent: Google-Extended Disallow: / # Men gärna i ChatGPT:s sökning User-agent: OAI-SearchBot Allow: /
Ett förslag från 2024: en markdownfil i roten som sammanfattar sajten för språkmodeller. Ingen standard, och det är oklart vilka tjänster som läser den. Bra att känna till, inte att lita på.
Övning · i teamen
Lägg till lang, en bra title och description, och Open Graph-taggar med en delningsbild. Kör Lighthouse igen och titta på SEO. Testa länken i opengraph.xyz eller genom att klistra in den i Slack.
[20 min]
Ett delningskort som ser ut som ni vill, och SEO-poäng i grönt.
SAMMANFATTNING
width och height, defer på script, smarta typsnitt.title, description och länkar.By sandra-larsson