100 poeng på PageSpeed: Hva vi endret for å komme dit

Lastetid er en rangeringsfaktor, men de vanlige rådene hjelper sjelden. Dette innlegget beskriver hva vi faktisk endret på vår egen side, hvilket tiltak som ga hvor mye, og hvor vi svingte av i feil retning.

En lysende form akselererer mot høyre, bak den løser mørke blokker seg opp

Det viktigste kort

  • Den største enkeltgevinsten kom ikke av å forminske filer, men av å erstatte et bibliotek på 458 KB med 6 KB egen kode.
  • Den nest største årsaken var en halvveis konfigurert komprimering: serveren komprimerte bare HTML, ikke CSS og JavaScript.
  • Et layouthopp med verdien 1 kostet 24 poeng – forårsaket av etterlastet CSS som først grep inn etter den første bildeoppbyggingen.
  • Det som ga minst: bildeformater. Det som ga mest: å utelate ting.

Utgangsverdien var 58 av 100 på mobil. Det er ingen dårlig verdi for et nettsted med 3D-effekt i toppområdet, men en verdi Google straffer merkbart i mobilsøket. Til slutt sto det 100 poeng på datamaskin og 98 på mobil, med likeledes 100 for universell utforming.

Det som følger, er ingen allmenn sjekkliste, men det faktiske forløpet – inkludert stedene der vi tok feil.

En lysende form akselererer mot høyre, bak den løser mørke blokker seg opp
En side blir ikke rask av å optimaliseres, men av at noe utelates.

Utgangspunktet

Måleverdi (mobil)føretter
Ytelse5898
Universell utforming95100
Første bildeoppbygging6,1 s1,4 s
Største element synlig11,1 s2,1 s
Overført totalt298 KB184 KB
derav JavaScript121 KB5 KB

De fem inngrepene som virkelig telte

1. Erstatt biblioteket, ikke optimaliser det

Toppområdet viser en partikkelsky i 3D. Til det kjørte et kjent grafikkbibliotek – 458 KB etter forminskingen. Målingen viste at 51 KB av det aldri i det hele tatt ble kjørt.

Det avgjørende blikket var spørsmålet om hvor mye vi faktisk trenger. Det var elleve byggeklosser: renderer, scene, kamera, geometri, materiale og noen hjelpeklasser. Alt sammen lar seg programmere direkte mot nettleserens grafikkgrensesnitt.

Resultat: 458 KB ble til 6 KB. Framstillingen er identisk – vi overtok de samme shaderne.

Merk To detaljer må man gjenskape i den forbindelsen, ellers ser resultatet feil ut: biblioteket regner om farger fra heksformatet til lineært lys, og det blander additivt med formultiplisert alfa. Uten begge deler virket partikkelskyen vår tydelig grellere enn før.

2. Komprimeringen var bare halvveis slått på

I serverkonfigurasjonen sto komprimeringen på «på» – men linjen om hvilke filtyper som skulle komprimeres, var kommentert ut. Det er standardinnstillingen i mange distribusjoner. Resultat: det ble utelukkende komprimert HTML.

Grafikkbiblioteket gikk altså ukomprimert over ledningen. Etter påslaget: 1243 KB ble til 251 KB. I tillegg legger vi nå de komprimerte versjonene ferdig beregnet ved siden av, slik at serveren ikke regner på nytt ved hvert kall.

Innsats: to linjer konfigurasjon. Virkning: knapt en megabyte per førstegangskall.

3. Fjern animasjonsbiblioteket helt

Til innblendinger ved rulling kjørte enda et bibliotek, 114 KB. Målingen pekte det i tillegg ut som årsak til framtvungne layoutomberegninger – det spurte etter geometri under rullingen og tvang nettleseren til å regne ut layoutet på nytt midt i bevegelsen.

Erstattet med en IntersectionObserver som utelukkende setter en klasse. Selve bevegelsen gjør CSS. 114 KB mindre, ingen omberegninger lenger, rundt 40 linjer egen kode.

