JavaScript için SEO

JavaScript bağımlı içeriğin arama motorları tarafından taranabilmesini, oluşturulabilmesini ve dizine eklenebilmesini sağlama — gerçek bağlantılar, eşlik, tembel yükleme, sonsuz kaydırma, soft-not-found sayfaları ve test.

İlk yayın tarihi: 23 Haz 2026 · Son güncelleme: 8 Ağu 2026 · Advanced
Diller
Bu sayfada 1 kanıt sinyali

JavaScript SEO, arama motorlarının JavaScript'e bağlı içeriği tarayıp oluşturabilmesi ve dizine ekleyebilmesiyle ilgilidir. Google JS çalıştırabilir — hata biçimleri daha özeldir: eşlik (ham ve oluşturulmuş sürüm), etkileşim (Google kaydırmaz veya tıklamaz), durum (oluşturucu durum bilgisi tutmaz) ve zamanlama. Bağlantıları gerçek anchor öğeleri olarak tutun, JS/CSS'yi engellemeyin, sıralanması gereken içerik için SSR veya önceden oluşturmayı tercih edin ve sonsuz kaydırmaya dikkat edin — yüksek bir oluşturma görünüm alanı iki sayfanın tek sayfa olarak dizine eklenmesine yol açabilir.

TL;DR — Google can run your JavaScript, so “can Google read JS?” is the wrong question. The failure modes are parity (raw vs. rendered DOM), interaction (Google doesn’t scroll or click), state (the renderer is stateless), and timing. Keep links as real <a href> anchors, don’t block JS/CSS, lazy-load on viewport not interaction, return real statuses for client-side 404s, and remember a raw noindex may prevent rendering before JavaScript can remove it. Combine directives that were actually processed, but do not assume a universal raw/rendered winner. Watch infinite scroll especially: a tall render viewport can trigger the loader and merge two URLs into one indexed page. For the renderer internals and which rendering mode to pick, see rendering.

Google JavaScript’i okuyabilir mi? Evet — soru bu değil

Google can run your JavaScript — the real risks are parity, interaction, state, and timing. Kaynak: /technical-seo/javascript-seo/

Three stages run left to right: crawl, render, and index. The render stage branches into four failure modes: parity, where the rendered DOM may not match expectations; interaction, where content requires a scroll or click; state, where content relies on cookies or storage that the renderer clears; and timing, where content is deferred behind slow JavaScript.

© Patrick Stox LLC · CC BY 4.0 ·

Google JavaScript uygulamalarını üç aşamada işler: “Google processes JavaScript web apps in three main phases: 1. Crawling 2. Rendering 3. Indexing.” (terjemahan) “Google, JavaScript web uygulamalarını üç ana aşamada işler: 1. Tarama 2. Oluşturma 3. Dizine ekleme.” Orta aşama, dizine eklenecek DOM’u oluşturmak için JS’yi evergreen, headless Chrome’da çalıştırır. “Rendering is important because websites often rely on JavaScript to bring content to the page, and without rendering Google might not see that content.” (terjemahan) “Oluşturma önemlidir; çünkü web siteleri içeriği sayfaya getirmek için çoğu zaman JavaScript’e güvenir ve oluşturma olmadan Google bu içeriği göremeyebilir.”

Evidence for this claim Google processes JavaScript web apps in three main phases: crawling, rendering, and indexing; without rendering, Google might not see JavaScript-provided content. Scope: Google Search's processing of JavaScript pages; successful rendering does not guarantee indexing or ranking. Confidence: high · Verified: Google Search Central: Understand the JavaScript SEO basics

Yani Google JavaScript’inizi çalıştırabilir. Yararlı sorular daha özeldir:

  • Eşlik — oluşturulmuş DOM gerçekten içerdiğini düşündüğünüz şeyi içeriyor mu?
  • Etkileşim — Google’ın gerçekleştirmeyeceği bir kaydırma veya tıklama gerekiyor mu?
  • Durum — durum bilgisi tutmayan oluşturucunun temizlediği çerezlere veya localStorage’a mı güveniyorsunuz?
  • Zamanlama — kritik içerik yavaş veya geç çalışan JavaScript’in arkasında mı erteleniyor?

