Core Web Vitals (CWV) — saytın “istifadəçi rahatlığı”nı ölçən 3 əsas göstəricidir: səhifə nə qədər tez görünür (LCP), klikə nə qədər tez reaksiya verir (INP) və ekranda elementlər tərpənirmi (CLS). Aşağıda hər şeyi sadə dillə, real nümunələrlə və praktik addımlarla geniş izah etdim.
Nəticə: HTML yüklənsə də səhifə görünmür; LCP gecikir. Necə tanımaq: Lighthouse Waterfall-da .css və .js faylları “blocking” kimi görünür. Həll: Kritiki CSS-i inline, qalan CSS/JS-i defer/async. Nümunə (Shopify):
“theme.liquid”də analitika/heatmap skriptlərini sona köçür.
Slider/animation JS fayllarını yalnız lazım olan səhifələrdə çağır.
<scriptsrc="/app.js"defer></script>
3) Fontların gec yüklənməsi (FOIT/FOUT idarə olunmur)
Nəticə: Başlıq/mətn gec görünür → LCP + hiss olunan yavaşlıq. Necə tanımaq: Performance panelində font faylları gec gəlir; şriftlər bir neçə saniyə sonra dəyişir. Həll:preconnect + font-display: swap; + subset. Nümunə:
Nəticə: İlk cavab 600–1200ms → hər şey gecikir. Necə tanımaq: PSI-də TTFB xəbərdarlığı var; WebPageTest “TTFB” yüksək. Həll: CDN aktiv et (Cloudflare və s.), server caching, HTTP/2/3. Nümunə:
Cloudflare aktiv → TTFB 900ms → 180ms.
B) INP-ni pisləşdirən səhvlər (klik gec cavab verir)
5) Çox plugin/app → ağır JS (əsas thread doludur)
Nəticə: Klik edirsən, 500–1200ms sonra reaksiya. Necə tanımaq: Coverage/Performance-da JS execution çox yüksək; Long Tasks (≥50ms) çoxdur. Həll: Lazımsız pluginləri söndür, code-splitting, lazımlı skriptləri səhifə-baza yüklə. Nümunə (WordPress):
Page builder + slider + popup + chat = 1.2MB JS. Chatı yalnız /contact-da saxla, slideri yalnız ana səhifədə işə sal → INP 480ms → 210ms.
6) Klikdən sonra vizual feedback yoxdur
Nəticə: İstifadəçi “sayt dondu?” deyir, ardıcıl klikləyir. Necə tanımaq: “Səbətə at” və ya “Filter” kliklərində dərhal heç nə dəyişmir. Həll: Dərhal loading/spinner/state dəyişimi göstər. Nümunə:
btn.addEventListener('click', () => {
btn.classList.add('is-loading'); // dərhal siqnal setTimeout(processAddToCart, 0); // ağır işi növbəyə ver
});
7) Ağır 3rd-party skriptlər (chat, heatmap, widgetlər)
Nəticə: Main thread bloklanır; INP şişir. Necə tanımaq: Performance-da 3P domainlərdən JS execution böyükdür. Həll: Gecikdirilmiş yükləmə (on user interaction), async/defer, yalnız lazım olan səhifələrdə. Nümunə:
Heatmap yalnız 10% trafikli A/B sınaq səhifələrində aktiv olsun.
8) Sıx DOM və re-render (layout thrashing)
Nəticə: Filter/sort zamanı UI lag verir. Necə tanımaq: Performance → Layout/Style recalculation pikləri. Həll: Virtual list, minimal reflow, requestIdleCallback, batched updates. Nümunə (Məhsul siyahısı):
1000 kart əvəzinə 24 göstər, scroll olduqca yüklə (infinite scroll).
C) CLS-ni pisləşdirən səhvlər (ekran tərpənir)
9) Şəkil/video ölçüləri verilməyib
Nəticə: Media gec gəldikcə mətn yerdəyişir. Necə tanımaq: PSI → “Images without explicit width/height”. Həll:width/height və ya aspect-ratio. Nümunə:
<imgsrc="/img/post.jpg"width="800"height="450"alt="">
/* və ya */
img.card { aspect-ratio: 16/9; width:100%; height:auto; }
10) Reklam/Embed konteyneri sabit deyil
Nəticə: Reklam yüklənəndə mətn 2–3 sətir aşağı düşür. Necə tanımaq: Oxu zamanı mətn “qaçır”. Həll: Sabit hündürlük/min-height; placeholder. Nümunə:
.ad-slot { min-height: 280px; display:block; }
11) Dinamik banner/popup məzmunu “itələyir”
Nəticə: Cookie bar, promo banner məzmunu aşağı itələyir. Necə tanımaq: Saytı açanda başlıq/mətn sıradan çıxır. Həll: Overlay kimi ver (üst-üstə), ya da yuxarıda əvvəlcədən boşluq rezerv et. Nümunə:
Mobile cookie bar: ekranın aşağısında position: fixed; ilə overlay — məzmun sabit qalır.
12) Font dəyişəndə mətn sıçrayır (FOIT/FOUT idarə olunmur)
Nəticə: Başlıqların ölçüsü sonradan dəyişir, sətirlər tərpənir. Necə tanımaq: İlk saniyələrdə fontlar “atılıb-düşür”. Həll:font-display: swap; + ölçüsü oxşar fallback font seç. Nümunə:
Inter fallback: system-ui, -apple-system, Segoe UI, Roboto.
D) Ümumi, amma çox görülən səhvlər
13) Hero şəkil “lazy” işarələnib
Nəticə: LCP kəskin pisləşir (kritik media gecikdirilir). Necə tanımaq: PSI “Defer offscreen images” xəbərdarlığı olsa da hero “lazy” olmamalıdır. Həll: Yalnız ekrandan aşağı media loading="lazy" olsun; hero normal yüklə.
14) Kritiki kontent 3rd-party-dən gəlir
Nəticə: Xarici server geciksə, əsas blok gecikər. Necə tanımaq: Waterfall-da kritik fayl xarici domen. Həll: Kritiki CSS/JS öz domenindən ver, yaxud preconnect + preload. Nümunə:
İkon fontu əvəzinə SVG sprite-ları layihəyə daxil et.
15) Mobil vizual ağırdır (desktop dizaynını mobilə “sıxmaq”)
Nəticə: Mobil LCP/INP pis; CLS artır. Necə tanımaq: Mobil PSI çox zəif, labda CPU throttling zamanı düşür. Həll: Mobil üçün daha kiçik şəkillər, az animasiya, az script; max 1 slider, 1 font-weight. Nümunə:
Mobil hero: 900px genişlik, 120–180KB.
16) “Yüklənir” animasiyası belə ağırdır
Nəticə: Loading göstərmək əvəzinə GPU/CPU yükləyir. Necə tanımaq: Performance-da animation/composition pikləri. Həll: Sadə CSS spinner; JS ilə hər frame-də ölçü-hesab yox. Nümunə:
.loader{width:20px;height:20px;border:3px solid #ccc;border-top:3px solid #000;border-radius:50%;animation:spin 1s linear infinite} @keyframes spin{to{transform:rotate(360deg)}}
17) Bir səhifədə çox “widget” (chat, puan, paylaş, yorum)
Nəticə: LCP+INP+CLS hamısı zərbə alır. Necə tanımaq: HTML-də çox script tag; Performance-da uzun tapşırıqlar. Həll: Prioritetləşdir: satışa təsiri olmayanları çıxar; qalanları “on interaction” yüklə. Nümunə:
Chat yalnız “contact” və ya 30s saytda qalan istifadəçidən sonra açılsın.
18) Serverdə cache yoxdur / HTML hər dəfə dinamik yığılır