Mult timp, am presupus că scorurile mari la Lighthouse erau în principal rezultatul optimizării. Comprimarea imaginilor, amânarea script-urilor, corectarea schimbărilor de layout, ajustarea temelor, schimbarea plugin-urilor și repetarea ciclului de fiecare dată când apărea un nou avertisment.
Cu timpul, această presupunere nu s-a mai potrivit cu ceea ce vedeam în practică.
Site-urile care obțineau constant scoruri bune nu erau cele cu cel mai mare efort de optimizare. Erau cele în care browser-ul avea pur și simplu mai puțină muncă de făcut.
În acel moment, Lighthouse a încetat să se mai simtă ca un instrument de optimizare și a început să se simtă ca un semnal de diagnostic pentru alegerile arhitecturale.
Lighthouse nu evaluează framework-uri sau instrumente. Evaluează rezultate.
Cât de repede apare conținut semnificativ.
Cât JavaScript blochează firul principal de execuție.
Cât de stabil rămâne layout-ul în timpul încărcării.
Cât de accesibilă și indexabilă este structura documentului.
Aceste rezultate sunt efecte secundare ale deciziilor luate mult mai devreme în stack. În special, ele reflectă cât de multă computație este amânată la browser în timpul execuției.
Când o pagină depinde de un pachet mare pe partea de client pentru a deveni utilizabilă, scorurile slabe nu sunt surprinzătoare. Când o pagină este în mare parte HTML static cu logică limitată pe partea de client, performanța devine mult mai previzibilă.
Pe parcursul auditurilor pe care le-am efectuat și al proiectelor la care am lucrat, execuția JavaScript este cea mai comună sursă de regresii în Lighthouse.
Acest lucru nu se datorează faptului că codul este de calitate scăzută. Se datorează faptului că JavaScript concurează pentru un mediu de execuție cu un singur fir în timpul încărcării paginii.
Runtime-urile de framework, logica de hidrare, grafurile de dependențe și inițializarea stării consumă toate timp înainte ca pagina să devină interactivă. Chiar și funcționalități interactive mici necesită adesea pachete disproporționat de mari.
Arhitecturile care presupun JavaScript în mod implicit necesită efort continuu pentru a menține performanța sub control. Arhitecturile care tratează JavaScript ca o opțiune explicită tind să producă rezultate mai stabile.
Output-ul pre-randat elimină mai multe variabile din ecuația performanței.
Nu există cost de randare pe server în momentul cererii.
Nu este necesar bootstrap pe partea de client pentru ca conținutul să apară.
Browser-ul primește HTML complet și previzibil.
Din perspectiva Lighthouse, acest lucru îmbunătățește valori precum TTFB, LCP și CLS fără a necesita muncă de optimizare țintită. Generarea statică nu garantează scoruri perfecte, dar restrânge semnificativ gama modurilor de eșec.
Înainte de a-mi reconstrui blogul personal, am explorat mai multe abordări comune, inclusiv configurații bazate pe React care se bazează pe hidrare în mod implicit. Erau flexibile și capabile, dar performanța necesita atenție continuă. Fiecare funcționalitate nouă introducea întrebări despre modul de randare, preluarea datelor și dimensiunea pachetului.
Din curiozitate, am încercat o abordare diferită care presupunea HTML static mai întâi și trata JavaScript ca o excepție. Am ales Astro pentru acest experiment, deoarece constrângerile sale implicite se aliniază cu întrebările pe care doream să le testez.
Ceea ce a ieșit în evidență nu a fost un scor inițial dramatic, ci cât de puțin efort a fost necesar pentru a menține performanța în timp. Publicarea de conținut nou nu a introdus regresii. Elemente interactive mici nu au creat avertismente neașteptate. Linia de bază era pur și simplu mai greu de erodat.
Am documentat procesul de construcție și compromisurile arhitecturale într-o notă tehnică separată în timp ce lucram la acest experiment pe un blog personal cu scor perfect la Lighthouse.
Această abordare nu este universal mai bună.
Arhitecturile static-first nu sunt ideale pentru aplicații foarte dinamice, cu stare. Ele pot complica scenarii care se bazează în mare măsură pe date autentificate ale utilizatorilor, actualizări în timp real sau gestionarea complexă a stării pe partea de client.
Framework-urile care presupun randare pe partea de client oferă mai multă flexibilitate în acele cazuri, cu prețul unei complexități mai mari în runtime. Ideea nu este că o abordare este superioară, ci că compromisurile se reflectă direct în valorile Lighthouse.
Ceea ce Lighthouse evidențiază nu este efortul, ci entropia.
Sistemele care se bazează pe computație în runtime acumulează complexitate pe măsură ce sunt adăugate funcționalități. Sistemele care fac mai multă muncă în timpul construcției constrâng implicit acea complexitate.
Această diferență explică de ce unele site-uri necesită muncă constantă de performanță, în timp ce altele rămân stabile cu intervenție minimă.
Scorurile mari la Lighthouse sunt rareori rezultatul unor pase agresive de optimizare. Ele apar de obicei în mod natural din arhitecturi care minimizează ceea ce trebuie să facă browser-ul la prima încărcare.
Instrumentele vin și pleacă, dar principiul de bază rămâne același. Când performanța este o constrângere implicită și nu un obiectiv, Lighthouse încetează să fie ceva pe care îl urmărești și devine ceva pe care îl observi.
Această schimbare nu ține atât de mult de alegerea framework-ului potrivit, ci mai degrabă de alegerea locului unde complexitatea este permisă să existe.


