Guide JavaScript SEO
Comment assurez-vous moteur de recherches peut explorer, rendre, et indexer JavaScript-dependent contenu — réel liens, parity, lazy-loading, infinite scroll, soft-404s, et testing.
1 indice probant sur cette page
- Outil en ligne associéRaw vs. Rendered HTML Checker
JavaScript SEO est à propos de si moteur de recherches peut explorer, rendre, et indexer contenu que dépend on JavaScript. Google peut exécuter JS — le échec modes sont plus spécifique: parity (raw vs rendu), interaction (Google ne fait pas scroll or click), state (le renderer est stateless), et timing. Garder liens as réel anchors, ne pas bloquer JS/CSS, préférer SSR/prerendering pour contenu que doit classer, et watch infinite scroll — a tall rendre viewport peut obtenir deux pages indexé as un.
TL;DR — JavaScript SEO est à propos de un question: peut moteur de recherches voir votre contenu? Modern sites construire a lot de lune page dans le navigateur avec JavaScript. Si votre important texte et liens seulement montrer up après scripts exécuter, vous devez confirmer Google peut encore reach les. Google généralement peut — le trouble est dans le details.
Ce que JavaScript SEO is
Lots de sites construire partie (or tout) de lune page dans votre navigateur avec JavaScript. Le serveur sends some HTML, et alors scripts exécuter à fill dans contenu, charger plus éléments, or swap views sans a complet page reload. JavaScript SEO est le pratique de making certain moteur de recherches peut encore explorer, rendre, et indexer que contenu.
Here’s the order choses se produire in pour Google:
- Explorer — Google downloads le raw HTML de votre URL.
- Rendre — Google exécute lune page’s JavaScript dans a navigateur à construire le finished page (le rendu étape).
- Indexer — Google lit que finished page et fichiers il away.
Google documents ces as the three principal phases pour processing JavaScript web apps.
Preuve à l’appui de cette affirmation Google processes JavaScript web apps in three main phases: crawling, rendering, and indexing; without rendering, Google might not see JavaScript-provided content. Portée : Google Search's processing of JavaScript pages; successful rendering does not guarantee indexing or ranking. Niveau de confiance : élevé · Vérifié : Google Search Central: Understand the JavaScript SEO basicsSi votre contenu seulement apparaît après JavaScript exécute, Google a à rendre lune page successfully avant il peut voir il. La plupart de le temps il fait. Quand il ne fait pas, votre contenu peut quietly go manquant depuis recherche.
The bon news premier
JavaScript n’est pas mauvais pour le SEO. Google exécute an up-à-date version de Chrome et peut execute le même JavaScript votre visitors faire. Le old fear — “Google ne peut pas lire JavaScript” — simplement n’est pas vrai anymore.
Ce que peut go incorrect is plus spécifique:
- Votre contenu nécessite a click or a scroll à charger, et Google ne fait pas click or scroll. Preuve à l’appui de cette affirmation 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. Portée : Google Search's documented rendering behavior for lazy-loaded content; other crawlers can behave differently. Niveau de confiance : élevé · Vérifié : Google Search Central: Fix lazy-loaded content
- Votre liens ne sont pas réel liens (ils sont buttons or click handlers), donc Google ne peut pas suivre les. Preuve à l’appui de cette affirmation Google can reliably discover links only when they are HTML anchor elements with an href attribute. Portée : Link discovery by Google Search; this does not claim that every discovered URL will be crawled or indexed. Niveau de confiance : élevé · Vérifié : Google Search Central: Make your links crawlable
- Vous accidentally bloqué votre JavaScript or CSS fichiers dans
robots.txt, donc Google ne peut pas rendre lune page correctement. - Lune page semble fine dans votre navigateur, mais le contenu jamais montre up dans Google’s rendu view.
The simple checklist
- Comparer votre raw HTML (right-click → View Source) avec le rendu HTML (Recherche Google Console’s Inspection d’URL outil). Si important contenu est manquant depuis le rendu view, c’est votre problème.
- Assurez-vous liens sont réel
<a href>liens, pas click handlers on a<div>. - ne pas bloquer votre JavaScript or CSS fichiers dans
robots.txt. - Si a fonctionnalité nécessite a click or scroll à charger contenu, assurez-vous que contenu est aussi reachable some autre façon.
- Pour contenu que absolutely doit classer, préférer rendu côté serveur or a static/prerendered construire, où le contenu est déjà dans le raw HTML. Preuve à l’appui de cette affirmation Google describes server-side rendering or pre-rendering as a good idea because it makes a website faster for users and crawlers. Portée : Google Search guidance for JavaScript sites; the source does not prescribe one framework or guarantee indexing. Niveau de confiance : élevé · Vérifié : Google Search Central: Understand the JavaScript SEO basics
Vouloir le deeper version — le réel échec modes, le infinite-scroll trap que obtient deux pages indexé as un, et Comment tester rendu HTML? Switch à le Avancé tab. Pour comment Google’s renderer itself fonctionne et qui rendu setup à choisir, voir le rendu page.
TL;DR — Google peut exécuter votre JavaScript, donc “peut Google lire JS?” est le incorrect question. Le échec modes sont parity (raw vs. rendu DOM), interaction (Google ne fait pas scroll or click), state (le renderer est stateless), et timing. Garder liens as réel
<a href>anchors, ne pas bloquer JS/CSS, lazy-charger on viewport pas interaction, retourner réel statuses pour client-side 404s, et remember a rawnoindexpeut empêcher rendu avant JavaScript peut supprimer il. Combine directives que étaient en réalité processed, mais ne faites pas assume a universal raw/rendu winner. Watch infinite scroll surtout: a tall rendre viewport peut trigger le loader et merge deux URLs dans un indexé page. Pour le renderer internals et qui rendu mode à pick, voir rendu.
Peut Google lire JavaScript? Oui — c’est pas le question
Three stages exécuter left à correct: explorer, rendre, et indexer. Le rendre stage branches dans four échec modes: parity, où le rendu DOM peut pas match expectations; interaction, où contenu exige a scroll or click; state, où contenu relies on cookies or storage que le renderer clears; et timing, où contenu est deferred behind lent JavaScript.
© Patrick Stox LLC · CC BY 4.0 ·
«Google processes JavaScript apps in three phases: “Google processes JavaScript web apps in three main phases: 1. Crawling 2. Rendering 3. Indexing.” The middle phase runs your JS in an evergreen, headless Chrome to build the DOM that gets indexed. “Rendering is important because websites often rely on JavaScript to bring content to the page, and without rendering Google might not see that content.”
Preuve à l’appui de cette affirmation Google processes JavaScript web apps in three main phases: crawling, rendering, and indexing; without rendering, Google might not see JavaScript-provided content. Portée : Google Search's processing of JavaScript pages; successful rendering does not guarantee indexing or ranking. Niveau de confiance : élevé · Vérifié : Google Search Central: Understand the JavaScript SEO basics» (Traduction) (Résumé en français de la section vingt-deux, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«So Google can run your JavaScript. The useful questions are more specific: » (Traduction) (Résumé en français de la section vingt-trois, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Parity — does the rendered DOM actually contain what you think it does? » (Traduction) (Résumé en français de la section vingt-quatre, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.) «- Interaction — does anything require a scroll/click Google won’t perform? » (Traduction) (Résumé en français de la section vingt-quatre, sous-partie deux : le texte source est conservé pour vérification lors de la relecture francophone.) «- State — are you relying on cookies/localStorage the stateless renderer clears? » (Traduction) (Résumé en français de la section vingt-quatre, sous-partie trois : le texte source est conservé pour vérification lors de la relecture francophone.) «- Timing — is critical content deferred behind slow or late JavaScript? » (Traduction) (Résumé en français de la section vingt-quatre, sous-partie quatre : le texte source est conservé pour vérification lors de la relecture francophone.)
«On timing specifically: Google queues a crawled page (one that returned a 200) for
rendering, and “the page may stay on this queue for a few seconds, but it can take
longer than that.” There’s no published fixed delay or timeout — and a page that
returns a non-200 status, or that starts out with a noindex directive, can skip the
render queue rather than wait for JavaScript to change it.
» (Traduction) (Résumé en français de la section vingt-cinq, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«The mechanics of how Google renders — the Web Rendering Service, statelessness, caching, the “two waves” myth — live on the rendering page. Here I’ll focus on the practical problems and fixes. » (Traduction) (Résumé en français de la section vingt-six, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«## Links must be real <a href> anchors
» (Traduction) (Résumé en français de la section vingt-sept, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«This is the single most common JS-SEO bug. “Google can only discover your links if
they are <a> HTML elements with an href attribute.” A clickable <div> with an
onclick handler is invisible to Google as a link — it won’t be followed, and pages
that depend on it for discovery can go uncrawled. It’s perfectly fine to inject
links with JavaScript, as long as they end up as real <a href> anchors in the
rendered DOM. Those rendered anchors are parsed after JavaScript runs, though —
landing in the rendered DOM makes a link discoverable, it’s not a promise that the
URL gets crawled, indexed, or treated the same as a link present in the raw HTML.
» (Traduction) (Résumé en français de la section vingt-huit, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«## Lazy-loaded and interaction-gated content » (Traduction) (Résumé en français de la section vingt-neuf, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«The renderer doesn’t behave like a curious user: “Google Search does not interact with your page.” No scrolling, no clicking, no hovering. So any content that only loads on one of those events won’t be seen. » (Traduction) (Résumé en français de la section trente, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
Google’s guidance: charger contenu quand il enters le viewport, pas quand le utilisateur acts —
“assurez-vous que votre lazy-loading implementation charge tout pertinent contenu whenever
il est visible dans le viewport,” et “ne pas ajouter lazy-loading à contenu que est
probable à être immédiatement visible quand a utilisateur opens une page.” Utiliser IntersectionObserver
or native loading="lazy" pour images — jamais a scroll or click handler — donc le
contenu charge during a normal rendre.
Infinite scroll: quand two pages obtenir indexé as un
A normal navigateur viewport arrête après le premier page, mais Google's rendre viewport expands beaucoup taller. Le expansion reaches an infinite-scroll trigger, fires le loader sans a réel utilisateur scroll, et appends le suivant page dans le même DOM. Google alors indexes les deux pages' contenu sous un URL.
© Patrick Stox LLC · CC BY 4.0 ·
Ce est le un presque nobody explique, et c’est worth le entier section.
Googlebot peut rendre à a viewport considerably taller que a typical navigateur window. Google ne fait pas publish an exact rendre viewport size — et il peut modifier — donc ne pas design contre a spécifique number; tester votre propre implementation à la place. Ce que matters est le mechanism: si votre infinite-scroll loader fires fondé on scroll position or viewport height, a taller-que-attendu rendu viewport peut trigger le loader during rendu itself — et le suivant article or produit page’s contenu obtient appended dans le même DOM. Maintenant deux distinct URLs’ contenu a été rendu ensemble, et Google peut indexer les as un page. Dans mon propre experience, “occasionally, deux pages obtenir indexé as un” — j’ai avait pages reported as “non indexée” que étaient en réalité indexé as partie de un autre page (généralement le previous post dans le feed), parce que “quand Google resized le viewport à être plus long … il triggered le infinite scroll et chargé un autre article dans quand il était rendu.” Confirmer si votre propre setup fait ce par checking Inspection d’URL’s rendu HTML pour une page vous’d expect à arrêter court — ne pas assume a size et ne pas assume vous êtes sûr.
Là are two layers to getting ce correct.
«Make infinite scroll search-friendly in the first place. Support paginated loading
underneath the infinite scroll. Each chunk should have “its own persistent, unique
URL,” the content on each URL should stay the same each time it loads, you should
avoid relative parameters like ?date=yesterday, you should “link sequentially to
the individual URLs so that search engines can discover the URLs in a paginated set,”
and when a new chunk loads on scroll you should “update the displayed URL using the
History API.” Use real <a href> pagination links and unique URLs — “don’t use URL
fragment identifiers” (the part after a #) for page numbers, because Google ignores
them. As I say in my JavaScript SEO guide, “if you have an infinite scroll setup, I still recommend a
paginated page version so that Google can still crawl properly.”
» (Traduction) (Résumé en français de la section trente-sept, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
Si a buggy loader est actively merging pages, le fastest corriger est blunt: “bloquer le JavaScript fichier que handles le infinite scrolling donc le functionality ne peut pas trigger.” Si le loader ne peut pas exécuter during rendre, il ne peut pas append le suivant page’s contenu, et chaque URL renders as itself à nouveau.
Soft-404s après client-side routing
Unique-page apps peut swap contenu sans modification le code d’état HTTP, donc a
“pas trouvé” view peut encore retourner 200. Google peut classify que réponse as a
soft 404 après evaluating le renvoyé contenu, mais a static récupérer alone ne peut pas prove
que Google a fait que classification. Deux corrections:
navigate avec le History API, et pour a genuine pas-trouvé state soit route à a
URL que renvoie a réel 404 status or ajouter a noindex balise. Et ne pas lean on URL
fragments pour routing — “le AJAX-exploration scheme a été deprecated since 2015, donc
vous pouvez’t rely on URL fragments à fonctionner avec Googlebot.”
A client-side redirection a le même evidence problème: le initial réponse peut remain
200 jusqu’à JavaScript exécute. Google prend en charge JavaScript redirections seulement as a fallback
quand serveur-side or meta-refresh redirections ne sont pas possible. Rapport le static status
et le observed rendu navigation séparément; ne faites pas rewrite le HTTP status dans le
audit or appel chaque rendu URL modifier a redirection.
ne pas bloquer JavaScript or CSS dans robots.txt
Google ne va pas rendre JavaScript depuis bloqué fichiers or on bloqué pages. A
robots.txt règle que disallows votre bundle (or le /_next/, /static/, /assets/
directory il lives dans) peut break rendu entirely — Google récupère le shell, ne peut pas
exécuter le scripts, et indexes an vide page. Vérifier Inspection d’URL’s page resources
pour n’importe quoi bloqué.
DOM parity et stage-aware robots directives
Comparer votre raw HTML (View Source) contre le rendu HTML (Inspection d’URL). Contenu que seulement exists dans le rendu HTML encore indexes — si il renders. Contenu dans aucun ne fait pas exist à Google.
il y a un stage-order risque Google documents directement: “Quand Google encounters le
noindex balise, il peut skip rendu et JavaScript execution, qui signifie en utilisant
JavaScript à modifier or supprimer le robots meta balise depuis noindex peut pas fonctionner as
attendu.” Si votre raw HTML ships an initial noindex vous meant à swap out avec
JavaScript, Google peut act on que raw noindex et jamais exécuter le script que voudrait
ont supprimé il.
Ne faites pas turn ce into a universal “rendered wins” rule. Reconciliation is field-specific:
«| Field | What the raw/rendered comparison can establish |
| --- | --- |
| Main content and links | Google can use content and real <a href> links produced during rendering if rendering succeeds. Raw availability reduces that dependency. |
| Title and description | Google can process JavaScript-set metadata, but title links and snippets are selected from several sources. Show both states; do not claim the rendered, first, or last value is guaranteed. |
| Robots directives | A raw noindex may cause Google to skip rendering, so JavaScript removal may never be seen. Adding restrictions later is not evidence that an earlier restriction was cancelled. |
| Canonical | Google’s JavaScript guidance says not to set one value in source and then change it with JavaScript. Use one method and verify one rendered-head declaration. |
| HTTP status and redirect | JavaScript cannot change the response status already received. Record the static status and any observed rendered navigation as separate facts. |
» (Traduction) (Résumé en français de la section quarante-huit, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
Que matrix est pourquoi an auditor devrait garder source, rendu, réponse-header, et observed-recherche state distinct plutôt que collapsing les dans un “effective” valeur.
Pick a rendering mode que puts content in the DOM
La plupart JS-SEO risque comes bas à comment le HTML est produced. La version courte: SSR, static/prerendering, et hydration tout put contenu dans (or quickly dans) le DOM, qui reduces comment beaucoup votre visibility dépend on le renderer succeeding; complet client-side rendu laisse plus riding on rendu completing correctement, on temps, chaque temps. Dynamic rendu est a workaround, pas a peer option — as de Google’s guidance dernier mis à jour December 2025, il décrit dynamic rendu as a workaround plutôt que a à long terme solution et recommends rendu côté serveur, static rendu, or hydration à la place. As Je put il dans mon JavaScript SEO guide, “quelconque kind de SSR, static rendu, et prerendering setup est going à être fine pour moteur de recherches.” Le complet menu — CSR, SSR, SSG, hydration, ISR, edge, streaming, et dynamic rendu — avec a trade-off tableau est on le rendu page. Google séparément décrit rendu côté serveur or pre-rendu as a bon idea pour utilisateurs et robots d’exploration. Preuve à l’appui de cette affirmation Google describes server-side rendering or pre-rendering as a good idea because it makes a website faster for users and crawlers. Portée : Google Search guidance for JavaScript sites; the source does not prescribe one framework or guarantee indexing. Niveau de confiance : élevé · Vérifié : Google Search Central: Understand the JavaScript SEO basics
Comment tester
Inspection d’URL dans Search Console est le source de truth: exécuter a actif tester, alors regarder à le rendu HTML, le screenshot, et le page resources / console messages à voir ce que chargé et ce que failed. Le Résultats enrichis Tester donne a rapide rendu-HTML vérifier. À scale, utiliser a robot d’exploration que executes JavaScript (Ahrefs Site Audit, Screaming Frog dans JS-rendu mode) à diff raw vs. rendu à travers le site.
An illustrative page a 1 titre dans les deux raw et rendu HTML, 18 titres dans raw HTML et 19 rendu, 42 lien internes dans raw HTML et 71 rendu, 0 produit descriptions dans raw HTML et 12 rendu, et 6 balise canonicals dans raw HTML mais seulement 1 rendu. Ces counts sont synthetic.
JavaScript n’est pas mauvais pour le SEO, et c’est pas evil. c’est simplement différent depuis ce que nombreux SEOs sont utilisé à. Fonctionner avec votre developers, obtenir votre important contenu dans le DOM, et let Google’s propre outils — pas votre assumptions — être le arbiter de ce que rendu.
Où to go suivant: the JavaScript SEO cluster
Ce hub is the map. Chaque topic ci-dessous is its propre deep dive:
Rendu et architecture
- SEO pour a CMS headless — comment decoupled frontends affecter exploration, rendu, metadata, sitemaps, et balise canonicals; qui rendu mode à pick; et le headless-spécifique échec modes vous devez know.
«Framework-specific guides
» (Traduction) (Résumé en français de la section cinquante-neuf, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«- React SEO — why CSR-first React creates indexing risk, how Google renders React apps, React Router and History API, react-helmet-async for meta tags, and when to reach for Next.js.
» (Traduction) (Résumé en français de la section cinquante-neuf, sous-partie deux : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Angular SEO — Angular’s SPA defaults, @angular/ssr (Angular Universal’s successor), the built-in Title and Meta services, prerendering, and incremental hydration in modern Angular.
» (Traduction) (Résumé en français de la section cinquante-neuf, sous-partie trois : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Next.js SEO — Pages Router vs App Router, the Metadata API, next/image and CWV, ISR timing and Googlebot, sitemaps, and the most common Next.js SEO mistakes.
» (Traduction) (Résumé en français de la section cinquante-neuf, sous-partie quatre : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Nuxt SEO — SSR by default, useSeoMeta(), Nuxt’s rendering modes, the @nuxtjs/seo module ecosystem, and how Nuxt compares to plain Vue for indexability.
» (Traduction) (Résumé en français de la section cinquante-neuf, sous-partie cinq : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Vue SEO — Vue 3’s CSR default and what that means for crawlers, createWebHistory(), @unhead/vue, prerendering options without a meta-framework, and when Nuxt is the right call.
» (Traduction) (Résumé en français de la section cinquante-neuf, sous-partie six : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Svelte SEO — Svelte vs SvelteKit, SSR by default in SvelteKit, <svelte:head>, the adapter-static + ssr: false trap, adapter choices, and AI crawler implications.
» (Traduction) (Résumé en français de la section cinquante-neuf, sous-partie sept : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Astro SEO — zero-JS by default, islands architecture, @astrojs/sitemap, astro:assets, View Transitions and History API, Server Islands fallback behavior, and Astro’s Core Web Vitals advantages.
» (Traduction) (Résumé en français de la section cinquante-neuf, sous-partie huit : le texte source est conservé pour vérification lors de la relecture francophone.)
AI summary
A condensed prendre on the Avancé version:
- “Peut Google lire JS?” est le incorrect question — il peut. Le échec modes sont parity (raw vs. rendu), interaction (Google ne fait pas scroll/click), state (stateless renderer), et timing.
- Timing a aucun fixed delay — Google queues a
200page pour rendu et peut wait “a few seconds” or plus long, avec aucun publié timeout; a non-200 status or an initialnoindexpeut skip le rendre queue entirely. - Liens doit être réel
<a href>anchors —onclickon a<div>est invisible as a lien. Injecting liens avec JS est fine si ils fin up as anchors, mais rendu anchors sont parsed après JS exécute — discoverable, pas a explorer/indexer guarantee. - Lazy-charger on le viewport, pas interaction — Google “ne fait pas interact avec votre page.” Utiliser IntersectionObserver / native lazy-charger; ne pas gate contenu behind scroll or click.
- Infinite scroll peut merge deux pages dans un — Googlebot peut rendre à a taller
viewport que a typical navigateur (aucun exact publié size — tester votre propre setup),
et que gap peut trigger le loader et append le suivant page’s contenu. Corriger:
paginated URLs + réel
<a href>liens + History API; si a loader est merging pages, bloquer son JS fichier. - Soft-404s après client-side routing — retourner a réel
404ornoindex; ne pas indexer vide shells; ne pas rely on URL fragments (AJAX-exploration deprecated 2015). - ne pas bloquer JS/CSS dans robots.txt — Google ne va pas rendre depuis bloqué fichiers.
noindexpeut bloquer son propre removal — Google peut skip rendu quand il voit an initialnoindex, donc JS meant à supprimer il peut jamais exécuter.- DOM parity + stage order (robots meta balises) — diff raw vs. rendu, mais remember
an initial raw
noindexpeut arrêter rendu. Appliquer combination règles seulement à directives en réalité processed; tester canonical parity sous son propre règles. - Rendu mode changements dependency, pas résultat — SSR/static/prerender/hydration put contenu dans le DOM sooner, reducing reliance on rendu; complet CSR relies on il la plupart; dynamic rendu est a dated Google workaround, pas a peer option. Complet breakdown on le rendu page.
- Tester avec Inspection d’URL (rendu HTML + screenshot + console), Résultats enrichis Tester, et a JS-rendu robot d’exploration.
Documentation officielle
Primary-source documentation from the moteur de recherches.
- Comprendre le JavaScript SEO basics — le three phases, crawlable liens, et testing rendu HTML.
- Corriger Recherche-related JavaScript problèmes — soft-404 handling, le History API, et renderer constraints.
- Corriger lazy-chargé contenu — charger on viewport (pas interaction), et recherche-friendly infinite scroll.
- Ecommerce pagination et incremental page chargement — unique URLs,
<a href>liens, et pourquoi Google ignores fragment identifiers. - Dans-Depth Guide à Comment Recherche Google Fonctionne — où rendu sits dans explorer → indexer → servir.
Bing / Microsoft
- bingbot Series: JavaScript, Dynamic Rendu, et Cloaking. Oh Mon! — Bing’s prendre on rendu JS et dynamic rendu.
Quotes from the source
On-le-record statements depuis Google (plus a quelques depuis mon propre writing). Chaque recherche-moteur lien est a deep lien que jumps à le quoted passage on le page source.
Google — rendering & liens
«- “Google processes JavaScript web apps in three main phases: 1. Crawling 2. Rendering 3. Indexing.” Jump to quote » (Traduction) (Résumé en français de la section soixante-seize, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.) «- “Google can only discover your links if they are <a> HTML elements with an href attribute.” Jump to quote » (Traduction) (Résumé en français de la section soixante-seize, sous-partie deux : le texte source est conservé pour vérification lors de la relecture francophone.) «- “Rendering is important because websites often rely on JavaScript to bring content to the page, and without rendering Google might not see that content.” Jump to quote » (Traduction) (Résumé en français de la section soixante-seize, sous-partie trois : le texte source est conservé pour vérification lors de la relecture francophone.) «- “The page may stay on this queue for a few seconds, but it can take longer than that.” — on render-queue timing, no fixed delay published. Jump to quote » (Traduction) (Résumé en français de la section soixante-seize, sous-partie quatre : le texte source est conservé pour vérification lors de la relecture francophone.) «- “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.” Jump to quote » (Traduction) (Résumé en français de la section soixante-seize, sous-partie cinq : le texte source est conservé pour vérification lors de la relecture francophone.)
Google — interaction, lazy-charger & infinite scroll
«- “Google Search does not interact with your page.” Jump to quote » (Traduction) (Résumé en français de la section soixante-dix-huit, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.) «- “…loads all relevant content whenever it is visible in the viewport.” Jump to quote » (Traduction) (Résumé en français de la section soixante-dix-huit, sous-partie deux : le texte source est conservé pour vérification lors de la relecture francophone.) «- “Give each chunk its own persistent, unique URL.” — search-friendly infinite scroll. Jump to quote » (Traduction) (Résumé en français de la section soixante-dix-huit, sous-partie trois : le texte source est conservé pour vérification lors de la relecture francophone.) «- “Don’t use URL fragment identifiers (the text after a # in a URL) for page numbers in a collection. Google ignores fragment identifiers.” Jump to quote » (Traduction) (Résumé en français de la section soixante-dix-huit, sous-partie quatre : le texte source est conservé pour vérification lors de la relecture francophone.)
Google — soft-404 & routing
«- “We recommend using the History API to load different views.” Jump to quote » (Traduction) (Résumé en français de la section quatre-vingts, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
Patrick Stox (my propre fonctionner — JavaScript SEO: A Definitive Guide)
«- On meta robots tags specifically: “With meta robots tags, Google is always going to take the most restrictive option it sees — no matter the location… Google will choose the most restrictive statements between HTML and the rendered version of a page.” » (Traduction) (Résumé en français de la section quatre-vingt-deux, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.) «- “If you have an infinite scroll setup, I still recommend a paginated page version so that Google can still crawl properly.” » (Traduction) (Résumé en français de la section quatre-vingt-deux, sous-partie deux : le texte source est conservé pour vérification lors de la relecture francophone.) «- On the merge: “occasionally, two pages get indexed as one” — caused when “Google resized the viewport to be longer … it triggered the infinite scroll and loaded another article in when it was rendering.” The fix: “block the JavaScript file that handles the infinite scrolling so the functionality can’t trigger.” » (Traduction) (Résumé en français de la section quatre-vingt-deux, sous-partie trois : le texte source est conservé pour vérification lors de la relecture francophone.)
Remarque: a couple de pages sources rendre via JavaScript or sont reproduced via secondary coverage; citations étaient verified contre le brief’s 2026-06-23 research mais confirmer contre le actif pages avant treating quelconque relayed citation as final.JavaScript-SEO checklist
A rapide réussir to confirmer Google peut render and index votre JS-dependent content:
- Important contenu apparaît dans le rendu HTML (vérifier Inspection d’URL, pas simplement View Source).
- Liens sont réel
<a href>anchors — pasonclickhandlers on<div>/<span>. - JavaScript et CSS fichiers sont pas bloqué dans
robots.txt. - Aucun contenu est gated behind a click, scroll, or hover (Google ne fait pas
interact); lazy-charger on viewport via IntersectionObserver or
loading="lazy". - Ci-dessus-le-fold contenu est pas lazy-chargé.
- Robots directives match entre raw et rendu HTML (aucun JS injecting
noindex) — Google takes le la plupart restrictive. - Client-side route changements que hit a manquant resource retourner a réel
404ornoindex(aucun soft-404 shells). - Infinite scroll a a paginated version avec unique
<a href>URLs et History API mises à jour — et n’est pas merging pages à a tall viewport. - Contenu que doit classer utilise SSR / static / prerendering, pas complet CSR (voir le rendu page).
- vous avez spot-checked le rendu screenshot et console erreurs dans URL Inspection’s actif tester.
The mental models
1. “Peut Google exécuter mon JS?” est le incorrect question. Il peut. Le réel questions sont à propos de parity, interaction, state, et timing:
- Parity — fait le rendu DOM contenir ce que vous think il fait?
- Interaction — fait n’importe quoi exiger a scroll/click Google ne va pas perform?
- State — sont vous relying on cookies/localStorage le stateless renderer clears?
- Timing — est critical contenu deferred behind lent/late JS?
2. Si c’est pas dans le rendu DOM, il ne fait pas exist. View Source montre le raw HTML; Inspection d’URL montre le rendu DOM. Indexer decisions sont fait on le rendu DOM — donc c’est le artifact à vérifier, chaque temps.
3. Réel liens or aucun liens.
Discovery rides on <a href> anchors. Click handlers, buttons, et JS navigation que
jamais produces an anchor sont dead ends pour exploration.
4. Design pour a bot que jamais touches lune page. Aucun scroll, aucun click, aucun hover. Si content nécessite an action to apparaître, assume Google won’t voir it — charger it on viewport à la place.
5. Tester pour le tall-viewport trap dans infinite scroll. Googlebot peut rendre à a viewport taller que a typical navigateur (aucun fixed size est publié, donc ne pas design contre a spécifique number), donc a scroll/height-triggered loader peut fire during rendre et merge le suivant page dans. Design pour il: paginated URLs + réel liens + History API; si c’est actively merging, bloquer le loader’s JS.
6. Let le outils arbitrate. Votre navigateur n’est pas Googlebot. Inspection d’URL’s rendu HTML, screenshot, et console sont le source de truth — pas “it looks fine on my machine.”
JavaScript-SEO gotchas — cheat sheet
| Chose | Ce que en réalité se produit |
|---|---|
robots.txt bloque votre JS/CSS | Google ne va pas rendre depuis bloqué fichiers — peut break le entier page |
Raw index + JS-injected noindex | Google obeys le la plupart restrictive → noindex wins |
Lien as onclick on a <div> | Pas discoverable — doit être <a href> |
| Contenu charge on scroll/click | Pas chargé — Google ne fait pas interact; utiliser viewport lazy-charger |
URL fragment (#page=2) pour pagination | Ignored — utiliser a réel unique URL |
Client-side 404 avec 200 status | Soft-404 risque — retourner réel 404 or noindex |
| Infinite scroll à a tall viewport | Peut merge deux URLs dans un indexé page — paginate + bloquer loader si nécessaire |
Qui rendering mode? (dependency on rendering succeeding)
| Mode | Dependency |
|---|---|
| Static / prerender (SSG) | Lowest — contenu est déjà dans le HTML |
| Rendu côté serveur (SSR) | Faible — contenu est dans le HTML per requête |
| Hydration (isomorphic) | Faible — contenu lands dans le DOM quickly |
| Complet rendu côté client (CSR) | Highest — contenu seulement exists après rendu succeeds |
| Dynamic rendu | Workaround seulement — Google calls ce a stopgap, pas a corriger |
Ce n’est pas a guarantee de résultat — SSR/SSG/hydration encore besoin à rendre correctement et réussir chaque autre vérifier dans ce article. Complet breakdown (ISR, edge, streaming, dynamic rendu, et le trade-offs) on le rendu page.
Voir ce que Googlebot voit
«Rendering bugs hide in the gap between the raw HTML (what the server sends) and the rendered HTML (what exists after JS runs). A few quick command-line checks before you reach for a full crawler. » (Traduction) (Résumé en français de la section cent huit, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«Fetch the raw HTML (what comes back before any JS runs) » (Traduction) (Résumé en français de la section cent neuf, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
macOS / Linux:
# Raw HTML as the server sends it — this is the "first fetch"
curl -sL -A "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" \
https://example.com/page/ -o raw.html
# Is your important text actually in the raw HTML? (empty result = JS-dependent)
grep -o "Your headline text" raw.htmlWindows (PowerShell):
$ua = "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
Invoke-WebRequest -Uri "https://example.com/page/" -UserAgent $ua -OutFile raw.html
Select-String -Path raw.html -Pattern "Your headline text"Si le texte est manquant depuis raw.html mais visible dans votre navigateur, c’est étant ajouté
par JavaScript — donc il dépend on rendu. (Pour le rendu HTML, utiliser URL
Inspection’s “View Exploré Page → rendu HTML,” or a headless-Chrome robot d’exploration — a
plain curl ne peut pas exécuter JS.)
Confirmer vous aren’t blocking JS/CSS in robots.txt
macOS / Linux:
curl -sL https://example.com/robots.txt | grep -iE "disallow.*\.(js|css)|Disallow:\s*/(_next|static|assets|dist)"Windows (PowerShell):
(Invoke-WebRequest "https://example.com/robots.txt").Content |
Select-String -Pattern "Disallow.*\.(js|css)","Disallow:\s*/(_next|static|assets|dist)"A Disallow que matches votre JavaScript or CSS signifie Google ne peut pas rendre lune page
correctement — presque toujours a mistake. (Inspection d’URL listes bloqué page resources aussi;
le grep simplement catches le obvious ones rapide.)
Outils pour debugging JavaScript SEO
«See the difference between raw HTML and what Google renders with Render Gap: » (Traduction) (Résumé en français de la section cent vingt, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
- Paste le complet URL de lune page vous vouloir à tester — a JavaScript-heavy template page montre le la plupart.
- Clair le anti-abuse vérifier et press Tester page; il récupère le raw HTML premier et seulement renders dans headless Chrome quand que HTML semble comme an vide shell.
- Lire le colour-coded verdict, alors scan le Initial HTML vs Rendu DOM tableau pour lignes flagged modifié.
- Switch à le Raw vs rendu diff tab à voir line-par-line ce que JavaScript ajouté or supprimé.
- Inspection d’URL (Recherche Google Console) — le source de truth. Exécuter a actif tester, alors view le rendu HTML, le screenshot, le page resources (ce que chargé vs. ce que était bloqué), et JavaScript console messages.
- Résultats enrichis Tester — a rapide façon à vérifier rendu HTML et données structurées pour a URL sans verifying le site.
- Chrome DevTools — comparer View Source (raw HTML) avec le Elements panel (rendu DOM); le Console surfaces JS erreurs que peut blank out contenu.
- JavaScript-rendu robots d’exploration — Ahrefs Site Audit et Screaming Frog SEO Spider (JS-rendu mode) execute JS donc vous pouvez diff raw vs. rendu à scale.
- View-rendu-source outils — navigateur extensions que montrer le rendu DOM side-par-side avec raw HTML pour rapide spot vérifications.
- Serveur log analysis — confirmer Googlebot est en réalité fetching votre JS/CSS resources (voir log fichier analysis).
«## Prompts for JavaScript SEO diagnosis » (Traduction) (Résumé en français de la section cent vingt-cinq, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«### Compare raw and rendered HTML » (Traduction) (Résumé en français de la section cent vingt-six, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«Paste the raw response and the rendered DOM for the same URL. Remove customer data and tokens first. » (Traduction) (Résumé en français de la section cent vingt-sept, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
Act as a technical SEO reviewer. Compare RAW_HTML and RENDERED_HTML below. Report only
meaningful differences in title, meta robots, canonical, headings, body copy,
structured data, and crawlable <a href> links. For each difference, label its likely
indexing impact, show the exact conflicting snippets, and give a verification step.
Do not infer content that is not present.
RAW_HTML:
[paste]
RENDERED_HTML:
[paste]Triage a route sample
Review this CSV of JavaScript routes with columns URL, HTTP_STATUS, RAW_TITLE,
RENDERED_TITLE, RAW_CANONICAL, RENDERED_CANONICAL, RAW_WORDS, RENDERED_WORDS. Group
failures into shared-shell duplicates, restrictive-directive conflicts, soft 404s,
and likely render timeouts. Rank groups by affected URL count. Return the exact rows
that support each conclusion and a test to confirm it; do not invent thresholds.
[paste CSV] Validate a JavaScript SEO modifier
Prove route content exists avant JavaScript
Tester à exécuter: Récupérer representative routes avec curl et inspect la réponse
corps. Attendu résultat: Chaque réponse contient son unique titre, principal titre,
copy, et crawlable liens. Échec interpretation: Le deployment encore sert a
shared app shell. Monitoring window: Immediate. Rollback trigger: A formerly
serveur-visible route becomes dependent on rendu.
Prove directives agree à travers processing stages
Tester à exécuter: Comparer raw HTML avec Inspection d’URL’s rendu HTML pour robots et
balise canonicals. Attendu résultat: Un prévu directive définir apparaît dans les deux, avec
aucun plus-restrictive valeur dans le raw shell. Échec interpretation: JavaScript est
trying à overwrite an indexation signal aussi late. Monitoring window: Immediate dans
local rendu; après recrawl dans Search Console. Rollback trigger: noindex or
an incorrect canonical apparaît à soit stage.
Prove liens remain crawlable
Tester à exécuter: Disable JavaScript et inspect navigation à representative routes.
Attendu résultat: Destinations remain dans réel anchor href attributs. Échec
interpretation: Client handlers, pas liens, propre discovery. Monitoring window:
Immediate. Rollback trigger: Important routes disappear depuis le lien graph quand
scripts échouer.
Ressources utiles
Mon connexe writing
- JavaScript SEO: A Definitive Guide — mon complet guide à rendu, DOM parity, le la plupart-restrictive-directive règle, infinite scroll, et le deux-pages-as-un problème. Ce article est le condensed, source-linked version.
- Le Beginner’s Guide à SEO technique — où JavaScript SEO fits dans le bigger picture.
Mon speaking
- Comment Recherche Fonctionne (SlideShare) — mon walkthrough de exploration, rendu, indexation, et classement. (Mon standing disclaimer s’applique: “This is my understanding of systems… not going to be 100% complete or accurate.”)
Depuis others
- r/TechSEO — le community pour debugging rendre/indexer problèmes.
- web.dev — Rendu on le Web — le canonical explainer de rendu trade-offs depuis le Chrome team.
- Recherche Google Central — JavaScript SEO — official primary-source docs on le three-phase traiter, crawlable liens, et testing rendu HTML.
- Onely — JavaScript SEO hub — deep technique posts on rendu, deux-waves indexation, et JS SEO auditing depuis a specialist agency.
- Martin Splitt’s JavaScript SEO playlist — le official Google video series walking via chaque JS SEO concept, produced par Google’s web ecosystem team.
- Moteur de recherche Journal — JavaScript SEO coverage — industry news et practitioner guides on JS rendu problèmes as ils emerge.
Podcasts
- Recherche Off le Record (Recherche Google Relations) — Martin Splitt, John Mueller, et Gary Illyes regularly cover JavaScript SEO et rendu depuis le à l’intérieur. Listen
Videos
- Recherche Google Central (YouTube) — Martin Splitt’s JavaScript SEO series is the meilleur official video walkthrough of how Google handles votre JS. Channel
Stats worth citing
«- Current official framing: no fixed delay. Google’s own documentation (updated
2026-03-04) says a crawled 200 page “may stay on this queue for a few seconds,
but it can take longer than that” — there’s no published fixed delay or timeout,
and pages that return a non-200 status or start out with noindex may skip
rendering entirely.
Jump to quote
» (Traduction) (Résumé en français de la section cent cinquante-sept, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Historical data point (dated) — ~5 second median render delay. In earlier
conference remarks, Google staff (Martin Splitt and Tom Greenaway) described pages
reaching the renderer at a median of ~5 seconds, with the 90th percentile in
minutes — not the “weeks” the old fear implied. I cite this in my
JavaScript SEO guide. Treat it as a
historical data point from that talk, not a current published metric — Google
hasn’t republished it as an ongoing figure, and the queue-timing quote above is the
current official framing.
» (Traduction) (Résumé en français de la section cent cinquante-sept, sous-partie deux : le texte source est conservé pour vérification lors de la relecture francophone.)
«- “Two waves of indexing” is fading, per Martin Splitt (2019 remarks). In an
August 2019 conversation with John Mueller, Splitt said two-wave indexing “play[s]
less and less of a role” as rendering gets cheaper and crawling, rendering, and
indexing converge — with no timeline given for when it might stop entirely.
Coverage This is
Splitt’s characterization from that specific conversation, not a dated, citable
Google spec — use it as directional context, not a current guarantee either way.
» (Traduction) (Résumé en français de la section cent cinquante-sept, sous-partie trois : le texte source est conservé pour vérification lors de la relecture francophone.)
Faire rendering an architecture decision avant launch: si revenue pages depend on JavaScript pour principal content or liens, vérifier ce que moteur de recherches recevoir au lieu de assuming le navigateur experience is suffisant.
- Rendu côté client, interaction-gated contenu, et nonstandard liens sont structural risques que coût plus à correct après launch.
- Raw-versus-rendu parity testing montre si important contenu, liens, et status signaux survive le explorer, rendre, et indexer traiter.
- Server-rendered or static principal content with JavaScript utilisé seulement pour enhancement may exiger aucun special remediation.
A court, template-level diagnostic avant a construire or replatform peut empêcher plus tard re-architecture et focus spending on le routes avec trafic organique à risque.
Risque en cas d’inaction : Moteur de recherches may miss principal content, interaction-gated elements, or lien internes, leaving revenue pages under-indexed même though ils fonctionner pour utilisateurs in a navigateur.
À demander à votre équipe : Ce que faire notre top revenue templates retourner avant JavaScript exécute, et ont nous verified leur contenu et liens dans rendu sortie avant release?
Google processes JavaScript apps via exploration, rendu, et indexation.
Preuve à l’appui de cette affirmation Google processes JavaScript web apps in three main phases: crawling, rendering, and indexing; without rendering, Google might not see JavaScript-provided content. Portée : Google Search's processing of JavaScript pages; successful rendering does not guarantee indexing or ranking. Niveau de confiance : élevé · Vérifié : Google Search Central: Understand the JavaScript SEO basics Il généralement explore liens quand ils
sont anchors avec href attributs. Preuve à l’appui de cette affirmation Google can reliably discover links only when they are HTML anchor elements with an href attribute. Portée : Link discovery by Google Search; this does not claim that every discovered URL will be crawled or indexed. Niveau de confiance : élevé · Vérifié : Google Search Central: Make your links crawlable
Google décrit rendu côté serveur or pre-rendu as a bon idea pour utilisateurs et
robots d’exploration. Preuve à l’appui de cette affirmation Google describes server-side rendering or pre-rendering as a good idea because it makes a website faster for users and crawlers. Portée : Google Search guidance for JavaScript sites; the source does not prescribe one framework or guarantee indexing. Niveau de confiance : élevé · Vérifié : Google Search Central: Understand the JavaScript SEO basics Recherche Google aussi
ne fait pas interact avec une page à trigger contenu. Preuve à l’appui de cette affirmation 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. Portée : Google Search's documented rendering behavior for lazy-loaded content; other crawlers can behave differently. Niveau de confiance : élevé · Vérifié : Google Search Central: Fix lazy-loaded content
Journal des modifications
Mis à jour le 27 juil. 2026.
Résumé éditorial et détails enregistrés des changements.Détails des changements
-
Les notes détaillées des changements sont actuellement disponibles en anglais.
Comparaison complète indisponible — aucun instantané antérieur n’a été archivé pour cette révision.
Mis à jour le 18 juil. 2026.
Résumé éditorial et détails enregistrés des changements.Détails des changements
-
Les notes détaillées des changements sont actuellement disponibles en anglais.
-
Les notes détaillées des changements sont actuellement disponibles en anglais.
-
Les notes détaillées des changements sont actuellement disponibles en anglais.
-
Les notes détaillées des changements sont actuellement disponibles en anglais.
Comparaison complète indisponible — aucun instantané antérieur n’a été archivé pour cette révision.