İstemci Tarafı JavaScript Framework'leri

React, Vue, Angular, Svelte ve SolidJS ortak bir SEO sorununu paylaşır: istemci tarafında oluşturma boş bir kabuk gönderir. Çözüm örüntüsü de ortaktır: head yönetimi ve bir oluşturma stratejisi.

İlk yayın tarihi: 26 Haz 2026 · Son güncelleme: 9 Ağu 2026 · Advanced
Diller

React, Vue, Angular, Svelte ve SolidJS, varsayılan olarak neredeyse boş bir HTML kabuğu gönderen ve sayfayı tarayıcıda oluşturan (istemci tarafında oluşturma) UI kütüphaneleridir. Bu, JavaScript çalışana kadar tarayıcıların boş bir sayfa aldığı anlamına gelir; Google sayfayı oluşturabilir, ancak bunu gecikmeli bir kuyrukta yapar ve diğer tarayıcılar (Bing, yapay zekâ botları) çok daha az güvenilirdir. Çözüm beşinde de aynıdır: (1) meta etiketlerin her rota için mevcut olmasını sağlayan bir head yönetimi paketi ve (2) önceden oluşturma, SSR veya eşleşen meta-framework'e geçiş gibi bir oluşturma stratejisi. Bu merkez, ortak sorunu ve ortak çözümü açıklar, ardından sizi her framework'e özgü ayrıntılı rehberlere yönlendirir.

TL;DR — React, Vue, Angular, Svelte ve SolidJS, varsayılan olarak istemci tarafında oluşturma kullanan UI kütüphaneleridir: neredeyse boş bir HTML kabuğu gönderir ve DOM’u tarayıcıda oluştururlar. SEO sorunu beşinde de aynıdır; tarayıcılar boş bir kabuk alır ve içerik ancak JS çalıştıktan sonra var olur. Google bu uygulamaları işler, ancak bunu gecikmeli ve kuyruğa alınmış biçimde yapar; Bing ve yapay zekâ tarayıcıları çok daha az güvenilirdir. Çözüm de aynıdır: (1) head yönetimi (<title>/meta için rota başına bir paket) ve (2) bir oluşturma stratejisi (önceden oluşturma, SSR veya eşleşen meta-framework’e geçiş). Framework’ler arasındaki farklar çoğunlukla hangi paketin ve hangi stratejinin kullanılacağıdır; bunlar aşağıdaki ayrıntılı rehberlerde ele alınmaktadır.

Bunlar eksiksiz framework’ler değil, kütüphanelerdir; sorunun kökü de budur

Framework mimarileri farklılık gösterdiğinden, istemci tarafında oluşturma otomatik olarak dizine ekleme başarısızlığı anlamına gelmez. Evidence for this claim Primary standard or official documentation supporting the adjacent article claim. Scope: Protocol semantics and Search behavior are kept separate; no indexing, ranking, or migration-timing guarantee is inferred. Confidence: high · Verified: MDN: Client-side frameworks Sunucuda oluşturma veya önceden oluşturma, dizine eklenmeyi garanti etmeksizin tarayıcı tarafında JavaScript çalıştırılmasına olan bağımlılığı azaltır. Evidence for this claim Primary standard or official documentation supporting the adjacent article claim. Scope: Protocol semantics and Search behavior are kept separate; no indexing, ranking, or migration-timing guarantee is inferred. Confidence: high · Verified: Google: JavaScript SEO basics

React, Vue, Angular, Svelte ve SolidJS öncelikle UI oluşturma kütüphaneleridir. Görevleri, verilerinizi DOM’a dönüştürmek ve durum değiştikçe DOM’u eşzamanlı tutmaktır. Kutudan çıktığı hâliyle bu DOM tarayıcıda oluşturulur; onları hızlı ve uygulama benzeri hissettiren de SEO sorununu yaratan da tam olarak budur.

