JavaScript-SEO

So stellen Sie sicher, dass Suchmaschinen JavaScript-abhängige Inhalte crawlen, rendern und indexieren können – echte Links, Parität, Lazy Loading, Infinite Scroll, Soft-404s und Tests.

Erstveröffentlicht: 23. Juni 2026 · Zuletzt aktualisiert: 22. Aug. 2026 · Fortgeschritten
Sprachen
1 Evidenzsignal auf dieser Seite

Bei JavaScript-SEO geht es darum, ob Suchmaschinen Inhalte crawlen, rendern und indexieren können, die von JavaScript abhängen. Google kann JS ausführen – die Fehlerbilder sind spezifischer: Parität (roh vs. gerendert), Interaktion (Google scrollt oder klickt nicht), Zustand (der Renderer ist zustandslos) und Timing. Halten Sie Links als echte Anker, blockieren Sie JS/CSS nicht, bevorzugen Sie SSR/Prerendering für Inhalte, die ranken müssen, und achten Sie auf Infinite Scroll – ein hohes Render-Viewport kann dazu führen, dass zwei Seiten als eine indexiert werden.

TL;DR — Google kann Ihr JavaScript ausführen, also ist „Kann Google JS lesen?“ die falsche Frage. Die Fehlermodi sind Parität (rohes vs. gerendertes DOM), Interaktion (Google scrollt oder klickt nicht), Zustand (der Renderer ist zustandslos) und Timing. Halten Sie Links als echte <a href>-Anker, blockieren Sie JS/CSS nicht, laden Sie lazy auf Viewport statt Interaktion, geben Sie echte Statuscodes für clientseitige Fehlerseiten zurück, und denken Sie daran, dass ein rohes noindex das Rendern verhindern kann, bevor JavaScript es entfernen kann. Kombinieren Sie Direktiven, die tatsächlich verarbeitet wurden, aber gehen Sie nicht von einem universellen roh/gerendert-Gewinner aus. Achten Sie besonders auf unendliches Scrollen: Ein hoher Render-Viewport kann den Loader auslösen und zwei URLs zu einer indexierten Seite zusammenführen. Für die Renderer-Interna und welchen Rendering-Modus Sie wählen sollten, siehe Rendering.

Kann Google JavaScript lesen? Ja — das ist nicht die Frage

Google can run your JavaScript — the real risks are parity, interaction, state, and timing. Quelle: /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 verarbeitet JavaScript-Apps in drei Phasen: “Google processes JavaScript web apps in three main phases: 1. Crawling 2. Rendering 3. Indexing.” (Übersetzung) „Google verarbeitet JavaScript-Web-Apps in drei Hauptphasen: 1. Crawling 2. Rendering 3. Indexing.“ Die mittlere Phase führt Ihr JS in einem Evergreen-Headless-Chrome aus, um das DOM zu erstellen, das indexiert wird. “Rendering is important because websites often rely on JavaScript to bring content to the page, and without rendering Google might not see that content.” (Übersetzung) „Rendering ist wichtig, weil Websites oft auf JavaScript angewiesen sind, um Inhalte auf die Seite zu bringen, und ohne Rendering könnte Google diese Inhalte möglicherweise nicht sehen.“

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

Google kann Ihr JavaScript also ausführen. Die nützlichen Fragen sind spezifischer:

  • Parität — enthält das gerenderte DOM tatsächlich das, was Sie denken?
  • Interaktion — erfordert etwas ein Scrollen/Klicken, das Google nicht ausführt?
  • Zustand — verlassen Sie sich auf Cookies/localStorage, die der zustandslose Renderer löscht?
  • Timing — wird kritischer Inhalt hinter langsamem oder spätem JavaScript zurückgestellt?

Zum Timing im Speziellen: Google stellt eine gecrawlte Seite (die einen 200-Status zurückgibt) in die Warteschlange für das Rendering, und “the page may stay on this queue for a few seconds, but it can take longer than that.” (Übersetzung) „Die Seite kann einige Sekunden in dieser Warteschlange bleiben, aber es kann auch länger dauern.“ Es gibt keine veröffentlichte feste Verzögerung oder Zeitüberschreitung — und eine Seite, die einen Nicht-200-Status zurückgibt oder die mit einer noindex-Direktive beginnt, kann die Rendering-Warteschlange überspringen, anstatt darauf zu warten, dass JavaScript sie ändert.

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

