Jamil Sultanli.
← Ana Səhifəyə Qayıt

JavaScript SEO və DOM Optimizasiyası: SPA-larda Hydration Xətaları və Googlebot Render Problemlərinin Həlli

·12 dəqiqə

Müasir veb inkişafı (web development) React, Vue, Angular və Svelte kimi güclü JavaScript kitabxanaları və çərçivələri (frameworks) tərəfindən idarə olunur. Bu texnologiyalar istifadəçilərə zəngin, dinamik və tətbiqə bənzər (app-like) təcrübələr təqdim etsə də, axtarış motorlarının optimizasiyası (SEO) üçün ciddi çətinliklər yaradır.

Ənənəvi axtarış motoru botları sadə HTML sənədlərini asanlıqla oxuyub indekslədiyi halda, müasir Single Page Application (SPA) arxitekturalarında məzmunun brauzer tərəfindən dinamik şəkildə yaradılması (Client-Side Rendering - CSR) prosesi mürəkkəb render mərhələləri tələb edir. Bu məqalədə JavaScript SEO-nun ən kritik və az danışılan mövzularından olan DOM (Document Object Model) Optimizasiyası, Hydration XətalarıGooglebot-un Render Problemlərinin texniki həlli yollarını dərindən təhlil edəcəyik.


BUNLARI DA OXUYUN

Sıfırdan Sayt Trafikini Artırmaq: SEO-ya Uyğun Məzmun Strategiyası Bələdçisi

Saytınızın trafikini sıfırdan artırmaq üçün SEO-ya uyğun məzmun strategiyası bələdçisi. Açar söz araşdırması, məzmun planı və praktiki tətbiq addımları.

Oxumağa davam et

Googlebot-un İki Mərhələli İndeksləmə Prosesi

Googlebot-un veb səhifələri necə indekslədiyini anlamaq, JavaScript SEO-nun təməl daşıdır. Google digər axtarış motorlarından fərqli olaraq JavaScript-i icra etmək qabiliyyətinə malik olsa da, bu proses dərhal baş vermir. Googlebot iki mərhələli indeksləmə (Two-Pass Indexing) sistemindən istifadə edir.

[Mərhələ 1: Crawling] -> HTML Yüklənir -> İlkin İndeksləmə (JS icra olunmur)
                                |
                                v
                        [Render Növbəsi (Render Queue)]
                                |
                                v
[Mərhələ 2: Rendering] -> WRS (Web Rendering Service) -> JS İcra Olunur -> Tam İndeksləmə

Crawling vs. Rendering: WRS (Web Rendering Service) necə işləyir?

  1. Birinci Mərhələ (İlkin İndeksləmə): Googlebot səhifəni tapır, HTTP sorğusu göndərir və serverdən gələn ilkin HTML sənədini yükləyir. Əgər səhifəniz tamamilə Client-Side Rendering (CSR) ilə qurulubsa, bu HTML sənədi demək olar ki, boş olur (məsələn, React-də sadəcə <div id="root"></div> görünür). Googlebot bu mərhələdə tapdığı linkləri növbəyə əlavə edir və ilkin mətni indeksləyir.
  2. Render Növbəsi (Render Queue): JavaScript resurslarının yüklənməsi və icrası böyük hesablama gücü (CPU) tələb etdiyi üçün Google səhifəni render etməyi sonraya saxlayır. Səhifə Render Növbəsinə (Render Queue) daxil olur.
  3. İkinci Mərhələ (Render və Tam İndeksləmə): Google-un Web Rendering Service (WRS) adlı infrastrukturu boş vaxt tapan kimi (bu bir neçə saatdan bir neçə günə qədər çəkə bilər) səhifəni Chrome brauzerinin ən son versiyası (Evergreen Googlebot) ilə render edir. JavaScript icra olunur, DOM tam formalaşır və yalnız bundan sonra real məzmun indekslənir.

CPU və Zaman Büdcəsi: Googlebot niyə hər şeyi render edə bilmir?

Google hər gün milyardlarla səhifəni tarayır. JavaScript-in icrası üçün tələb olunan server resursları olduqca bahalıdır. Buna görə də Googlebot hər bir səhifə üçün müəyyən bir Render Büdcəsi (Rendering Budget)Zaman Limiti (Timeout) təyin edir.