Varsayılan bir derleme; boş bir bağlama düğümü (<div id="root">, <div id="app">, <app-root>) içeren bir HTML kabuğu ve bir JavaScript paketi gönderir. Arama motorunun önemsediği her şey; başlıklar, gövde metni, dahili bağlantılar ve yapılandırılmış veriler, paket indirilip çalıştırıldıktan sonra eklenir. JS çalışmadan önce orada hiçbir şey yoktur.

Bu, yalın kütüphanelere bir meta-framework veya derleme zamanında önceden oluşturma adımı eklenmeden önce kutudan çıktığı hâliyle görülen istemci tarafında oluşturma davranışıdır. Bu bir hata değildir; başlangıçtaki varsayılan davranıştır. Ancak “varsayılan”, “kalıcı” veya “evrensel” demek değildir: varsayılan davranış sürüme ve kullanılan CLI ya da başlangıç şablonuna göre değişir; aynı uygulamadaki iki rota, oluşturulma biçimlerine bağlı olarak farklı oluşturma modları kullanabilir (önceden oluşturulmuş bir pazarlama sayfası ve saf CSR olarak bırakılmış bir pano gibi). Bir framework’ün davranışını adından çıkarmayın; belirli bir derlemedeki belirli rotanın gerçekte ne gönderdiğini kontrol edin.

Ortak sorun: boş bir kabuk

Google, JS uygulamalarını tarama, oluşturma ve dizine ekleme aşamalarında işlediğini ve “without rendering Google might not see that content.” ifadesiyle oluşturma yapılmadan içeriği göremeyebileceğini açıkça belirtir. Bir CSR uygulamasında içeriğin tamamı bu oluşturma adımının arkasındadır. Bunun üç sonucu vardır:

  • Oluşturma gecikir ve bekleme süresi sabit değildir. Oluşturma, taramadan sonra gerçekleşen ayrı ve kuyruğa alınmış bir adımdır. Google tarama, oluşturma ve dizine eklemeyi üç ayrı aşama olarak belgeler ancak her sayfa için geçerli tek bir bekleme süresi taahhüt etmez. Gecikme URL’ye ve Google’ın o andaki kaynaklarına göre değişir; ilgili sayfa için ne kadar sürerse sürsün, oluşturma tamamlanana kadar içeriğiniz dizine eklenmek üzere mevcut değildir.
  • Google dışındaki tarayıcıların desteği kesin değildir. Bing JavaScript’i tutarsız biçimde işler; çoğu yapay zekâ tarayıcısı (LLM’ler ve yapay zekâ araması için sayfaları getiren botlar) ise JS’i çok az çalıştırır veya hiç çalıştırmaz. Bunlar ayrı altyapılara sahip ayrı şirketlerdir; bu nedenle Google’ın belgelerinden genelleme yapılamaz. Her sağlayıcının güncel davranışını, Google ile veya geçen yılki bir testle aynı olduğunu varsaymak yerine doğrulayın. Yalnızca CSR kullanan bir site, oluşturma yapmayan tarayıcılar için neredeyse görünmez olma riski taşır ve yapay zekâ tarayıcılarının trafikteki payı giderek artmaktadır.
  • Sayfaya özgü metadata eksiktir. Tek bir HTML dosyası, head bölümünü her rota için etkin biçimde yönetmediğiniz sürece tüm rotalarda tek bir <title> ve tek bir meta açıklaması kullanılması demektir.

Ortak çözüm, 1. bölüm: head yönetimi

Bir SPA tek bir HTML belgesine sahip olduğundan, kullanıcı (ve tarayıcının oluşturucusu) rotalar arasında geçiş yaptıkça belgenin head bölümünü güncelleyen bir koda ihtiyacınız vardır. Her framework bunun için standart bir pakete veya yerleşik API’ye sahiptir:

  • Reactreact-helmet-async (veya Next.js’e geçtiyseniz framework’ün metadata API’si).
  • Vue@unhead/vue (Nuxt’ın SEO araçlarının arkasındaki altyapı).
  • Angular@angular/platform-browser paketindeki yerleşik Title ve Meta servisleri; ek bağımlılık gerekmez.
  • Svelte → yerleşik <svelte:head> öğesi.
  • SolidJS@solidjs/meta (SSR yolu için de SolidStart).