4. Faviconet var 205 KB stort

En bagatell med forbausende virkning, fordi den lastes svært tidlig. Erstattet med en SVG-fil på 6 KB, laget ut fra den eksisterende logoen.

Visste du at …?

Til visningen i Googles søkeresultater nytter et SVG-favicon ingenting – Google godtar der bare rasterformater, og bildet må være kvadratisk med en kantlengde som er et multiplum av 48 piksler.

Den som altså bare legger inn en SVG, får den grå plassholderen i søkeresultatet i stedet for sin egen logo. Å oppgi begge deler ved siden av hverandre er den riktige veien.

5. Spør etter geometri i animasjonsbildet

Et skript leste ut dokumentets samlede høyde ved hver rullehendelse. Denne egenskapen kan nettleseren ikke besvare fra hukommelsen – den må regne gjennom layoutet for hele siden på nytt, midt i rullingen.

Regelen som følger av det, og som gjelder overalt: les i hendelsen, skriv i bildet etterpå. Aldri omvendt. Siden har sidehøyden blitt målt én gang og husket, i stedet for etterspurt seksti ganger i sekundet.

Feilen som kostet 24 poeng

Til venstre en tett stabel grå blokker, mot høyre står bare noen få lysende igjen
Det som blir igjen, avgjør lastetiden – ikke hvor godt resten er komprimert.
Fra praksis

For å bli kvitt den siste blokkerende forespørselen hadde vi delt stilarket: den delen som trengs for det synlige området, kom rett inn i dokumentet, resten ble etterlastet. En vanlig framgangsmåte.

Snittet lå ved et merke i kildefilen som vi hadde antatt at det synlige området lå foran. I virkeligheten sto reglene for logoen i toppområdet, for avstandene under den og for innblendingene bak det merket. Siden bygde seg altså opp uten dem og ble skjøvet på plass ett sekund senere.

Resultatet: Cumulative Layout Shift på 1,0 – og dermed 76 i stedet for 100 poeng på datamaskin. Særlig ubehagelig: lokalt med bremset linje var verdien 0, fordi stilarket kom fram tidsnok der. Feilen var bare synlig på rask forbindelse.

Lærdommen: enten hele stilarket inn i dokumentet, eller ingen del av det. En delvis innbygging forutsetter at man vet nøyaktig hvilken regel som trengs i det synlige området – og det vet man aldri varig på en side som vokser.

Tips Ved mistanke om layouthopp: mål uten brems. Et kontrollverktøy med simulert mobilforbindelse leverer filen tidsnok og viser ikke hoppet. Den som bare måler slik, tror problemet er løst.

Hva som ga lite

For fullstendighetens skyld tiltakene som står i enhver veiledning og hos oss knapt var målbare:

Bildeformater. Forsiden vår har knapt bilder – logoen er en SVG-fil. Der bilder forekommer, lønner omgjøringen seg selvsagt; som hovedspak duger den bare på bildetunge sider.

Forminske skriftene ytterligere. Vi drifter to skriftfamilier selv og forhåndslaster dem som trengs i det synlige området. Ytterligere optimalisering ville vært mulig, men beveger ikke verdien.

Serverplassering. Ofte anbefalt, i vårt tilfelle irrelevant: tiden til første byte lå allerede på 20 millisekunder. Den som allerede ligger godt an der, vinner ingenting på et distribusjonsnett.

Framgangsmåten til å gjenta selv

  1. Mål før noe som helst endres. Mobil og skrivebord hver for seg, noter verdiene.
  2. Let opp den største overførte filen. Nesten alltid er det JavaScript. Spørsmålet er ikke hvordan man forminsker den, men om man trenger den.
  3. Kontroller komprimeringen. Ikke om den er slått på, men for hvilke filtyper.
  4. Tell blokkerende forespørsler. Hver stilarkfil i toppområdet holder tilbake den første bildeoppbyggingen.
  5. Kontroller layouthopp uten brems. Den ene testen som manglet hos oss.
  6. Mål på nytt etter hver endring. Ellers vet man til slutt ikke hva som virket.