Əgər səhifənizin JavaScript faylları çox ağırdırsa, icra müddəti 5-8 saniyədən çox çəkirsə və ya API sorğuları gec cavab verirsə, Googlebot render prosesini yarıda kəsə bilər. Nəticədə, səhifənizin əsas məzmunu heç vaxt indekslənməyəcək və siz ciddi trafik itkisi ilə üzləşəcəksiniz.


Hydration Nədir və SEO-ya Necə Təsir Edir?

Server-Side Rendering (SSR) və ya Static Site Generation (SSG) istifadə edərkən, server istifadəçiyə və axtarış motoruna hazır HTML göndərir. Lakin bu HTML hələ "cansızdır" - yəni interaktiv deyil (düymələr işləmir, hadisə dinləyiciləri - event listeners hələ qoşulmayıb).

Hydration (Canlandırma), brauzerə yüklənən JavaScript-in serverdən gələn statik HTML üzərinə qoşularaq onu interaktiv, dinamik bir tətbiqə çevirməsi prosesidir.

Hydration Mismatch (Uyğunsuzluq) Xətaları və Onların Səbəbləri

Hydration prosesinin uğurlu olması üçün serverdə yaradılan DOM ağacı ilə brauzerdə JavaScript tərəfindən ilk render zamanı yaradılan DOM ağacı tamamilə eyni olmalıdır. Əgər bu iki struktur arasında fərq olarsa, Hydration Mismatch (Hydration Uyğunsuzluğu) xətası baş verir.

Bu xətanın ən çox rast gəlinən səbəbləri bunlardır:

  • Yanlış HTML strukturu: Məsələn, <p> teqi daxilində <div> teqinin yerləşdirilməsi. Brauzer avtomatik olaraq bu xətanı düzəltməyə çalışır və DOM strukturunu dəyişir, lakin serverdə bu struktur fərqli qalır.
  • Sistem vaxtı və tarixlər: Serverdə işləyən Node.js mühitinin saat qurşağı (məsələn, UTC) ilə istifadəçinin brauzerinin saat qurşağı fərqli olduqda, new Date() fərqli nəticələr göstərir.
  • Yalnız müştəri tərəfində mövcud olan obyektlər: Server tərəfində window, document və ya localStorage kimi yalnız brauzerə məxsus qlobal obyektlərdən istifadə etməyə çalışmaq.
  • Fərqli məlumatlar: Serverin API-dan aldığı məlumatla brauzerin render zamanı aldığı məlumatın fərqli olması.

DOM-un Yenidən Qurulması və Cumulative Layout Shift (CLS) Əlaqəsi

Hydration uyğunsuzluğu baş verdikdə, brauzer serverdən gələn HTML-i rədd edir və bütün DOM ağacını JavaScript vasitəsilə sıfırdan yenidən qurmağa məcbur olur. Bu isə aşağıdakı ciddi problemlərə yol açır:

  1. Cumulative Layout Shift (CLS) Artımı: Səhifə elementləri qəfildən yerini dəyişir, bu isə istifadəçi təcrübəsini korlayır və Google-un Core Web Vitals göstəricilərində səhifənizin reytinqini aşağı salır.
  2. Time to Interactive (TTI) Gecikməsi: Brauzer əlavə iş gördüyü üçün səhifənin tam interaktiv olması gecikir.
  3. Googlebot-un çaşqınlığı: Googlebot fərqli DOM strukturları gördükdə səhifənin məzmununu səhv şərh edə bilər və ya vacib daxili linkləri izləməkdən imtina edə bilər.

Müxtəlif Rendering Metodlarının SEO və Performans Müqayisəsi

Layihənizin arxitekturasını seçərkən hər bir rendering metodunun SEO-ya və performansa təsirini bilmək vacibdir. Aşağıdakı cədvəldə bu metodların ətraflı müqayisəsi verilmişdir:

Rendering MetoduTTFB (Time to First Byte)FCP (First Contentful Paint)TTI (Time to Interactive)SEO UyğunluğuServer Yükü
CSR (Client-Side)Çox SürətliZəif / GecGecÇox ZəifÇox Aşağı
SSR (Server-Side)Orta / YavaşÇox SürətliSürətliMükəmməlYüksək
SSG (Static Gen.)Çox SürətliÇox SürətliÇox SürətliMükəmməlÇox Aşağı
ISR (Incremental)Çox SürətliÇox SürətliÇox SürətliMükəmməlAşağı
Dynamic RenderingOrtaSürətli (Bot üçün)Sürətli (Bot üçün)YaxşıOrta

Googlebot Render Problemlərinin Diaqnostikası və Həlli

Səhifənizin Googlebot tərəfindən necə göründüyünü yoxlamaq üçün yalnız Google Search Console-un "URL Inspection" alətinə güvənmək kifayət deyil. Çünki bu alət bəzən real zamanlı render zamanı baş verən asinxron JavaScript xətalarını tam göstərmir.

Puppeteer ilə Googlebot Simulyasiyası

Səhifənizin real DOM strukturunu və Googlebot-un qarşılaşa biləcəyi JavaScript xətalarını yoxlamaq üçün Node.js və Puppeteer kitabxanasından istifadə edərək xüsusi bir test skripti hazırlaya bilərsiniz. Bu skript Googlebot-un User-Agent-ini simulyasiya edir və render olunmuş DOM-u analiz edir.

// googlebot-checker.js
const puppeteer = require('puppeteer');

async function checkPage(url) {
    // Googlebot User-Agent simulyasiyası
    const googlebotUA = 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)';
    
    const browser = await puppeteer.launch({ headless: true });
    const page = await browser.newPage();
    
    // User-Agent təyin edilir
    await page.setUserAgent(googlebotUA);
    
    // Konsol xətalarını izləmək üçün
    page.on('pageerror', error => {
        console.log(`[JS XƏTASI]: ${error.message}`);
    });

    console.log(`Səhifə yüklənir: ${url}`);
    try {
        await page.goto(url, { waitUntil: 'networkidle0', timeout: 15000 });
        
        // Render olunmuş DOM-dan məlumatların götürülməsi
        const pageData = await page.evaluate(() => {
            return {
                title: document.title,
                h1: document.querySelector('h1') ? document.querySelector('h1').innerText : 'H1 tapılmadı!',
                bodyLength: document.body.innerHTML.length,
                linksCount: document.querySelectorAll('a').length
            };
        });
        
        console.log('\n--- Googlebot Render Nəticələri ---');
        console.log(`Başlıq (Title): ${pageData.title}`);
        console.log(`H1 Başlığı: ${pageData.h1}`);
        console.log(`HTML Həcmi (Simvol): ${pageData.bodyLength}`);
        console.log(`Tapılan Link Sayı: ${pageData.linksCount}`);
        
        if (pageData.bodyLength < 5000) {
            console.log('\n[XƏBƏRDARLIQ]: Səhifə həcmi çox kiçikdir. JavaScript render problemi ola bilər!');
        }
        
    } catch (err) {
        console.error(`Yüklənmə xətası: ${err.message}`);
    }
    
    await browser.close();
}

// Yoxlamaq istədiyiniz URL-i daxil edin
checkPage('https://example.com');

Bu skript vasitəsilə siz asanlıqla müəyyən edə bilərsiniz ki, Googlebot səhifənizə daxil olduqda asinxron sorğuların tamamlanmasını gözləyə bilirmi, yoxsa boş bir səhifə ilə qarşılaşır.

Dynamic Rendering: Nə vaxt və necə istifadə edilməli?

Əgər böyük bir SPA layihəniz varsa və SSR-ə keçid çox baha başa gəlirsə, Dynamic Rendering (Dinamik Render) müvəqqəti və ya daimi xilasedici ola bilər.

Dinamik Render zamanı serveriniz gələn sorğunun kimdən gəldiyini yoxlayır (User-Agent vasitəsilə):

  • Əgər sorğu real istifadəçidən gəlirsə, ona standart, sürətli CSR (JavaScript) tətbiqi göndərilir.
  • Əgər sorğu Googlebot, Bingbot və ya digər axtarış motorlarından gəlirsə, sorğu server tərəfində yerləşən bir render alətinə (məsələn, Rendertron və ya Puppeteer) yönləndirilir, orada tam render olunur və bota statik HTML kimi qaytarılır.