Head yönetimi doğru ve benzersiz meta etiketleri sağlar, ancak boş kabuk sorununu tek başına çözmez. Etiketler yine yalnızca JS çalıştıktan sonra görünür. Bu nedenle 2. bölüme de ihtiyacınız vardır.

Ortak çözüm, 2. bölüm: oluşturma stratejisi

Gerçek içeriği (ve head etiketlerini) JavaScript çalışmadan önce HTML’ye yerleştirmek için üç yaklaşımdan birini seçersiniz. Kaldırdıkları SEO riski miktarına göre sıralama şöyledir:

  1. Önceden oluşturma / statik üretim (SSG). Her rota için derleme zamanında statik HTML oluşturun. İstek başına değişmeyen içerik açısından en düşük riskli seçenektir. Her kütüphanenin bir önceden oluşturma yolu vardır (ör. SolidJS’in yerleşik prerender özelliği, Vue prerender eklentileri ve Angular’ın prerendering özelliği).
  2. Sunucu tarafında oluşturma (SSR). Her istek için HTML’yi sunucuda oluşturun, ardından tarayıcıda hydrate edin. Meta-framework’ler burada devreye girer: Next.js (React), Nuxt (Vue), Angular SSR (eski adıyla Angular Universal), SvelteKit (Svelte) ve SolidStart (SolidJS). Sıralama alması gereken çoğu içerik sitesi için eşleşen meta-framework’ü benimsemek en temiz çözümdür.
  3. Tam CSR kullanmaya devam edin ancak taranabilir hâle getirin. Sıralama alması gerekmeyen, oturum açma arkasındaki uygulama benzeri yüzeyler için bazen kabul edilebilir; ancak aramada görünmesini istediğiniz herhangi bir şey için kötü bir varsayılandır.

Bu kararı uygulama başına değil, rota başına verin. Aynı kod tabanındaki bir pazarlama sayfası ile oturum açılmış bir pano, makul biçimde bu listenin farklı satırlarında yer alabilir. Her rota için şunları sorun:

  • Çıktı — içeriğin ilk yanıtta bulunması gerekiyor mu, yoksa JS çalıştıktan sonra görünmesi yeterli mi?
  • Güncellik — bir kez oluşturulabilecek kadar sabit mi (prerender), yoksa her istekte değişiyor mu (SSR)?
  • Kişiselleştirme — her ziyaretçi için farklı mı? Önceden oluşturma burada yardımcı olamaz; SSR ile CSR arasında seçim yaparsınız.
  • Sunucu maliyeti — SSR her istekte işlem maliyeti ekler; önceden oluşturma ise bu maliyeti derleme zamanına taşır.
  • JS bağımlılığı — rotanın yararlılığının ne kadarı istemci JavaScript’inin çalışmasına bağlıdır?
  • Hata davranışı — JS başarısız olur veya engellenirse rota kullanılabilir bir şeye mi, yoksa hiçliğe mi dönüşür?

Framework ne olursa olsun karar aynı soruya dayanır: Bu içeriğin sıralama alması veya kaynak gösterilmesi gerekiyor mu? Evetse içeriği sunucuda oluşturulmuş ya da önceden oluşturulmuş HTML’ye yerleştirin. Tamamen etkileşimli bir uygulama arayüzüyse CSR uygundur.

Google bu uygulamaları nasıl ele alır (ve diğerleri neden aynı şeyi yapmaz)?

