Artikel

Startup performance — Hurtig app-start og time to interactive

Startup performance er kritisk: de første sekunder afgør brugerens første indtryk og påvirker bounce rate. JavaScript-parsing og tung initialisering er de hyppigste årsager til langsom start.

Startup performance dækker alt der sker fra brugeren klikker på et link til siden er fuldt interaktiv — First Contentful Paint, Largest Contentful Paint og Time to Interactive er de centrale milepæle. Det er den performance-periode der har størst indflydelse på bounce rate og første brugerindtryk, og den hyppigste årsag til dårlig startup er tung JavaScript der skal downloades, parses og eksekveres inden siden reagerer. Code splitting, udskudte tredjepartsscripts og korrekt prioritering af kritiske ressourcer er de primære tekniske indsatser der forbedrer startup performance konkret og målbart.

Hvad måles i startup

First Contentful Paint (FCP) — hvornår browseren maler det første synlige indhold. Brugeren ser at noget sker.

Largest Contentful Paint (LCP) — hvornår sidens primære indhold er synligt. Brugeren ser siden “klar”.

Time to Interactive (TTI) — hvornår siden er fuldt interaktiv. Ingen long tasks, alle handlers registreret.

Total Blocking Time (TBT) — samlet tid main thread er blokeret (long tasks over 50ms) mellem FCP og TTI. Høj TBT betyder brugeren ser en tilsyneladende klar side der ikke reagerer.

JavaScript er den primære synder

JavaScript har en unik performance-omkostning: browser skal downloade, parse, kompilere og eksekvere det — alt på main thread. Et 500 KB JavaScript-bundle kan tage 2-5 sekunder at processere på en middel Android-telefon.

Strategier:

Code splitting — del JavaScript op i chunks der kun loades når de bruges. I React/Next.js: React.lazy() og dynamiske imports. Brugere på forsiden downloader ikke kode til checkout-flowet.

Tree shaking — fjern ubrugt kode fra bundlet. Moderne bundlers (Webpack, Rollup, Vite) gør dette automatisk hvis ESM-imports bruges korrekt.

Defer og async — scripts med defer downloades parallelt men eksekveres efter DOM er bygget. Scripts med async eksekveres straks de er downloadet. Begge blokerer ikke HTML-parsing.

<!-- Blokerer rendering — undgå i <head> -->
<script src="analytics.js"></script>

<!-- Eksekveres efter DOM er klar -->
<script src="app.js" defer></script>

Tredjeparts-scripts

Analytics, chat-widgets, A/B test-scripts og annoncer loades typisk fra tredjeparter og har ingen performance-garantier. De er en hyppig årsag til dårlig startup performance fordi:

  • De indlæses synkront og blokerer rendering
  • De initialiserer tidligt og belaster main thread
  • De henter yderligere ressourcer (billeder, fonts, scripts)

Strategi: Udskyd tredjeparts-scripts til efter load-event — eller brug facade patterns der først initialiserer et script ved brugerinteraktion (klik på chat-widget aktiverer chat-scriptet).

Optimér hvad browseren ser først

Above-the-fold prioritering: Kritisk CSS inlines i <head> så over-fold indhold renderes straks uden at vente på CSS-filen. Alt under fold kan loades asynkront.

LCP-billede med fetchpriority: Fortæl browseren at LCP-billedet er kritisk:

<img src="hero.webp" fetchpriority="high" alt="Hero" width="1200" height="600">

Font-optimering: Web fonts der loades sent skubber tekst (FOUT — Flash of Unstyled Text). font-display: swap viser fallback-font mens web fonten hentes, og skifter når den er klar.

Mål med Lighthouse

Lighthouse i Chrome DevTools rapporterer FCP, LCP, TBT og TTI under Performance-auditen. Opportunities og Diagnostics sektionerne giver specifikke forbedringsforslag rangeret efter estimeret gevinst. → Denne artikel er en del af Web Performance — Core Web Vitals og teknisk hastighed.

Andre artikler i samme emne

Ofte stillede spørgsmål

Hvad er Time to Interactive (TTI)?
Time to Interactive er det tidspunkt hvor siden er visuelt klar OG responderer hurtigt på brugerinteraktion — ingen long tasks kører, og siden har registreret nødvendige event handlers. TTI er ikke en Core Web Vitals-metric men bruges stadig som diagnostisk metric. INP har delvist erstattet TTI som mål for interaktionsresponsivitet.
Hvad er de primære årsager til dårlig startup performance?
For meget JavaScript — download, parsing, kompilering og eksekvering blokerer main thread. Render-blocking ressourcer der forsinker første visning. Tunge tredjepartsscripts (analytics, chat, ads) der initialiseres ved load. Synkrone API-kald der blokerer rendering. Og mangel på code splitting der sender al JavaScript til alle sider.
Hvad er Total Blocking Time (TBT) og hvorfor er det en SEO-metric?
Total Blocking Time er den samlede tid main thread er blokeret med long tasks (opgaver over 50ms) i perioden mellem First Contentful Paint og Time to Interactive. Høj TBT resulterer i en side der ser færdig ud men ikke reagerer på klik — en frustrerende brugeroplevelse. TBT er en stærk korrelat til INP (Interaction to Next Paint), der er en Core Web Vitals-rankingfaktor. Reducer TBT ved at splitte lange tasks og udskyde tredjepartsscripts.
Hvad er code splitting og hvornår er det nødvendigt?
Code splitting er teknikken der deler JavaScript-bundlen i mindre chunks der kun loades når de er nødvendige — fx ved navigation til en specifik side eller ved en bestemt brugerinteraktion. I React og Next.js bruges React.lazy() og dynamiske imports. Det er nødvendigt når JavaScript-bundlen overstiger ca. 150 KB parsed — over det punkt stiger Time to Interactive markant på mobile enheder. Vite, Webpack og Rollup understøtter code splitting automatisk.
Hvornår bør man bruge façade patterns for tredjepartsscripts?
Façade patterns er relevante for tunge tredjepartsscripts der ikke er nødvendige ved sideload: chat-widgets, video-embeds (YouTube/Vimeo) og sociale medie-embeds. En façade viser en placeholder-version (fx et thumbnail af en video) og indlæser det rigtige script først ved brugerinteraktion (klik). Det reducerer JavaScript-payload ved startup markant. YouTube-facader kan reducere sideindlæsningstiden med 1-3 sekunder på mobile enheder med middelgod forbindelse.

Placering i ordbogen

Startup performance — Hurtig app-start og time to interactive