Qeyd: Google Dinamik Render-i uzunmüddətli həll yolu kimi tövsiyə etmir və SSR və ya Hybrid rendering metodlarına keçidi üstün tutur. Lakin köhnə texnoloji infrastruktura malik böyük saytlar üçün bu hələ də effektiv bir metoddur.


SPA-larda JavaScript SEO üçün Praktiki Tətbiq Planı

JavaScript əsaslı layihələrdə axtarış görünürlüyünü maksimuma çatdırmaq üçün aşağıdakı addım-addım tətbiq planını həyata keçirin:

1. Linklərin Düzgün Qurulması (Semantic Links)

Googlebot səhifələr arasında keçid etmək üçün mütləq standart href atributu olan &lt;a> teqlərini axtarır. JavaScript hadisələri (click events) ilə idarə olunan keçidləri botlar izləyə bilmir.

  • Səhv tətbiq: &lt;div onClick="navigateToPage('/about')">Haqqımızda&lt;/div>
  • Düzgün tətbiq: &lt;a href="/about">Haqqımızda&lt;/a>

2. Hydration Mismatch Xətalarının Aradan Qaldırılması

React (Next.js) layihələrində hydration xətalarını tapmaq üçün brauzerin konsoluna (Console) nəzarət edin. Əgər "Hydration failed because the initial UI does not match what was rendered on the server" xətası görürsünüzsə:

  • Komponentlərin yalnız brauzerdə işləməsini təmin etmək üçün Next.js-də dynamic idxalından (dynamic import) ssr: false parametri ilə istifadə edin.
  • Yalnız müştəri tərəfində işləyəcək kodları useEffect daxilində yazın. Çünki useEffect serverdə icra olunmur, yalnız brauzerdə işə düşür.

3. Pagination (Səhifələmə) Optimizasiyası

Sonsuz sürüşdürmə (Infinite Scroll) istifadəçilər üçün əla olsa da, Googlebot səhifəni aşağı sürüşdürmür. Buna görə də, sonsuz sürüşdürmə olan səhifələrin altında mütləq alternativ olaraq standart səhifələmə (pagination) linkləri yerləşdirilməlidir ki, bot digər məhsul və ya məqalələri tapa bilsin.

4. Meta Teqlərin Dinamik İdarə Edilməsi

Hər bir səhifənin özünəməxsus title, descriptioncanonical teqləri olmalıdır. React-də bunun üçün react-helmet-async kitabxanasından, Next.js-də isə daxili Metadata API-dan istifadə edin. Bu teqlərin serverdən gələn ilkin HTML-də yer alması olduqca vacibdir.


Nəticə: Gələcəyə Hazır JavaScript SEO Strategiyası

JavaScript müasir vebin ayrılmaz hissəsidir və ondan imtina etmək qeyri-mümkündür. Uğurlu bir SEO strategiyası JavaScript-i məhdudlaşdırmaq deyil, onun axtarış motorları tərəfindən necə başa düşüldüyünü idarə etmək üzərində qurulmalıdır.

Əgər yeni bir layihəyə başlayırsınızsa, mütləq Next.js (React), Nuxt.js (Vue) və ya SvelteKit kimi SSR dəstəkli çərçivələri seçin. Mövcud SPA layihələrinizdə isə Puppeteer testləri ilə Googlebot-un qarşılaşdığı maneələri mütəmadi olaraq yoxlayın, hydration xətalarını sıfıra endirin və DOM strukturunuzu sadələşdirin. Unutmayın ki, həm istifadəçi, həm də Googlebot üçün ən sürətli və ən anlaşıqlı səhifə - düzgün optimallaşdırılmış DOM strukturuna malik olan səhifədir.

JS
YAZAR

Jamil Sultanli

Rəqəmsal marketinq, SEO və startuplar üzrə məsləhətçi. Datanın tətbiqi ilə işlərin miqyaslanması (Scaling) və inkişaf (Growth) strategiyalarının idarə olunması haqqında yazır.

Bunları da oxuyun