Google bu framework’lerin her birini işleyebilir; sürekli güncel, headless Chrome çalıştırır ve JS’inizi yürütür. Ancak bunu ertelenmiş bir kuyrukta yapar ve oluşturucu durumsuzdur (kalıcı çerezler/localStorage, service worker’lar veya etkileşim yoktur; kaydırma ya da tıklama yapmaz). Bu nedenle JavaScript SEO merkezindeki aynı JS-SEO kuralları framework seçimine ek olarak geçerlidir: gerçek <a href> bağlantıları, ham ve oluşturulmuş DOM arasında eşdeğerlik, etkileşim arkasına gizlenmemiş içerik ve JS ile eklenmemiş noindex.

Google dışında tablo daha kötüdür. Bing’in JS oluşturma desteği daha düzensizdir ve yapay zekâ tarayıcıları büyük ölçüde hiç oluşturma yapmaz. Bir CSR uygulamasında bu, içeriğinizin Google için (eninde sonunda) mevcut olduğu ancak Bing veya giderek daha fazla kişinin arama yapmak için kullandığı yapay zekâ araçları için mevcut olmadığı anlamına gelebilir. SSR veya önceden oluşturma, bu açığı yalnızca Google için değil herkes için kapatır; yalnızca CSR içeriği göndermemek için en güçlü gerekçe budur.

Beş framework’e genel bakış

FrameworkVarsayılanHead yönetimiSSR / meta-frameworkSEO notu
ReactCSRreact-helmet-asyncNext.js (Metadata API)En yaygın CSR öncelikli SPA; Next.js standart SEO çözümüdür
VueCSR@unhead/vueNuxt (useSeoMeta())Nuxt varsayılan olarak SSR kullanır; yalın Vue için prerender veya Nuxt gerekir
AngularCSR (SPA)yerleşik Title/Meta servisleriAngular SSR (eski adı Universal)Büyük SPA’lar; modern Angular, SSR + artımlı hydration ekler
SvelteCSR (Svelte) / SSR (SvelteKit)<svelte:head>SvelteKit (varsayılan SSR)SvelteKit varsayılan olarak SSR kullanır; ssr:false statik tuzağına dikkat edin
SolidJSCSR@solidjs/metaSolidStartİnce taneli reaktivite; SolidStart, SSR + prerender ekler

Örüntü tutarlıdır: varsayılan CSR, bir head paketi ve bir oluşturma stratejisi (genellikle eşleşen meta-framework). Değişenler adlar ve birkaç kritik ayrıntıdır.

Sonraki adım: ayrıntılı framework rehberleri

Bu merkez bir yol haritasıdır. Her framework’ün belirli paketleri, yapılandırmaları ve dikkat edilmesi gereken noktaları içeren kendi rehberi vardır:

  • React SEO — CSR öncelikli React’in neden dizine ekleme riski yarattığı, React Router ve History API, react-helmet-async ve ne zaman Next.js kullanılacağı.
  • Vue SEO — Vue 3’ün varsayılan CSR davranışı, createWebHistory(), @unhead/vue, meta-framework olmadan önceden oluşturma ve Nuxt’ın ne zaman doğru seçim olduğu.
  • Angular SEO — Angular’ın SPA varsayılanları, @angular/ssr, yerleşik Title ve Meta servisleri, önceden oluşturma ve artımlı hydration.
  • Svelte SEO — Svelte ile SvelteKit karşılaştırması, SvelteKit’te varsayılan SSR, <svelte:head>, adapter-static + ssr: false tuzağı ve yapay zekâ tarayıcılarına etkileri.
  • SolidJS SEO — SolidJS’in varsayılan CSR davranışı, @solidjs/meta, SSR ve önceden oluşturma için SolidStart ve ince taneli modelinin oluşturulmuş çıktıyı nasıl etkilediği.

Oluşturma modlarının kendisi (CSR, SSR, SSG, ISR, hydration, dinamik oluşturma) ve daha geniş oluşturma/eşdeğerlik kuralları için üst düzey JavaScript SEO merkezine bakın.

Add an expert note

Pin an expert quote

New person? Create their unclaimed profile at /admin/experts/ → Pin a quote first.