Die Mechanik wie Google rendert — der Web-Rendering-Dienst, Zustandslosigkeit, Caching, der Mythos der „zwei Wellen“ — finden Sie auf der Seite Rendering. Hier konzentriere ich mich auf die praktischen Probleme und Lösungen.

Das ist der häufigste JS-SEO-Fehler. “Google can only discover your links if they are <a> HTML elements with an href attribute.” (Übersetzung) „Google kann Ihre Links nur entdecken, wenn es sich um <a>-HTML-Elemente mit einem href-Attribut handelt.“ Ein klickbares <div> mit einem onclick-Handler ist für Google als Link unsichtbar — es wird nicht verfolgt, und Seiten, die für die Entdeckung davon abhängen, können ungecrawlt bleiben. Es ist völlig in Ordnung, Links mit JavaScript zu injizieren, solange sie im gerenderten DOM als echte <a href>-Anker enden. Diese gerenderten Anker werden jedoch nach der Ausführung von JavaScript geparst — im gerenderten DOM zu landen macht einen Link auffindbar, ist aber keine Garantie dafür, dass die URL gecrawlt, indexiert oder genauso behandelt wird wie ein Link im rohen HTML.

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

Lazy-Loaded und interaktionsabhängige Inhalte

Der Renderer verhält sich nicht wie ein neugieriger Benutzer: “Google Search does not interact with your page.” (Übersetzung) „Google Search interagiert nicht mit Ihrer Seite.“ Kein Scrollen, kein Klicken, kein Schweben. Inhalte, die nur bei einem dieser Ereignisse geladen werden, werden also nicht gesehen.

Googles Leitfaden: Laden Sie Inhalte, wenn sie in den Viewport gelangen, nicht wenn der Benutzer handelt — “make sure that your lazy-loading implementation loads all relevant content whenever it is visible in the viewport,” (Übersetzung) „stellen Sie sicher, dass Ihre Lazy-Loading-Implementierung alle relevanten Inhalte lädt, wann immer sie im Viewport sichtbar sind,“ und “don’t add lazy-loading to content that is likely to be immediately visible when a user opens a page.” (Übersetzung) „fügen Sie Lazy-Loading nicht zu Inhalten hinzu, die wahrscheinlich sofort sichtbar sind, wenn ein Benutzer eine Seite öffnet.“ Verwenden Sie IntersectionObserver oder natives loading="lazy" für Bilder — niemals einen Scroll- oder Klick-Handler — damit die Inhalte während eines normalen Renderings geladen werden.

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

Unendliches Scrollen: wenn zwei Seiten als eine indexiert werden

Google's tall render viewport can trigger an infinite-scroll loader and merge two pages into one indexed URL. Quelle: /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 ·

Das ist das, was fast niemand erklärt, und es ist den gesamten Abschnitt wert.

Googlebot kann mit einem Viewport rendern, das deutlich höher ist als ein typisches Browserfenster. Google veröffentlicht keine genaue Render-Viewport-Größe – und sie kann sich ändern –, also planen Sie nicht für eine bestimmte Zahl; testen Sie stattdessen Ihre eigene Implementierung. Entscheidend ist der Mechanismus: Wenn Ihr Infinite-Scroll-Loader basierend auf Scrollposition oder Viewport-Höhe auslöst, kann ein höheres als erwartetes Rendering-Viewport den Loader während des Renderns selbst auslösen – und der Inhalt des nächsten Artikels oder der nächsten Produktseite wird in dasselbe DOM eingefügt. Jetzt wurden die Inhalte zweier verschiedener URLs zusammen gerendert, und Google kann sie als eine Seite indexieren. Meiner eigenen Erfahrung nach gilt: “occasionally, two pages get indexed as one” (Übersetzung) „Gelegentlich werden zwei Seiten als eine indexiert.“ – ich hatte Seiten, die als “not indexed” gemeldet wurden, aber tatsächlich als Teil einer anderen Seite indexiert waren (normalerweise des vorherigen Beitrags im Feed), weil “when Google resized the viewport to be longer … it triggered the infinite scroll and loaded another article in when it was rendering.” (Übersetzung) „Als Google den Viewport verlängerte, löste dies das unendliche Scrollen aus und lud beim Rendern einen weiteren Artikel.“ Bestätigen Sie, ob Ihr eigenes Setup dies tut, indem Sie das gerenderte HTML der URL Inspection für eine Seite prüfen, von der Sie erwarten, dass sie vorher endet – gehen Sie nicht von einer Größe aus und gehen Sie nicht davon aus, dass Sie sicher sind.