Özellikle zamanlama konusunda: Google, taranmış bir sayfayı (200 döndürmüş bir sayfayı) oluşturma kuyruğuna alır ve “the page may stay on this queue for a few seconds, but it can take longer than that.” (terjemahan) “sayfa bu kuyrukta birkaç saniye kalabilir, ancak daha uzun sürebilir.” Yayımlanmış sabit bir gecikme veya zaman aşımı yoktur — ayrıca 200 olmayan bir durum döndüren ya da başlangıçta bir noindex yönergesi taşıyan sayfa, JavaScript’in bunu değiştirmesini beklemek yerine oluşturma kuyruğunu atlayabilir.

Evidence for this claim Google queues crawled pages with a 200 response for rendering; the page may stay in that queue for a few seconds but can take longer, with no published fixed delay or timeout, and non-200 or initial noindex responses may skip rendering. Scope: Google Search's documented render-queue behavior; not a guaranteed or universal timing figure. Confidence: high · Verified: Google Search Central: Understand the JavaScript SEO basics

Google’ın nasıl oluşturduğunun mekanikleri — Web Rendering Service, durum bilgisizliği, önbelleğe alma ve “iki dalga” efsanesi — rendering sayfasında. Burada pratik sorunlara ve düzeltmelere odaklanacağım.

Bağlantılar gerçek <a href> öğeleri olmalı

Bu, en yaygın JS SEO hatasıdır. “Google can only discover your links if they are <a> HTML elements with an href attribute.” (terjemahan) “Google bağlantılarınızı yalnızca href özniteliğine sahip <a> HTML öğeleri ise keşfedebilir.” <div> işleyicisine sahip tıklanabilir bir onclick, Google için bağlantı olarak görünmez — izlenmez ve keşif için ona bağlı olan sayfalar taranmadan kalabilir. JavaScript ile bağlantı eklemek tamamen uygundur; yeter ki bunlar oluşturulmuş DOM’da gerçek <a href> öğelerine dönüşsün. Ancak bu oluşturulmuş öğeler JavaScript çalıştıktan sonra ayrıştırılır — oluşturulmuş DOM’a girmeleri bağlantıyı keşfedilebilir yapar, URL’nin ham HTML’deki bir bağlantıyla aynı şekilde taranacağının, dizine ekleneceğinin veya değerlendirileceğinin garantisini vermez.

Evidence for this claim Google can reliably discover links only when they are HTML anchor elements with an href attribute. Scope: Link discovery by Google Search; this does not claim that every discovered URL will be crawled or indexed. Confidence: high · Verified: Google Search Central: Make your links crawlable

Tembel yüklenen ve etkileşimle açılan içerik

Oluşturucu meraklı bir kullanıcı gibi davranmaz: “Google Search does not interact with your page.” (terjemahan) “Google Arama sayfanızla etkileşime girmez.” Kaydırma, tıklama veya üzerine gelme yoktur. Bu olaylardan yalnızca biriyle yüklenen içerik görülmez.

Google’ın tavsiyesi şudur: içeriği kullanıcı harekete geçtiğinde değil, görünüm alanına girdiğinde yükleyin — “make sure that your lazy-loading implementation loads all relevant content whenever it is visible in the viewport,” (terjemahan) “tembel yükleme uygulamanızın ilgili tüm içeriği görünüm alanında görünür olduğu her anda yüklediğinden emin olun” ve “don’t add lazy-loading to content that is likely to be immediately visible when a user opens a page.” (terjemahan) “kullanıcı bir sayfayı açtığında büyük olasılıkla hemen görünür olacak içeriğe tembel yükleme eklemeyin.” Görseller için IntersectionObserver veya yerel loading="lazy" kullanın — kaydırma ya da tıklama işleyicisi kullanmayın; böylece içerik normal bir oluşturma sırasında yüklenir.

