Lange tijd ging ik ervan uit dat hoge Lighthouse-scores voornamelijk het resultaat waren van tuning. Afbeeldingen comprimeren, scripts uitstellen, layoutverschuivingen oplossen, thema's aanpassen, plugins verwisselen en de cyclus herhalen telkens wanneer een nieuwe waarschuwing verscheen.
Na verloop van tijd kwam deze aanname niet meer overeen met wat ik in de praktijk zag.
De sites die consequent goed scoorden waren niet degenen met de meeste optimalisatie-inspanning. Het waren degenen waar de browser simpelweg minder werk te doen had.
Op dat moment voelde Lighthouse niet meer aan als een optimalisatietool maar als een diagnostisch signaal voor architectonische keuzes.
Lighthouse evalueert geen frameworks of tools. Het evalueert resultaten.
Hoe snel zinvolle inhoud verschijnt.
Hoeveel JavaScript de hoofdthread blokkeert.
Hoe stabiel de layout blijft tijdens het laden.
Hoe toegankelijk en crawlbaar de documentstructuur is.
Deze resultaten zijn downstream-effecten van beslissingen die veel eerder in de stack zijn genomen. In het bijzonder weerspiegelen ze hoeveel berekening naar de browser wordt uitgesteld tijdens runtime.
Wanneer een pagina afhankelijk is van een grote client-side bundle om bruikbaar te worden, zijn slechte scores niet verrassend. Wanneer een pagina voornamelijk statische HTML is met beperkte client-side logica, wordt prestatie veel voorspelbaarder.
Bij audits die ik heb uitgevoerd en projecten waaraan ik heb gewerkt, is JavaScript-uitvoering de meest voorkomende bron van Lighthouse-regressies.
Dit komt niet doordat de code van lage kwaliteit is. Het komt doordat JavaScript concurreert om een single-threaded uitvoeringsomgeving tijdens het laden van de pagina.
Framework-runtimes, hydratielogica, afhankelijkheidsgrafieken en state-initialisatie verbruiken allemaal tijd voordat de pagina interactief wordt. Zelfs kleine interactieve functies vereisen vaak onevenredig grote bundles.
Architecturen die standaard JavaScript veronderstellen, vereisen voortdurende inspanning om prestaties onder controle te houden. Architecturen die JavaScript behandelen als een expliciete opt-in hebben de neiging stabielere resultaten te produceren.
Vooraf gerenderde output verwijdert verschillende variabelen uit de prestatievergelijking.
Er zijn geen server-side renderingkosten op het moment van de aanvraag.
Er is geen client-side bootstrap nodig om inhoud te laten verschijnen.
De browser ontvangt voorspelbare, volledige HTML.
Vanuit het perspectief van Lighthouse verbetert dit statistieken zoals TTFB, LCP en CLS zonder gericht optimalisatiewerk te vereisen. Statische generatie garandeert geen perfecte scores, maar verkleint aanzienlijk het bereik van faalwijzen.
Voordat ik mijn persoonlijke blog herbouwde, verkende ik verschillende veelvoorkomende benaderingen, waaronder React-gebaseerde setups die standaard vertrouwen op hydratie. Ze waren flexibel en capabel, maar prestaties vereisten continue aandacht. Elke nieuwe functie bracht vragen op over renderingmodus, data-fetching en bundlegrootte.
Uit nieuwsgierigheid probeerde ik een andere benadering die eerst statische HTML veronderstelde en JavaScript als een uitzondering behandelde. Ik koos Astro voor dit experiment, omdat de standaardbeperkingen overeenkwamen met de vragen die ik wilde testen.
Wat opviel was niet een dramatische initiële score, maar hoeveel moeite er nodig was om prestaties in de loop van de tijd te behouden. Het publiceren van nieuwe inhoud introduceerde geen regressies. Kleine interactieve elementen escaleerden niet in ongerelateerde waarschuwingen. De basislijn was simpelweg moeilijker te eroderen.
Ik documenteerde het bouwproces en architectonische afwegingen in een aparte technische notitie terwijl ik aan dit experiment werkte op een persoonlijke blog met perfecte Lighthouse-score.
Deze benadering is niet universeel beter.
Static-first architecturen zijn niet ideaal voor zeer dynamische, stateful applicaties. Ze kunnen scenario's compliceren die sterk vertrouwen op geauthenticeerde gebruikersdata, realtime updates of complexe client-side state management.
Frameworks die client-side rendering veronderstellen bieden meer flexibiliteit in die gevallen, ten koste van hogere runtime-complexiteit. Het punt is niet dat de ene benadering superieur is, maar dat de afwegingen direct worden weerspiegeld in Lighthouse-statistieken.
Wat Lighthouse aan de oppervlakte brengt is niet inspanning, maar entropie.
Systemen die vertrouwen op runtime-berekening accumuleren complexiteit naarmate functies worden toegevoegd. Systemen die meer werk doen tijdens build-time beperken die complexiteit standaard.
Dat verschil verklaart waarom sommige sites constant prestatiewerk vereisen terwijl anderen stabiel blijven met minimale interventie.
Hoge Lighthouse-scores zijn zelden het resultaat van agressieve optimalisatiepasses. Ze ontstaan meestal natuurlijk uit architecturen die minimaliseren wat de browser moet doen bij de eerste load.
Tools komen en gaan, maar het onderliggende principe blijft hetzelfde. Wanneer prestatie een standaardbeperking is in plaats van een doel, stopt Lighthouse iets te zijn dat je najaagt en wordt het iets dat je observeert.
Die verschuiving gaat minder over het kiezen van het juiste framework en meer over het kiezen waar complexiteit mag bestaan.