Es gibt zwei Ebenen, um das richtig zu machen.

Machen Sie Infinite Scroll von vornherein suchmaschinenfreundlich. Unterstützen Sie paginiertes Laden unter dem Infinite Scroll. Jeder Abschnitt sollte “its own persistent, unique URL” (Übersetzung) „eine eigene dauerhafte, eindeutige URL“ haben. Der Inhalt jeder URL sollte bei jedem Laden gleich bleiben. Vermeiden Sie relative Parameter wie ?date=yesterday und “link sequentially to the individual URLs so that search engines can discover the URLs in a paginated set” (Übersetzung) „verlinken Sie die einzelnen URLs der Reihe nach, damit Suchmaschinen die URLs eines paginierten Satzes entdecken können“. Wenn ein neuer Abschnitt beim Scrollen geladen wird, sollten Sie “update the displayed URL using the History API” (Übersetzung) „die angezeigte URL mit der History API aktualisieren“. Verwenden Sie echte <a href>-Paginierungslinks und eindeutige URLs. “Don’t use URL fragment identifiers” (Übersetzung) „Verwenden Sie keine URL-Fragmentbezeichner“ (der Teil nach einem #) für Seitenzahlen, weil Google sie ignoriert. Wie ich in meinem JavaScript-SEO-Leitfaden sage: “if you have an infinite scroll setup, I still recommend a paginated page version so that Google can still crawl properly.” (Übersetzung) „Bei unendlichem Scrollen empfehle ich weiterhin eine paginierte Seitenversion, damit Google ordnungsgemäß crawlen kann.“

Wenn ein fehlerhafter Loader Seiten aktiv zusammenführt, ist der schnellste Fix direkt: “block the JavaScript file that handles the infinite scrolling so the functionality can’t trigger.” (Übersetzung) „Blockieren Sie die JavaScript-Datei für das unendliche Scrollen, damit die Funktion nicht ausgelöst werden kann.“ Wenn der Loader während des Renderns nicht ausgeführt werden kann, kann er den Inhalt der nächsten Seite nicht anhängen, und jede URL rendert wieder als sie selbst.

Soft-404s nach clientseitigem Routing

Single-Page-Apps können Inhalte austauschen, ohne den HTTP-Statuscode zu ändern, sodass eine „Nicht gefunden“-Ansicht weiterhin 200 zurückgeben kann. Google kann diese Antwort nach der Auswertung des zurückgegebenen Inhalts als Soft-404 einstufen, aber ein statischer Abruf allein kann nicht beweisen, dass Google diese Einstufung vorgenommen hat. Zwei Korrekturen: navigieren Sie mit der History API, und für einen echten Not-Found-Zustand leiten Sie entweder auf eine URL um, die einen echten 404-Status zurückgibt, oder fügen Sie ein noindex-Tag hinzu. Und verlassen Sie sich nicht auf URL- Fragmente für das Routing – “the AJAX-crawling scheme has been deprecated since 2015, so you can’t rely on URL fragments to work with Googlebot.” (Übersetzung) „Das AJAX-Crawling-Schema ist seit 2015 veraltet; deshalb können Sie sich bei Googlebot nicht auf URL-Fragmente verlassen.“

Eine clientseitige Weiterleitung hat dasselbe Beweisproblem: Die erste Antwort kann 200 bleiben, bis JavaScript ausgeführt wird. Google unterstützt JavaScript-Weiterleitungen nur als Fallback, wenn serverseitige oder Meta-Refresh-Weiterleitungen nicht möglich sind. Melden Sie den statischen Status und die beobachtete gerenderte Navigation getrennt; schreiben Sie den HTTP-Status im Audit nicht um und bezeichnen Sie nicht jede Änderung der gerenderten URL als Weiterleitung.

Blockieren Sie JavaScript oder CSS nicht in robots.txt

Google rendert kein JavaScript aus blockierten Dateien oder auf blockierten Seiten. Eine robots.txt-Regel, die Ihr Bundle (oder das Verzeichnis /_next/, /static/, /assets/, in dem es liegt) nicht zulässt, kann das Rendering vollständig brechen – Google ruft die Hülle ab, kann die Skripte nicht ausführen und indexiert eine leere Seite. Prüfen Sie in der URL Inspection die Seitenressourcen auf blockierte Elemente.

DOM-Parität und stufenbewusste robots-Direktiven

Vergleichen Sie Ihr rohes HTML (Seitenquelltext anzeigen) mit dem gerenderten HTML (URL-Prüfung). Inhalte, die nur im gerenderten HTML vorhanden sind, werden trotzdem indexiert – wenn sie gerendert werden. Inhalte, die in keinem von beiden vorhanden sind, existieren für Google nicht.

Es gibt ein von Google direkt dokumentiertes Risiko der Phasenreihenfolge: “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.” (Übersetzung) „Wenn Google auf das noindex-Tag stößt, kann es das Rendering und die JavaScript-Ausführung überspringen, was bedeutet, dass die Verwendung von JavaScript zum Ändern oder Entfernen des Robots-Meta-Tags von noindex möglicherweise nicht wie erwartet funktioniert.“ Wenn Ihr rohes HTML ein anfängliches noindex enthält, das Sie mit JavaScript austauschen wollten, kann Google auf dieses rohe noindex reagieren und das Skript, das es entfernt hätte, nie ausführen.

Machen Sie daraus keine universelle Regel „gerendert gewinnt“. Die Abgleichung ist feldabhängig:

FeldWas der Roh-/Rendert-Vergleich feststellen kann
Hauptinhalte und LinksGoogle kann Inhalte und echte <a href>-Links verwenden, die beim Rendering erzeugt werden, wenn das Rendering erfolgreich ist. Die Verfügbarkeit im Roh-HTML reduziert diese Abhängigkeit.
Titel und BeschreibungGoogle kann per JavaScript gesetzte Metadaten verarbeiten, aber Titellinks und Snippets werden aus mehreren Quellen ausgewählt. Zeigen Sie beide Zustände; behaupten Sie nicht, dass der gerenderte, erste oder letzte Wert garantiert ist.
Robots-AnweisungenEin rohes noindex kann dazu führen, dass Google das Rendering überspringt, sodass eine JavaScript-Entfernung möglicherweise nie gesehen wird. Das spätere Hinzufügen von Einschränkungen ist kein Beweis dafür, dass eine frühere Einschränkung aufgehoben wurde.
CanonicalIn Googles JavaScript-Leitfaden wird empfohlen, nicht einen Wert im Quelltext zu setzen und ihn dann mit JavaScript zu ändern. Verwenden Sie eine Methode und überprüfen Sie eine Deklaration im gerenderten Head.
HTTP-Status und WeiterleitungJavaScript kann den bereits empfangenen Antwortstatus nicht ändern. Erfassen Sie den statischen Status und jede beobachtete gerenderte Navigation als getrennte Fakten.

Diese Matrix ist der Grund, warum ein Prüfer Quelle, gerenderten Zustand, Antwort-Header und beobachteten Suchzustand getrennt halten sollte, anstatt sie zu einem einzigen „effektiven“ Wert zusammenzufassen.

Wählen Sie einen Rendering-Modus, der Inhalte in das DOM bringt

Das meiste JS-SEO-Risiko hängt davon ab, wie das HTML erzeugt wird. Kurz gesagt: SSR, statisches Rendering/Prerendering und Hydration bringen Inhalte in (oder schnell in) das DOM, wodurch die Sichtbarkeit weniger davon abhängt, dass der Renderer erfolgreich ist; vollständiges clientseitiges Rendering lässt mehr davon abhängen, dass das Rendering korrekt, rechtzeitig und jedes Mal abgeschlossen wird. Dynamisches Rendering ist ein Workaround, keine gleichwertige Option – laut Googles Leitfaden, zuletzt aktualisiert im Dezember 2025, beschreibt es dynamisches Rendering als Workaround und nicht als langfristige Lösung und empfiehlt stattdessen serverseitiges Rendering, statisches Rendering oder Hydration. Wie ich es in meinem JavaScript-SEO-Leitfaden formuliert habe: “any kind of SSR, static rendering, and prerendering setup is going to be fine for search engines.” (Übersetzung) „Jede Art von SSR, statischem Rendering und Prerendering-Setup ist für Suchmaschinen in Ordnung.“ Die vollständige Übersicht – CSR, SSR, SSG, Hydration, ISR, Edge, Streaming und dynamisches Rendering – mit einer Vergleichstabelle finden Sie auf der Seite Rendering. Google beschreibt serverseitiges Rendering oder Pre-Rendering separat als gute Idee für Nutzer und Crawler. 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

So testen Sie

Die URL-Prüfung in der Search Console ist die Quelle der Wahrheit: Führen Sie einen Live-Test durch und sehen Sie sich dann das gerenderte HTML, den Screenshot und die Seitenressourcen / Konsolenmeldungen an, um zu sehen, was geladen wurde und was fehlgeschlagen ist. Der Rich-Results-Test bietet eine schnelle Prüfung des gerenderten HTML. Im großen Maßstab verwenden Sie einen Crawler, der JavaScript ausführt (Ahrefs Site Audit, Screaming Frog im JS-Rendering-Modus), um Roh- und gerenderten Zustand über die gesamte Website zu vergleichen.

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 ist nicht schlecht für SEO und es ist nicht böse. Es ist nur anders als das, was viele SEOs gewohnt sind. Arbeiten Sie mit Ihren Entwicklern zusammen, bringen Sie Ihre wichtigen Inhalte in das DOM und lassen Sie Googles eigene Tools – nicht Ihre Annahmen – darüber entscheiden, was gerendert wurde.

Wohin als Nächstes: der JavaScript-SEO-Cluster

Dieser Hub ist die Karte. Jedes Thema unten ist ein eigener Deep Dive:

Rendering und Architektur

  • SEO für ein Headless-CMS – wie entkoppelte Frontends Crawling, Rendering, Metadaten, Sitemaps und kanonische Tags beeinflussen; welche Rendering-Methode Sie wählen sollten; und die Headless-spezifischen Fehlermodi, die Sie kennen müssen.

Framework-spezifische Anleitungen

  • React SEO – warum CSR-first React ein Indexierungsrisiko darstellt, wie Google React-Apps rendert, React Router und History API, react-helmet-async für Meta-Tags und wann Sie zu Next.js greifen sollten.
  • Angular SEO – Angulars SPA-Standardeinstellungen, @angular/ssr (der Nachfolger von Angular Universal), die integrierten Title- und Meta-Dienste, Prerendering und inkrementelle Hydration in modernem Angular.
  • Next.js SEO – Pages Router vs. App Router, die Metadata API, next/image und CWV, ISR-Timing und Googlebot, Sitemaps und die häufigsten Next.js-SEO-Fehler.
  • Nuxt SEO – SSR standardmäßig, useSeoMeta(), Nuxts Rendering-Modi, das @nuxtjs/seo-Modul-Ökosystem und wie Nuxt im Vergleich zu reinem Vue für die Indexierbarkeit abschneidet.
  • Vue SEO – Vue 3s CSR-Standard und was das für Crawler bedeutet, createWebHistory(), @unhead/vue, Prerendering-Optionen ohne Meta-Framework und wann Nuxt die richtige Wahl ist.
  • Svelte SEO – Svelte vs. SvelteKit, SSR standardmäßig in SvelteKit, <svelte:head>, die adapter-static + ssr: false-Falle, Adapter-Optionen und Auswirkungen auf KI-Crawler.
  • Astro SEO – standardmäßig null JS, Insel-Architektur, @astrojs/sitemap, astro:assets, View Transitions und History API, Server-Islands-Fallback-Verhalten und Astros Core-Web-Vitals-Vorteile.

Add an expert note

Pin an expert quote

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