Evidence for this claim Google Search does not interact with a page, so lazy-loaded content should load when it becomes visible in the viewport rather than requiring user interaction. Scope: Google Search's documented rendering behavior for lazy-loaded content; other crawlers can behave differently. Confidence: high · Verified: Google Search Central: Fix lazy-loaded content

Sonsuz kaydırma: iki sayfanın tek sayfa olarak dizine eklenmesi

Google's tall render viewport can trigger an infinite-scroll loader and merge two pages into one indexed URL. Kaynak: /technical-seo/javascript-seo/

A normal browser viewport stops after the first page, but Google's render viewport expands much taller. The expansion reaches an infinite-scroll trigger, fires the loader without a real user scroll, and appends the next page into the same DOM. Google then indexes both pages' content under one URL.

© Patrick Stox LLC · CC BY 4.0 ·

Bu, neredeyse hiç kimsenin açıklamadığı ve tek başına bütün bu bölümü hak eden noktadır.

Googlebot, tipik bir tarayıcı penceresinden çok daha yüksek bir görünüm alanında oluşturma yapabilir. Google kesin bir oluşturma görünüm alanı boyutu yayımlamıyor — bu boyut değişebilir — bu nedenle belirli bir sayıya göre tasarım yapmayın; bunun yerine kendi uygulamanızı test edin. Önemli olan mekanizmadır: sonsuz kaydırma yükleyiciniz kaydırma konumuna veya görünüm alanı yüksekliğine göre çalışıyorsa, beklenenden yüksek bir oluşturma görünüm alanı oluşturma sırasında yükleyiciyi kendisi tetikleyebilir ve sonraki makalenin veya ürün sayfasının içeriği aynı DOM’a eklenebilir. Böylece iki farklı URL’nin içeriği birlikte oluşturulur ve Google bunları tek sayfa olarak dizine ekleyebilir. Kendi deneyimimde, “occasionally, two pages get indexed as one” (terjemahan) “bazen iki sayfa tek sayfa olarak dizine ekleniyor” — “dizine eklenmedi” olarak bildirilen bazı sayfalar aslında “when Google resized the viewport to be longer … it triggered the infinite scroll and loaded another article in when it was rendering.” (terjemahan) “Google görünüm alanını uzatmak için yeniden boyutlandırdığında … sonsuz kaydırmayı tetikledi ve oluşturma sırasında başka bir makale yüklediği” için başka bir sayfanın (genellikle akıştaki önceki gönderinin) parçası olarak dizine eklenmişti. Kısa bir yerde durmasını beklediğiniz bir sayfanın URL Inspection oluşturulmuş HTML’sini kontrol ederek kendi kurulumunuzun bunu yapıp yapmadığını doğrulayın — bir boyut varsaymayın ve güvende olduğunuzu varsaymayın.

Bunu doğru yapmanın iki katmanı vardır.