Prompt
Hjelp meg å oversette PageSpeed-rapporten for siden min til
en rekkefølge. Vær streng; ikke ros noe.

Måleverdiene mine:
- Mobil: [poengsum], skrivebord: [poengsum]
- LCP, TBT, CLS per enhet: [verdier]
- Største overførte filer med størrelse: [liste]
- Render-blokkerende forespørsler: [liste]
- Meldinger fra rapporten: [lim inn tekst]

Om siden:
- Hvordan den er bygd: [CMS / statisk / byggekasse]
- Trengs JavaScript for det synlige innholdet? [ja/nei]
- Hvordan leveres CSS? [eksternt / på forhånd / delvis på forhånd]

Oppgaver:
1. Knytt hver melding til en årsak og si hvilket nøkkeltall
   den påvirker – LCP, TBT eller CLS.
2. Sorter tiltakene etter virkning per innsats. Oppgi for
   hvert av dem hvor mange poeng det realistisk beveger og hvorfor.
3. Nevn tiltakene fra rapporten som praktisk talt ikke gir noe
   ved min byggemåte – og begrunn det, i stedet for bare å
   utelate dem.
4. Spør ved hver stor JavaScript-fil først om den trengs,
   før du foreslår å forminske den.
5. Påpek det hvis CSS bare leveres delvis på forhånd,
   og forklar hvorfor det kan være dårligere for CLS
   enn ikke i det hele tatt.
6. Nevn hva jeg bør måle på nytt etter hver endring.

Ikke finn på måleverdier.

Konklusjon

Selve poengsummen er ikke målet – den er en måleverdi, ikke et forretningsresultat. Det som teller, er erfaringen bak: en side som er lesbar etter 1,4 sekunder, blir lest av flere mennesker enn en som bruker seks sekunder. Hos mobile besøkende over mobilnett er forskjellen større enn enhver tekstoptimalisering.

Veien dit gikk i vårt tilfelle gjennom ett eneste tilbakevendende spørsmål: trenger vi dette? Fem av seks inngrep besto i å fjerne noe, ikke i å legge til noe.

Vanlige spørsmål

Hvordan oppnår man 100 poeng i PageSpeed Insights?

Hos de fleste nettsteder gjennom tre trinn: fjern eller erstatt den største JavaScript-filen, slå komprimeringen for CSS og JavaScript faktisk på, og fjern layouthopp. Bildeformater og serverplassering er sjelden flaskehalsen.

Hvor viktig er lastetid for Google-rangeringen?

Den er en bekreftet faktor, men ingen sterk – innhold og relevans veier tyngre. Den større effekten er indirekte: langsomme sider blir oftere avbrutt, og den atferden inngår i vurderingen.

Hva er Cumulative Layout Shift, og hvordan retter man det?

Måleverdien for elementer som endrer posisjon etter den første bildeoppbyggingen. Vanligste årsaker: bilder uten faste mål, etterlastede stilark og skrifter med sterkt avvikende metrikk. Det rettes ved at plassen ligger fast på forhånd – via bredde- og høydeangivelser eller et fast sideforhold.

Bør man bygge CSS inn i HTML-en?

Ved små stilark ja, men da fullstendig. En delvis innbygging med etterlasting av resten sparer én forespørsel og pådrar seg til gjengjeld layouthopp så snart en regel i det synlige området mangler. Hos oss var det 7 KB pakket – for det lønner den fullstendige innbyggingen seg.

Hvor mye gir det å droppe biblioteker?

I vårt tilfelle den største enkeltposten: 458 KB grafikkbibliotek ble til 6 KB egen kode, i tillegg 114 KB animasjonsbibliotek til null. Om det lønner seg, avhenger av hvor mye av biblioteket man faktisk bruker – målingen viser ubrukt JavaScript.

Markedsføring som setter seg opp selv

Betaen for Studio Engine er åpen. Sikre deg en plass og bidra fra starten.

Bli med i betaen →
← Tilbake til oversikten