Tek sayfalı uygulama SEO'su: SPA'lar neden sıralanamaz, SSR, statik üretim ve ön oluşturma bunu nasıl çözer ve uygulamanız yapay zeka tarayıcıları tarafından nasıl okunabilir hale getirilir.

Kısaca
tek sayfalı uygulama (SPA), tek bir HTML kabuğu yükler ve her görünümü tarayıcıda JavaScript ile oluşturur. Google JavaScript'i oluşturabilir, ancak oluşturma gecikmelidir ve kırılgandır; ChatGPT, Claude ve Perplexity'nin arkasındaki tarayıcılar ise onu hiç çalıştırmaz. Sıralanmak ve alıntılanmak için bir SPA'nın her görünümünün kendi URL'sine, href içeren gerçek bir bağlantıya, benzersiz bir başlık ve açıklamaya, doğru bir durum koduna ve her şeyden önce ana içeriğinin sunucunun gönderdiği HTML'de, sunucu tarafı oluşturma, statik üretim veya ön oluşturma yoluyla bulunmasına ihtiyacı vardır.
Daha fazlasını mı istiyorsunuz? Sorun:
Tek sayfalı uygulama SEO'su, React, Vue, Angular veya Svelte ile yapılmış bir JavaScript uygulamasını klasik bir web sitesi kadar taranabilir kılan tekniklerin bütünüdür. Sorun iyi belgelenmiştir: Google, JavaScript SEO temelleri sayfasında JavaScript sayfalarını üç aşamada (tarama, oluşturma, dizine ekleme) işlediğini açıklar ve her SPA zayıflığı bu hattın bir yerinde yatar. Bu rehber SPA'lara odaklanıyor; genel olarak JavaScript siteleri için JavaScript SEO rehberimizi okuyun.
Geleneksel bir web sitesi her URL için eksiksiz bir HTML belgesi döndürür. Bir SPA ise her URL için neredeyse aynı belgeyi döndürür: boş bir <div id="root">, birkaç meta etiketi ve büyük bir JavaScript paketi. Tarayıcı paketi indirir, bir API'yi çağırır, sonra sayfayı çizer. Ziyaretçi bir bağlantıya tıkladığında JavaScript içeriği yeniden yüklemeden değiştirir.
Hızlı bir telefonu olan bir insan için sonuç anlık hissedilir. Bir tarayıcı için ilk yanıt boş bir kabuktur: başlık yok, metin yok, bağlantı yok. Her şey botun JavaScript'i çalıştırıp çalıştırmadığına ve ne zaman çalıştırdığına bağlıdır. Bu tek olgu SPA SEO sorunlarının çoğunu açıklar:
/#/pricing) yönlendirme yapar ve #'den sonraki kısım sunucuya hiç gönderilmez; bu yüzden bütün görünümler tek bir URL'de birleşir.<title> taşır ve yönlendirici onu güncellemezse her sayfa onu paylaşır.href içermeyen bağlantılar: düğmeler ve onClick işleyicileri kullanıcılar için gezinir ama tarayıcılara izleyecek bir şey vermez.Googlebot önce ham HTML'i çeker ve orada bulduğu bağlantıları ve yönergeleri okur. 200 durumu döndüren sayfalar ardından, başsız bir Chromium olan Web Oluşturma Hizmeti için bir kuyruğa alınır. Google, bir sayfanın "bu kuyrukta birkaç saniye kalabileceğini, ancak daha uzun da sürebileceğini" belirtir. Oluşturulduktan sonra ortaya çıkan HTML içerik ve bağlantılar için yeniden ayrıştırılır, ardından dizine eklenir.
Google'ın belgelerinden SPA'lar için önemli dört ayrıntı:
href içeren <a> öğeleri güvenilir bağlantılardır. JavaScript ile eklenen bağlantılar, bu biçime uydukları sürece sorun değildir.# yönlendirmeleri yerine History API'sini (pushState) kullanmanızı ister. Eski AJAX tarama şemasını (#! URL'leri) Ekim 2015'te kullanımdan kaldırdı.noindex geçerli olur. Google noindex gördüğünde oluşturmayı atlayabilir; bu yüzden onu sonradan JavaScript ile kaldırmak işe yaramaz.Pratik sonuç: Google istemci tarafında oluşturulan bir SPA'yı dizine ekleyebilir, ancak her sayfaya ikinci bir adım, bir gecikme ve bir başarısızlık noktası eklersiniz. Bir zaman aşımı, engellenmiş bir API çağrısı veya oluşturma sırasında bir JavaScript hatası, dizine eklenen sürümü boş bırakır. Google'ın ne gördüğünü Search Console'daki URL Denetleme aracıyla kontrol edin ve sayfalar dizin dışında kalıyorsa Google dizine eklemesi nasıl çalışır rehberimizi okuyun.
Çoğunlukla hayır. Vercel ve MERJ, ağlarının trafiği üzerine Aralık 2024'te yayımladıkları bir çalışmada "büyük yapay zeka tarayıcılarından hiçbirinin şu anda JavaScript oluşturmadığını" buldu: GPTBot, OAI-SearchBot ve ChatGPT-User (OpenAI), ClaudeBot (Anthropic), PerplexityBot, Meta-ExternalAgent ve Bytespider yalnızca ham HTML'i okuyor. JavaScript dosyalarını indiriyorlar (ChatGPT isteklerinin yaklaşık %11.5'i ve Claude'unkilerin %23.8'i) ama çalıştırmıyorlar. İstisnalar, Google'ın oluşturma altyapısına dayanan Gemini ve tarayıcı tabanlı bir tarayıcı kullanan AppleBot.
İstemci tarafında oluşturulan bir SPA için bu, ChatGPT'yi, Claude'u ve Perplexity'yi besleyen yapay zeka tarayıcılarının boş bir sayfa gördüğü anlamına gelir. Ürününüz Google'da sıralanıp yine de yapay zeka yanıtlarında görünmez kalabilir, çünkü asistan tek bir kelimesini bile okumamıştır. Aynısı, ham HTML'deki Open Graph etiketlerini okuyan sosyal ağlardaki ve mesajlaşma uygulamalarındaki çoğu bağlantı önizleme botu için de geçerlidir. İçerik HTML'e girdikten sonra, istediğiniz yapay zeka tarayıcılarına robots.txt'nizin izin verdiğini de kontrol edin.
Çözüm, ilk yanıtta gerçek HTML göndermektir. Google, dinamik oluşturma belgelerinde dinamik oluşturmayı (yalnızca botlara ön oluşturulmuş bir sürüm sunmak) "bir geçici çözüm, önerilen bir çözüm değil" olarak niteler ve bunun yerine sunucu tarafı oluşturmayı, statik oluşturmayı veya hydration'ı işaret eder. Aşağıdaki tanımlar web.dev'deki Rendering on the Web kaynağını izler.
| Strateji | Nasıl çalışır | İlk HTML'de içerik | En uygun olduğu yer | Sınırlar |
|---|---|---|---|---|
| İstemci tarafı oluşturma (CSR) | Tarayıcı sayfayı JavaScript ve bir API'den oluşturur | Hayır | Paneller ve giriş arkasındaki sayfalar | Google'da gecikmeli dizine ekleme, çoğu yapay zeka tarayıcısına görünmez |
| Sunucu tarafı oluşturma (SSR) | Sunucu her istekte HTML oluşturur, sonra JavaScript onu hydrate eder | Evet | Kataloglar, listeler, sık değişen veya kişiselleştirilmiş içerik | Sunucu maliyeti, önbelleğe alınmazsa daha yavaş yanıt süresi |
| Statik üretim (SSG) | HTML her URL için derleme zamanında üretilir ve bir CDN'den sunulur | Evet | Pazarlama sayfaları, blog, belgeler, açılış sayfaları | İçerik değiştiğinde yeniden derleme gerekir (artımlı seçenekler var) |
| Derleme zamanında ön oluşturma | Başsız bir tarayıcı her rotanın başlangıç durumunu statik HTML olarak yakalar | Evet | Sınırlı sayıda herkese açık rotası olan mevcut SPA'lar | Veri derleme zamanında donar, rotaların listelenmesi gerekir |
| Dinamik oluşturma | Botlar ön oluşturulmuş bir anlık görüntü, kullanıcılar SPA alır | Evet, yalnızca listelenen botlar için | Eski bir uygulama için geçici çözüm | Resmî olarak bir geçici çözüm, bakım maliyeti, botlara farklı içerik sunma riski |
Çoğu modern çerçeve stratejileri rota bazında karıştırmanıza izin verir: pazarlama sayfaları için statik, katalog için sunucu tarafında oluşturulan, giriş yapılmış uygulama için istemci tarafında oluşturulan. Bu hibrit düzen, arama trafiğinin gerçekleştiği yerde tarayıcılara tam HTML verir ve SPA deneyimini değer kattığı yerde korur.
| Kütüphane | İlk yüklemede HTML için çerçeve veya özellik |
|---|---|
| React | Next.js (sunucu bileşenleri, SSR ve statik üretim), çerçeve modunda React Router, Gatsby |
| Vue | Nuxt (varsayılan olarak evrensel oluşturma, statik üretim mevcut) |
| Angular | Angular SSR (sunucu tarafı oluşturma ve derleme zamanında ön oluşturma) |
| Svelte | SvelteKit (varsayılan olarak sunucu tarafı oluşturma, rota bazında ön oluşturma) |
| Hepsi için | Astro (varsayılan olarak statik HTML, etkileşimli adalar yalnızca gerektiği yerde yüklenir) |
Yapay zeka web sitesi oluşturucularıyla üretilen siteler özel bir değinmeyi hak ediyor: çoğu istemci tarafında oluşturulan bir React uygulaması dışa aktarır. Sitenizi bunlardan biriyle yaptıysanız, Google'ın ve ChatGPT'nin onu okuyabildiğini varsaymadan önce Lovable SEO ve GEO notlarımıza bakın.
History API'sini kullanın (/pricing, asla /#/pricing), içerik parçası başına bir URL ve ziyaretçi doğrudan geldiğinde de uygulama içi gezinmeyle geldiğinde de aynı URL. Her URL yeni bir sekmede açıldığında doğru içeriği yüklemelidir; bir tarayıcının yaptığı test budur.
Dizine eklenebilir bir sayfaya götüren her gezinme öğesi bir <a href="/path"> olmalıdır. Çerçevelerin bağlantı bileşenleri (Link, NuxtLink, routerLink) bu işaretlemeyi üretir; div veya button öğelerindeki özel tıklama işleyicileri üretmez. İyi bağlantılar ayrıca site mimarinizi da taşır: bir sayfaya bağlantı verilmezse tarayıcılar onu nadiren bulur.
Her rotanın kendi title'ı, meta açıklaması, canonical'ı ve Open Graph etiketleri olmalı; mümkünse sunucuda üretilmelidir. Meta etiketleri sayfamız nelerin ayarlanacağını listeler. Tek bir canonical etiketi tutun: Google bunu HTML'de ayarlamanızı önerir ve JavaScript onu değiştirirse sonuç özgün olanla çelişmemelidir.
Eksik ürünler ve silinmiş makaleler bir hata mesajıyla 200 yanıtı vermemelidir. SSR ile sunucudan gerçek bir 404 veya 410 döndürün. Saf bir SPA'da Google iki yedeği kabul eder: JavaScript ile 404 döndüren bir URL'ye yönlendirmek veya hata görünümüne bir noindex robots meta etiketi eklemek.
Başlıklar, gövde metni, fiyatlar, SSS ve JSON-LD yapılandırılmış verisi, bir tıklamadan veya kaydırmadan sonra yüklenmemeli, sunucu yanıtında bulunmalıdır. Talep üzerine oluşturulan sekmelerin ya da "daha fazla yükle" düğmelerinin arkasındaki içerik çoğu zaman gözden kaçar.
Paketi rotaya göre bölün, ilk görünüm için gerekmeyeni erteleyin ve hydration sırasında tüm sayfayı yeniden oluşturmaktan kaçının. Chrome saha verisinin (CrUX) uygulama içi gezinmelerin metriklerini ziyaretçinin ilk yüklediği URL'ye atfettiğini unutmayın; bu yüzden kilit şablonlarınızı tek tek test edin.
Her kilit şablonun üç sürümünü karşılaştırın: ham HTML (kaynağı görüntüleyin veya sayfayı bir komut satırı aracıyla çekin), Google'ın oluşturduğu HTML (URL Denetleme, ardından "Taranan sayfayı görüntüle") ve JavaScript devre dışıyken sayfa. Ana metin yalnızca ikinci sürümde görünüyorsa yapay zeka tarayıcıları onu görmez. Ücretsiz yapay zeka için taranabilirlik denetimimiz ve dizine eklenebilirlik denetleyicisi bu kontrolleri herhangi bir URL'de yapar.
| Belirti | Olası neden | Çözüm |
|---|---|---|
| Search Console çok sayıda sayfayı "Taranan, şu anda dizine eklenmeyen" olarak gösteriyor | Oluşturmadan önce boş veya neredeyse aynı HTML | Herkese açık rotalar için SSR, SSG veya ön oluşturma |
Bir site: aramasındaki her sonuç aynı title'ı gösteriyor | Title rota başına güncellenmiyor | Sunucuda rota düzeyinde head yönetimi |
| Yalnızca ana sayfa dizine eklenmiş | Hash yönlendirme veya href içermeyen bağlantılar | History API ve gerçek <a> bağlantıları |
| Hata sayfaları dizinde görünüyor | Soft 404'ler (her yerde 200 durumu) | Sunucu 404'ü veya 404 URL'sine JavaScript yönlendirmesi ya da noindex |
| Google'da sıralanıyor ama ChatGPT veya Perplexity tarafından hiç alıntılanmıyor | İçerik yalnızca JavaScript çalıştıktan sonra görünür | İçerik ilk HTML yanıtında |
| Google'ın oluşturulmuş görünümünde eski içerik | Önbelleğe alınmış JavaScript veya CSS dosyaları | Parmak izli dosya adları |
Yıllarca istemci tarafı oluşturma, Google JavaScript'i er ya da geç oluşturduğu için yönetilebilir bir risk olmuştu. Keşfin bir kısmı artık ChatGPT'de, Claude'da, Gemini'de ve Perplexity'de gerçekleştiğinden maliyet değişti: yalnızca JavaScript çalıştıktan sonra var olan bir sayfa, çoğu asistanın okuyabildiği kaynaklarda yoktur. Ham HTML'de taranabilirlik, üretken motor optimizasyonunun ilk koşulu haline geldi.
HTML eksiksiz olduğunda geri kalan olağan kuralları izler: bir soruyu net biçimde yanıtlayan, kaynaklı olgular ve yapılandırılmış veri içeren sayfalar, asistanların alıntıladığı sayfalardır. Sorank'ın GEO optimizasyonu özellikleri bu içeriği yazıp yayınlamanıza yardımcı olur, yapay zeka anma takibi ise oluşturma düzeltmesinden sonra ChatGPT'nin, Claude'un ve Gemini'nin markanızı alıntılayıp alıntılamadığını gösterir.
Tek sayfalı uygulama SEO'sunun temel kuralı tek cümleye sığar: Google'ın sıralamasını ve yapay zekanın alıntılamasını istediğiniz her şey sunucunun gönderdiği HTML'de olmalıdır. SPA'yı giriş yapılmış deneyim için tutun, herkese açık sayfaları sunucuda veya derleme zamanında oluşturun, sonra her sürümden önce ve sonra botların ne aldığını test edin.
Tek sayfalı uygulama Google tarafından cezalandırılmaz, ancak varsayılan kurulumu olan tek HTML kabuklu istemci tarafı oluşturma, dizine eklemeyi daha yavaş ve daha az güvenilir kılar. Çoğu yapay zeka tarayıcısı JavaScript çalıştırmaz, bu yüzden boş bir sayfa görür. Herkese açık rotalarda sunucu tarafı oluşturma, statik üretim veya ön oluşturma ile bir SPA, herhangi bir klasik web sitesi kadar iyi sıralanabilir.
React kendi başına nötrdür: önemli olan HTML'in nerede üretildiğidir. Yalnızca tarayıcıda oluşturulan bir React uygulaması olağan SPA sorunlarını yaşar; aynı bileşenler sunucuda Next.js veya çerçeve modunda React Router ile oluşturulduğunda tarayıcılara eksiksiz HTML sunar. Dizine eklenmesini istediğiniz sayfalar için sunucu veya statik oluşturmayı destekleyen bir çerçeve seçin.
Yalnızca geçici bir önlem olarak. Google dinamik oluşturmayı bir geçici çözüm olarak tanımlar, önerilen bir çözüm olarak değil; çünkü botlar için ayrı bir sürümü sürdürmek maliyet ve risk ekler. Sunucu tarafı oluşturma, statik üretim veya derleme zamanında ön oluşturma her ziyaretçiye aynı HTML'i verir ve uzun vadeli çözümlerdir.
SORANK'I SİZDEN ÖNCE DENEDİLER