Öncelikle sonsuz kaydırmayı arama dostu hâle getirin. Sonsuz kaydırmanın altında sayfalandırılmış yüklemeyi destekleyin. Her parçanın “its own persistent, unique URL,” (terjemahan) “kendine ait kalıcı ve benzersiz bir URL’si” olmalı; her URL’deki içerik her yüklemede aynı kalmalı; ?date=yesterday gibi göreli parametrelerden kaçınmalı; arama motorlarının sayfalandırılmış bir kümedeki URL’leri keşfedebilmesi için “link sequentially to the individual URLs so that search engines can discover the URLs in a paginated set,” (terjemahan) “tek tek URL’lere sırayla bağlantı vermeli”; yeni bir parça kaydırmayla yüklendiğinde “update the displayed URL using the History API.” (terjemahan) “görüntülenen URL’yi History API kullanarak güncellemelisiniz.” Gerçek <a href> sayfalandırma bağlantıları ve benzersiz URL’ler kullanın — sayfa numaraları için “don’t use URL fragment identifiers” (terjemahan) “URL parça tanımlayıcılarını kullanmayın” (yani # işaretinden sonraki bölümü), çünkü Google bunları yok sayar. JavaScript SEO rehberimde söylediğim gibi, “if you have an infinite scroll setup, I still recommend a paginated page version so that Google can still crawl properly.” (terjemahan) “sonsuz kaydırma kurulumunuz varsa Google’ın hâlâ düzgün tarayabilmesi için sayfalandırılmış bir sürümü yine de öneririm.”

Hatalı bir yükleyici sayfaları aktif olarak birleştiriyorsa, en hızlı düzeltme kesindir: “block the JavaScript file that handles the infinite scrolling so the functionality can’t trigger.” (terjemahan) “işlevin tetiklenememesi için sonsuz kaydırmayı yöneten JavaScript dosyasını engelleyin.” Yükleyici oluşturma sırasında çalışamıyorsa sonraki sayfanın içeriğini ekleyemez ve her URL yeniden kendisi olarak oluşturulur.

Soft-404s after client-side routing

Tek sayfalı uygulamalar HTTP durum kodunu değiştirmeden içeriği değiştirebilir; bu nedenle “bulunamadı” görünümü yine de 200 döndürebilir. Google döndürülen içeriği değerlendirdikten sonra bu yanıtı soft 404 olarak sınıflandırabilir, ancak yalnızca statik bir getirme Google’ın bu sınıflandırmayı yaptığını kanıtlayamaz. İki düzeltme vardır: görünümleri History API ile değiştirin ve gerçekten bulunamayan bir durum için ya gerçek bir 404 durumu döndüren bir URL’ye yönlendirin ya da bir noindex etiketi ekleyin. Yönlendirme için URL parçalarına da güvenmeyin — “the AJAX-crawling scheme has been deprecated since 2015, so you can’t rely on URL fragments to work with Googlebot.” (terjemahan) “AJAX tarama şeması 2015’ten beri kullanımdan kaldırılmıştır; bu nedenle URL parçalarının Googlebot ile çalışacağına güvenemezsiniz.”

İstemci tarafı yönlendirmenin de aynı kanıt sorunu vardır: ilk yanıt JavaScript çalışana kadar 200 olarak kalabilir. Google, sunucu tarafı veya meta-refresh yönlendirmeleri mümkün olmadığında JavaScript yönlendirmelerini yalnızca geri dönüş olarak destekler. Statik durumu ve oluşturulmuş gezinmede gözlemlenen değişikliği ayrı ayrı raporlayın; denetimde HTTP durumunu yeniden yazmayın ve oluşturulmuş URL’deki her değişikliğe yönlendirme demeyin.

JavaScript veya CSS’yi robots.txt içinde engellemeyin

Google engellenen dosyalardaki veya engellenen sayfalardaki JavaScript’i oluşturmaz. Paketinizin (ya da paketin bulunduğu robots.txt, /_next/, /static/ dizininin) erişimini engelleyen bir /assets/ kuralı oluşturmayı bütünüyle bozabilir — Google kabuğu getirir, betikleri çalıştıramaz ve boş bir sayfayı dizine ekler. Engellenen bir şey olup olmadığını görmek için URL Inspection’ın sayfa kaynaklarını kontrol edin.

DOM eşliği ve aşamaya duyarlı robots yönergeleri

Ham HTML’nizi (Kaynağı Görüntüle) oluşturulmuş HTML ile (URL Inspection) karşılaştırın. Yalnızca oluşturulmuş HTML’de bulunan içerik, oluşturuluyorsa yine de dizine eklenebilir. İkisinde de bulunmayan içerik Google için mevcut değildir.

Google’ın doğrudan belgelediği bir aşama sırası riski vardır: “When Google encounters the noindex tag, it may skip rendering and JavaScript execution, which means using JavaScript to change or remove the robots meta tag from noindex may not work as expected.” (terjemahan) “Google noindex etiketiyle karşılaştığında oluşturmayı ve JavaScript yürütmesini atlayabilir; bu da robots meta etiketini noindex değerinden değiştirmek veya kaldırmak için JavaScript kullanmanın beklendiği gibi çalışmayabileceği anlamına gelir.” Ham HTML’niz JavaScript ile değiştirmeyi amaçladığınız ilk bir noindex değerini gönderiyorsa Google bu ham noindex değerine göre hareket edebilir ve onu kaldıracak betiği hiç çalıştırmayabilir.

Bunu evrensel bir “oluşturulmuş sürüm kazanır” kuralına dönüştürmeyin. Uzlaştırma alana özeldir:

AlanHam/oluşturulmuş karşılaştırma neyi ortaya koyabilir
Ana içerik ve bağlantılarOluşturma başarılı olursa Google oluşturma sırasında üretilen içeriği ve gerçek <a href> bağlantılarını kullanabilir. Ham HTML’de bulunması bu bağımlılığı azaltır.
Başlık ve açıklamaGoogle JavaScript ile ayarlanan meta verileri işleyebilir, ancak başlık bağlantıları ve snippet’ler çeşitli kaynaklardan seçilir. Her iki durumu da gösterin; oluşturulmuş, ilk veya son değerin garanti edildiğini iddia etmeyin.
Robots yönergeleriHam noindex Google’ın oluşturmayı atlamasına neden olabilir; bu nedenle JavaScript ile kaldırma girişimi görülmeyebilir. Sonradan kısıtlama eklemek, önceki kısıtlamanın iptal edildiğine kanıt değildir.
CanonicalGoogle’ın JavaScript rehberi, kaynakta bir değer ayarlayıp sonra JavaScript ile değiştirmemenizi söyler. Tek bir yöntem kullanın ve oluşturulmuş head’de tek bir bildirimi doğrulayın.
HTTP durumu ve yönlendirmeJavaScript alınmış yanıt durumunu değiştiremez. Statik durumu ve gözlemlenen oluşturulmuş gezinmeyi ayrı gerçekler olarak kaydedin.

Bu matris, denetçinin kaynak, oluşturulmuş sürüm, yanıt başlıkları ve gözlemlenen arama durumunu tek bir “etkin” değerde birleştirmek yerine ayrı tutmasının nedenidir.

İçeriği DOM’a koyan bir oluşturma modu seçin

JS SEO riskinin çoğu HTML’nin nasıl üretildiğine iner. Kısa sürüm şudur: SSR, statik/önceden oluşturma ve hydration içeriği DOM’a koyar (veya hızla koyar); bu da görünürlüğün oluşturucunun başarılı olmasına ne kadar bağlı olduğunu azaltır. Tam istemci tarafı oluşturma ise her seferinde oluşturmanın doğru ve zamanında tamamlanmasına daha fazla yük bindirir. Dinamik oluşturma eşdeğer bir seçenek değil, bir geçici çözümdür — Google’ın Aralık 2025’te güncellenen rehberinde dinamik oluşturmayı uzun vadeli çözüm yerine geçici çözüm olarak anlatır ve bunun yerine sunucu tarafı oluşturmayı, statik oluşturmayı veya hydration’ı önerir. JavaScript SEO rehberimde söylediğim gibi, “any kind of SSR, static rendering, and prerendering setup is going to be fine for search engines.” (terjemahan) “Her tür SSR, statik oluşturma ve önceden oluşturma kurulumu arama motorları için uygun olacaktır.” CSR, SSR, SSG, hydration, ISR, edge, streaming ve dinamik oluşturmayı içeren seçeneklerin tamamı ile ödünleşim tablosu rendering sayfasında. Google ayrıca sunucu tarafı oluşturmayı veya önceden oluşturmayı kullanıcılar ve tarayıcılar için iyi bir fikir olarak tanımlar. Evidence for this claim Google describes server-side rendering or pre-rendering as a good idea because it makes a website faster for users and crawlers. Scope: Google Search guidance for JavaScript sites; the source does not prescribe one framework or guarantee indexing. Confidence: high · Verified: Google Search Central: Understand the JavaScript SEO basics

Nasıl test edilir

Search Console’daki URL Inspection gerçeğin kaynağıdır: canlı bir test çalıştırın, ardından neyin yüklendiğini ve neyin başarısız olduğunu görmek için oluşturulmuş HTML’ye, ekran görüntüsüne ve sayfa kaynaklarına / konsol mesajlarına bakın. Rich Results Test hızlı bir oluşturulmuş HTML kontrolü sağlar. Ölçekli olarak, ham ve oluşturulmuş sürümleri sitenin tamamında karşılaştırmak için JavaScript çalıştıran bir tarayıcı kullanın (Ahrefs Site Audit, JS oluşturma modundaki Screaming Frog).

A render diff is diagnostic, not a score: investigate essential elements that appear only after JavaScript—or disappear after rendering.

An illustrative page has 1 title in both raw and rendered HTML, 18 headings in raw HTML and 19 rendered, 42 internal links in raw HTML and 71 rendered, 0 product descriptions in raw HTML and 12 rendered, and 6 canonical tags in raw HTML but only 1 rendered. These counts are synthetic.

JavaScript SEO için kötü değildir ve şeytan da değildir. SEO uzmanlarının çoğunun alışık olduğundan yalnızca farklıdır. Geliştiricilerinizle birlikte çalışın, önemli içeriğinizi DOM’a koyun ve neyin oluşturulduğuna dair hakem olarak varsayımlarınızı değil Google’ın kendi araçlarını kullanın.

Sırada ne var: JavaScript SEO kümesi

Bu hub haritadır. Aşağıdaki konuların her biri kendi derinlemesine incelemesidir:

Oluşturma ve mimari

  • Headless CMS için SEO — ayrıştırılmış ön yüzlerin tarama, oluşturma, meta verileri, site haritalarını ve canonical etiketlerini nasıl etkilediği; hangi oluşturma modunun seçileceği ve bilmeniz gereken headless’a özgü hata biçimleri.

Çerçeveye özel rehberler

  • React SEO — CSR öncelikli React’in neden dizine ekleme riski yarattığı, Google’ın React uygulamalarını nasıl oluşturduğu, React Router ve History API, meta etiketleri için react-helmet-async ve Next.js’e ne zaman başvurulacağı.
  • Angular SEO — Angular’ın SPA varsayılanları, @angular/ssr (Angular Universal’ın halefi), yerleşik Title ve Meta servisleri, önceden oluşturma ve modern Angular’da artımlı hydration.
  • Next.js SEO — Pages Router ile App Router, Metadata API, next/image ve CWV, ISR zamanlaması ve Googlebot, site haritaları ve en yaygın Next.js SEO hataları.
  • Nuxt SEO — varsayılan olarak SSR, useSeoMeta(), Nuxt’un oluşturma modları, @nuxtjs/seo modül ekosistemi ve Nuxt’un dizine eklenebilirlik bakımından yalın Vue ile karşılaştırması.
  • Vue SEO — Vue 3’ün varsayılan CSR’ı ve bunun tarayıcılar için anlamı, createWebHistory(), @unhead/vue, meta-çerçeve olmadan önceden oluşturma seçenekleri ve Nuxt’un doğru tercih olduğu durumlar.
  • Svelte SEO — Svelte ile SvelteKit karşılaştırması, SvelteKit’te varsayılan SSR, <svelte:head>, adapter-static + ssr: false tuzağı, adapter seçenekleri ve AI tarayıcılarının etkileri.
  • Astro SEO — varsayılan olarak sıfır JS, adalar mimarisi, @astrojs/sitemap, astro:assets, View Transitions ve History API, Server Islands geri dönüş davranışı ve Astro’nun Core Web Vitals avantajları.

Add an expert note

Pin an expert quote

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