100 point i PageSpeed: Hvad vi ændrede for at nå det
Indlæsningstid er en rangeringsfaktor, men de gængse råd hjælper sjældent. Dette indlæg beskriver, hvad vi faktisk ændrede på vores egen side, hvor meget hvert tiltag gav, og hvor vi drejede forkert.
Det vigtigste kort
- Den største enkeltgevinst kom ikke af at formindske filer, men af at erstatte et bibliotek på 458 KB med 6 KB egen kode.
- Den næststørste årsag var en halvt konfigureret komprimering: serveren komprimerede kun HTML, ikke CSS og JavaScript.
- Et layoutspring med værdien 1 kostede 24 point – forårsaget af eftersendt CSS, der først virkede efter den første billedopbygning.
- Det, der gav mindst: billedformater. Det, der gav mest: at udelade ting.
Udgangsværdien var 58 ud af 100 på mobilen. Det er ikke en dårlig værdi for et website med 3D-effekt i toppen, men en værdi, som Google straffer mærkbart i den mobile søgning. Til sidst stod der 100 point på computeren og 98 på mobilen, med ligeledes 100 for tilgængelighed.
Det, der følger, er ikke en almen tjekliste, men det faktiske forløb – inklusive de steder, hvor vi tog fejl.
Udgangspunktet
| Måleværdi (mobil) | før | efter |
|---|---|---|
| Ydeevne | 58 | 98 |
| Tilgængelighed | 95 | 100 |
| Første billedopbygning | 6,1 s | 1,4 s |
| Største element synligt | 11,1 s | 2,1 s |
| Overført i alt | 298 KB | 184 KB |
| heraf JavaScript | 121 KB | 5 KB |
De fem indgreb, der virkelig talte
1. Erstat biblioteket, optimér det ikke
Topområdet viser en partikelsky i 3D. Til det kørte et kendt grafikbibliotek – 458 KB efter formindskelse. Målingen viste, at 51 KB af det aldrig overhovedet blev udført.
Det afgørende blik var spørgsmålet om, hvor meget vi faktisk har brug for. Det var elleve byggesten: renderer, scene, kamera, geometri, materiale og et par hjælpeklasser. Alt det kan programmeres direkte mod browserens grafikgrænseflade.
Resultat: 458 KB blev til 6 KB. Fremstillingen er identisk – vi overtog de samme shaders.
2. Komprimeringen var kun halvt slået til
I serverkonfigurationen stod komprimeringen på «til» – men den linje, der angiver, hvilke filtyper der skal komprimeres, var kommenteret ud. Det er standardindstillingen i mange distributioner. Resultat: der blev udelukkende komprimeret HTML.
Grafikbiblioteket gik altså ukomprimeret over ledningen. Efter at det blev slået til: 1243 KB blev til 251 KB. Derudover lægger vi nu de komprimerede udgaver forudberegnet ved siden af, så serveren ikke regner forfra ved hvert kald.
Indsats: to linjer konfiguration. Virkning: knap en megabyte per førstegangskald.
3. Fjern animationsbiblioteket helt
Til indtoninger ved scroll kørte endnu et bibliotek, 114 KB. Målingen udpegede det derudover som årsag til fremtvungne layoutombrud – det spurgte til geometri under scrollingen og tvang browseren til at genberegne layoutet midt i bevægelsen.
Erstattet af en IntersectionObserver, der blot sætter en klasse. Selve bevægelsen laver CSS. 114 KB mindre, ingen ombrud mere, omkring 40 linjer egen kode.
4. Faviconet var 205 KB stort
En bagatel med forbløffende virkning, fordi den indlæses meget tidligt. Erstattet af en SVG-fil på 6 KB, dannet ud fra det eksisterende logo.
Vidste du det?
Til visningen i Googles søgeresultater nytter et SVG-favicon intet – Google accepterer der kun rasterformater, og billedet skal være kvadratisk med en kantlængde, der er et multiplum af 48 pixels.
Den, der altså kun lægger en SVG ind, får den grå pladsholder i søgeresultatet i stedet for sit eget logo. At angive begge dele ved siden af hinanden er den rigtige vej.
5. Spørg til geometri i animationsbilledet
Et script læste dokumentets samlede højde ved hver scroll-hændelse. Den egenskab kan browseren ikke besvare fra hukommelsen – den skal genberegne hele sidens layout for at gøre det, midt i scrollingen.
Reglen, der følger af det, og som gælder overalt: læs i hændelsen, skriv i billedet derefter. Aldrig omvendt. Siden da måles sidehøjden én gang og huskes i stedet for at blive spurgt om på ny tres gange i sekundet.
Fejlen, der kostede 24 point
For at komme af med den sidste blokerende forespørgsel havde vi delt stylesheetet: den del, der var nødvendig for det synlige område, kom direkte ind i dokumentet, resten blev efterindlæst. En gængs fremgangsmåde.
Snittet lå ved et mærke i kildefilen, som vi havde antaget det synlige område bag. I virkeligheden stod der bag det reglerne for logoet i toppen, for afstandene nedenunder og for indtoningerne. Siden byggede sig altså op uden dem og blev skubbet på plads et sekund senere.
Resultatet: Cumulative Layout Shift på 1,0 – og dermed 76 i stedet for 100 point på computeren. Særligt ubehageligt: lokalt med bremset forbindelse var værdien 0, fordi stylesheetet nåede frem tidligt nok der. Fejlen var kun synlig på en hurtig forbindelse.
Læren: enten hele stylesheetet ind i dokumentet eller slet ingen. En delvis indlejring forudsætter, at man præcis ved, hvilken regel der er brug for i det synlige område – og det ved man aldrig varigt på en side, der vokser.
Hvad der gav lidt
For fuldstændighedens skyld de tiltag, der står i enhver vejledning og hos os næppe var målbare:
Billedformater. Vores forside har næppe billeder – logoet er en SVG-fil. Hvor der forekommer billeder, kan konverteringen naturligvis betale sig; som hovedløftestang duer den kun ved billedtunge sider.
Formindske skrifter yderligere. Vi hoster selv to skriftfamilier og indlæser dem, der er nødvendige i det synlige område, på forhånd. Yderligere optimering ville være mulig, men rykker ikke værdien.
Serverplacering. Ofte anbefalet, i vores tilfælde irrelevant: tiden til den første byte lå allerede på 20 millisekunder. Den, der allerede ligger godt der, vinder intet ved et distributionsnet.
Fremgangsmåden til at gøre efter
- Mål, før der ændres noget som helst. Mobil og desktop hver for sig, notér værdierne.
- Find den største overførte fil. Næsten altid er det JavaScript. Spørgsmålet er ikke, hvordan man formindsker den, men om man har brug for den.
- Kontrollér komprimeringen. Ikke om den er slået til, men for hvilke filtyper.
- Tæl de blokerende forespørgsler. Hver stylesheet-fil i toppen holder den første billedopbygning tilbage.
- Kontrollér for layoutspring uden bremse. Den ene test, der manglede hos os.
- Mål på ny efter hver ændring. Ellers ved man til sidst ikke, hvad der virkede.
Hjælp mig med at oversætte min sides PageSpeed-rapport til en rækkefølge. Vær streng; ros ingenting. Mine måleværdier: - Mobil: [pointtal], desktop: [pointtal] - LCP, TBT, CLS pr. enhed: [værdier] - Største overførte filer med størrelse: [liste] - Render-blokerende forespørgsler: [liste] - Meldinger fra rapporten: [indsæt tekst] Om siden: - Hvordan den er bygget: [CMS / statisk / byggesystem] - Er JavaScript nødvendigt for det synlige indhold? [ja/nej] - Hvordan leveres CSS? [eksternt / på forhånd / delvis på forhånd] Opgaver: 1. Knyt hver melding til en årsag, og sig, hvilket nøgletal den påvirker – LCP, TBT eller CLS. 2. Sortér tiltagene efter virkning pr. indsats. Nævn ved hvert enkelt, hvor mange point det realistisk rykker og hvorfor. 3. Nævn de tiltag fra rapporten, der ved min byggemåde praktisk talt intet giver – og begrund det i stedet for bare at udelade dem. 4. Spørg ved hver stor JavaScript-fil først, om der er brug for den, før du foreslår at formindske den. 5. Gør opmærksom på det, hvis CSS kun leveres delvis på forhånd, og forklar, hvorfor det kan være værre for CLS end slet ikke. 6. Nævn, hvad jeg bør måle på ny efter hver ændring. Opfind ingen måleværdier.
Konklusion
Pointtallet i sig selv er ikke målet – det er en måleværdi, ikke et forretningsresultat. Det, der tæller, er erfaringen bagved: en side, der er læsbar efter 1,4 sekunder, bliver læst af flere mennesker end en, der bruger seks sekunder. Hos mobile besøgende over mobilnet er forskellen større end nogen tekstoptimering.
Vejen dertil gik i vores tilfælde gennem et enkelt tilbagevendende spørgsmål: har vi brug for det? Fem ud af seks indgreb bestod i at fjerne noget, ikke i at tilføje noget.
Ofte stillede spørgsmål
Hvordan opnår man 100 point i PageSpeed Insights?
På de fleste websites gennem tre trin: fjern eller erstat den største JavaScript-fil, slå komprimeringen for CSS og JavaScript faktisk til, og fjern layoutspring. Billedformater og serverplacering er sjældent flaskehalsen.
Hvor vigtig er indlæsningstiden for Googles rangering?
Den er en bekræftet faktor, men ikke en stærk – indhold og relevans vejer tungere. Den større effekt er indirekte: langsomme sider bliver oftere afbrudt, og den adfærd indgår i vurderingen.
Hvad er Cumulative Layout Shift, og hvordan retter man det?
Måleværdien for elementer, der ændrer position efter den første billedopbygning. Hyppigste årsager: billeder uden faste mål, efterindlæste stylesheets og skrifter med stærkt afvigende metrikker. Det rettes ved, at pladsen står fast på forhånd – gennem angivelser af bredde og højde eller et fast sideforhold.
Bør man bygge CSS ind i HTML?
Ved små stylesheets ja, men så fuldstændigt. En delvis indlejring med efterindlæsning af resten sparer en forespørgsel og pådrager sig til gengæld layoutspring, så snart en regel i det synlige område mangler. Hos os var det 7 KB pakket – dertil kan den fuldstændige indlejring betale sig.
Hvor meget giver det at give afkald på biblioteker?
I vores tilfælde den største enkeltpost: 458 KB grafikbibliotek blev til 6 KB egen kode, dertil 114 KB animationsbibliotek til nul. Om det kan betale sig, afhænger af, hvor meget af biblioteket man faktisk bruger – målingen udpeger ubenyttet JavaScript.
Markedsføring, der sætter sig selv op
Betaen for Studio Engine er åben. Sikr dig en plads, og vær med til at forme den fra starten.
Deltag i betaen →