Guide Gatsby SEO
Comment optimize a Gatsby site pour recherche — Gatsby's four rendu paths (SSG, DSG, SSR, client-seulement) et ce que chaque signifie pour crawlability, le modern Head API vs legacy react-helmet, sitemaps, canonicals, image SEO, le React-bundle CWV coût, et le Netlify-era maintenance risque.
1 indice probant sur cette page
- Outil en ligne associéCanonicalization Checker
Gatsby a four rendu options: SSG (le par défaut — pages pre-rendu à static HTML à gatsby construire), DSG (deferred static generation on premier requête), SSR (rendu côté serveur per requête via Gatsby Functions), et client-seulement routes (rendu entirely dans le navigateur). La plupart Gatsby sites lean on SSG, qui donne robots d’exploration entièrement rendu HTML on le premier récupérer avec aucun rendu queue à wait on — a strong SEO baseline, far meilleur que a pure client-side React app. Mais que baseline n’est pas universal: DSG et SSR pages generate HTML à l’extérieur le construire étape et besoin leur propre production vérifications, et client-seulement routes ne devrait pas être assumed à expose route-spécifique contenu dans le initial HTML à tout. Whichever chemin sert une page, Gatsby encore ships le complet React runtime (~200KB+) et hydrates il client-side — a Core Web Vitals coût, pas a crawlability un. Le actuel façon à manage metadata est le built-dans Gatsby Head API (v4.19+), qui fonctionne à travers tout four rendu paths et remplace gatsby-plugin-react-helmet. Le recurring pitfalls sont double balise canonicals, draft/orphan pages leaking dans sitemaps, manquant texte alternatif, le production-seulement sitemap gotcha, DSG/SSR/client-seulement routes needing explicit sitemap et production-behavior vérifications, et a framework whose maintenance a slowed sharply since Netlify's 2023 acquisition.
«> TL;DR — By default, Gatsby builds your pages into finished HTML before
anyone visits (this mode is called SSG), so when Google shows up, your content is already in the page — no waiting for JavaScript. That gives Gatsby a strong SEO head start. Gatsby also has a few other rendering options for pages that need to generate later or use per-request data — worth knowing if your site uses them. The catch: it still sends a big React bundle to the browser, which can slow your page down, and you still have to set up meta tags, sitemaps, canonicals, and image alt text yourself. » (Traduction) (Résumé en français de la section trois, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
Ce que Gatsby is
«Gatsby is a website framework built on React. Most React apps build the
page in your browser after the JavaScript loads — which is a problem for SEO,
because a search engine fetching the page first sees a near-empty shell. Gatsby
flips that around by default. When you run gatsby build, it turns most pages into
a complete HTML file ahead of time. So when Google, Bing, or a reader requests one
of those pages, the content is right there in the HTML. Preuve à l’appui de cette affirmation Gatsby creates static HTML files during its production build. Portée : Gatsby static generation; client-side behavior can still be added. Niveau de confiance : élevé · Vérifié : Gatsby: Builds and deploys
» (Traduction) (Résumé en français de la section cinq, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
Que par défaut mode rend Gatsby a static site generator (SSG), et c’est pourquoi Gatsby est généralement bon pour le SEO out de le box — beaucoup meilleur que a plain React app. Gatsby aussi lets individual pages opt dans three autre rendu modes — generating on premier requête, generating per-requête on a serveur, or rendu entirely dans le navigateur — qui le Avancé tab covers, since chaque un changements ce que a robot d’exploration en réalité voit.
Pourquoi personnes worry à propos de Gatsby and SEO (and pourquoi ils mostly shouldn’t)
Le la plupart courant myth est “Gatsby est mauvais pour SEO parce que il utilise React.” c’est faux. Le React partie exécute après lune page est déjà construit et delivered — il simplement rend lune page interactive. Le texte, liens, et titres a moteur de recherche cares à propos de sont déjà dans le HTML depuis le commencer.
Donc Gatsby clears le biggest hurdle automatiquement. Ce que il ne fait pas faire est tout de SEO pour vous.
Ce que vous encore have to définir up
A Gatsby site is pas automatically optimized. Vous encore besoin to:
- Ajouter titre balises et meta descriptions à chaque page (le modern façon est le built-dans Gatsby Head API). Preuve à l’appui de cette affirmation Gatsby's Head API lets pages export document-head metadata. Portée : Gatsby Head API. Niveau de confiance : élevé · Vérifié : Gatsby: Head API
- Generate a sitemap (le
gatsby-plugin-sitemapplugin). - Définir URL canoniques donc duplicate versions de une page ne pas compete.
- Écrire texte alternatif pour images — Gatsby’s image outil resizes et optimizes images automatiquement, mais il fait pas écrire texte alternatif pour vous.
The un chose que surprises personnes
Gatsby encore ships le complet React runtime (~200KB+) à le navigateur on chaque page. Il ne fait pas hurt si vous obtenir indexé — le HTML est déjà complet — mais il peut lent votre page bas, qui affecte Core Web Vitals (Google’s page-experience speed metrics). Lighter frameworks comme Astro send presque aucun JavaScript par comparaison.
Un plus chose à know si vous êtes choosing Gatsby aujourd’hui: Netlify acquired Gatsby dans 2023, et active development a slowed a lot since. Pour an existing Gatsby site c’est fine; pour a brand-new project, c’est worth weighing.
Vouloir le technique version — le Head API vs le old react-helmet plugin, le sitemap et canonical gotchas, le React-bundle CWV trade-off, et le honest prendre on Gatsby’s future? Switch à le Avancé tab.
TL;DR — Gatsby a four rendu options — SSG (le par défaut), DSG, SSR, et client-seulement routes — et ils ne pas tout put contenu dans le raw HTML le même façon. SSG pre-renders à static HTML à construire temps (
gatsby build), donc contenu est dans le raw HTML avant le premier robot d’exploration requête — aucun Web Rendu Service, aucun rendu queue. DSG defers generation à le premier requête; SSR generates per requête on a serveur; client-seulement routes rendre rien route-spécifique jusqu’à le navigateur exécute le JavaScript. Whichever chemin sert une page, Gatsby hydrates a complet React bundle (~200KB+) on le client, qui est a Core Web Vitals coût, pas a crawlability un. Le actuel metadata approche est le built-dans Gatsby Head API (v4.19+), qui fonctionne à travers tout four rendu paths et remplacegatsby-plugin-react-helmet. Le recurring échec modes sont double canonical balises (Head API + react-helmet les deux firing), draft/orphan pages leaking dans sitemaps, le production-seulement sitemap gotcha, manquant texte alternatif onGatsbyImage, trailing-slash inconsistency, et DSG/SSR/client-seulement routes que jamais obtenu a production vérifier. Et le elephant dans le room: since Netlify’s 2023 acquisition, Gatsby’s maintenance a slowed sharply.
Gatsby’s four rendu options — et pourquoi ils matter pour le SEO
Google processes JavaScript pages dans three phases — exploration, alors rendu, alors indexation — et rendu se produit dans a séparé réussir depuis a queue en utilisant headless Chromium. Google’s propre guidance est blunt à propos de pourquoi vous devezn’t lean on que: “Serveur-side or pre-rendu est encore a great idea parce que il rend votre site web faster pour utilisateurs et robots d’exploration, et pas tout bots peut exécuter JavaScript.”
A Gatsby site isn’t universally build-time static HTML — Gatsby supports four distinct rendering paths, choisi par page or template Preuve à l’appui de cette affirmation gatsby build writes production output, including generated HTML, to the public directory. Portée : Gatsby production builds. Niveau de confiance : élevé · Vérifié : Gatsby CLI: build :
- SSG (Static Site Generation) — le par défaut.
gatsby buildemits entièrement rendu static HTML dans/publicpour lune page. Googlebot’s premier-wave raw-HTML récupérer déjà contient le complet contenu — texte, liens, metadata. Ce est le sûr, faible-risque chemin, et c’est ce que la plupart Gatsby pages utiliser. - DSG (Deferred Static Generation). Generation est deferred jusqu’à lune page’s premier requête plutôt que happening pour chaque page à construire temps — utile pour sites avec huge numbers de faible-traffic pages où a complet construire voudrait être lent. Le construire alone ne fait pas tell vous ce que a robot d’exploration voit; lune page’s HTML ne fait pas exist jusqu’à quelque chose requêtes il, donc premier-requête et mis en cache behavior besoin leur propre vérifier, pas simplement a construire log.
- SSR (Rendu côté serveur). Lune page est rendu per requête, en utilisant requête-time données, via Gatsby Functions. Parce que il exécute à requête temps, SSR pages besoin production vérifications a construire-time page ne fait pas: réponse status, mise en cache headers, timeout behavior, et ce que a robot d’exploration voit on an vide or erreur réponse — none de que est visible depuis a successful local construire.
- Client-seulement routes. Ces rendre entirely dans le navigateur et ne pas obtenir route-spécifique contenu dans le initial HTML — le même profile as a plain client-side React app. ne pas assume Google (or quelconque robot d’exploration) voit n’importe quoi page-spécifique ici jusqu’à JavaScript exécute; treat ces as JS-dependent par design, qui est fine pour gated/authenticated contenu mais incorrect pour n’importe quoi vous vouloir indexé avec contenu.
React hydration (ReactDOMClient.hydrateRoot()) se produit client-side on top de
whichever de ces produced le HTML, purely à ajouter interactivity — que partie est
le même regardless de rendu chemin, et est a séparé concern depuis qui chemin
generated lune page (plus on hydration coût ci-dessous).
«Contrast SSG/DSG/SSR with a pure client-side React app, which serves an empty
<div id="root"> and depends on the browser (or the renderer) to build the page.
Most Gatsby pages ship meaningful HTML by default — that’s the indexability win,
and it’s real, but it’s a per-page property, not a framework guarantee. Rendering
options and image tooling don’t guarantee Core Web Vitals, indexing, or rankings on
their own; verify the actual production output for whichever path a route uses.
» (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.)
Le catch avec SSG/DSG/SSR alike est a performances un, pas a crawlability un: Gatsby ships le complet React runtime à chaque page et re-hydrates il. Plus on que, et le Astro comparaison, ci-dessous.
«## Gatsby Head API vs gatsby-plugin-react-helmet » (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 important “are you doing it the modern way?” question in Gatsby SEO. » (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.)
Le legacy approche — gatsby-plugin-react-helmet. Pour années, le standard façon
à définir <title>, meta description, et autre head balises était le react-helmet
library plus ce plugin. Le plugin’s job était à donner react-helmet SSR
prise en charge — sans il, votre titre/meta balises voudrait seulement apparaître après JS execution,
pas dans le raw HTML, qui defeats le point. Il fonctionne, mais il a connu problèmes avec
React Hooks et concurrent rendu, plus a background-tab titre bug vous patch avec
defer={false}.
Le modern approche — le Gatsby Head API (v4.19+). Gatsby maintenant a a built-dans
façon à ajouter head elements: a named Head export depuis quelconque page or template fichier. Preuve à l’appui de cette affirmation Gatsby pages and templates can export a named Head function to add head elements. Portée : Gatsby Head API. Niveau de confiance : élevé · Vérifié : Gatsby: Head API
export const Head = () => (
<>
<title>Page Title</title>
<meta name="description" content="..." />
</>
)Il receives utile props — location.pathname, params, data (depuis lune page’s
GraphQL requête), et pageContext — et il deduplicates balises que share an id
prop (dernier un wins), though running deux différent head-balise mechanisms à une fois
(Head API plus a leftover react-helmet appel) peut encore conflict même avec
deduplication. Il fonctionne seulement dans page fichiers et templates, pas dans arbitrary
components. Le advantages over react-helmet: aucun tiers bundle, aucun Provider
wrapper, deterministic balise order avec React 18 streaming. Utiliser le Head API pour tout
nouveau projects, et plan a migration pour existing ones.
Le Head API fonctionne le même façon à travers tout four rendu paths — SSG, DSG, SSR,
et client-seulement routes tout prise en charge a Head export. Ce que differs est quand son
sortie lands dans HTML a robot d’exploration peut récupérer: on SSG c’est baked dans à construire temps; on
DSG et SSR c’est generated à premier-requête or per-requête temps; on a client-seulement
route il n’est pas dans le initial HTML à tout. ne pas assume “Je ajouté a Head export”
est equivalent à “ce est dans le raw HTML pour chaque route” — vérifier le réel
production sortie (view-source: or curl) pour whichever chemin chaque route utilise,
pas simplement un representative page.
Le “meta tags in DevTools but not in source” bug. A classic Gatsby SEO symptom:
votre titre/meta balises montrer up dans Chrome DevTools mais sont manquant depuis view-source:.
Le causer est que DevTools montre le hydrated DOM (après JS exécute), pendant que view-source
montre le raw HTML. Si votre balises seulement apparaître dans DevTools, votre SEO component est
rendu client-side au lieu de étant baked dans Gatsby’s static sortie — généralement
parce que c’est utilisé as a regular component plutôt que as (or à l’intérieur) lune page’s Head
export. Toujours vérifier dans raw HTML, pas DevTools.
Wiring up an SEO component (the GraphQL données couche)
Gatsby’s données couche est GraphQL, et c’est comment vous feed metadata dans votre pages.
useStaticQuerypulls mondial defaults depuissiteMetadata(titre, description,siteUrl) défini dansgatsby-config.js.- Page-level GraphQL requêtes réussir a
dataprop straight à leHeadexport — aucun supplémentaire wiring nécessaire. - Le standard modèle est prop || siteMetadata fallback: utiliser le per-page valeur si il exists, sinon le site par défaut.
A Head export que takes page données semble comme:
export const Head = ({ data }) => (
<>
<title>{data.post.title}</title>
<meta name="description" content={data.post.excerpt} />
</>
) Sitemaps: gatsby-plugin-sitemap (et son traps)
Install gatsby-plugin-sitemap and configurer it in gatsby-config.js. A few choses
trip personnes up:
«- It generates sitemap-index.xml, not /sitemap.xml. Submit the index URL
in Google Search Console — don’t submit /sitemap.xml and expect it to resolve.
» (Traduction) (Résumé en français de la section quarante-trois, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«- It only runs in production builds. It does nothing in gatsby develop. To
test it, run gatsby build && gatsby serve. People file “my sitemap is missing”
reports that are really just “I never ran a production build.”
» (Traduction) (Résumé en français de la section quarante-trois, sous-partie deux : le texte source est conservé pour vérification lors de la relecture francophone.)
«- createLinkInHead: true by default adds the sitemap reference to the HTML
head automatically.
» (Traduction) (Résumé en français de la section quarante-trois, sous-partie trois : le texte source est conservé pour vérification lors de la relecture francophone.)
«- It always excludes /dev-404-page, /404, and
/offline-plugin-app-shell-fallback.
» (Traduction) (Résumé en français de la section quarante-trois, sous-partie quatre : le texte source est conservé pour vérification lors de la relecture francophone.)
«- <priority> and <changefreq> are ignored by Google — the plugin docs say so
directly. Focus on an accurate <lastmod> instead.
» (Traduction) (Résumé en français de la section quarante-trois, sous-partie cinq : le texte source est conservé pour vérification lors de la relecture francophone.)
«- entryLimit defaults to 45,000 URLs per file.
» (Traduction) (Résumé en français de la section quarante-trois, sous-partie six : le texte source est conservé pour vérification lors de la relecture francophone.)
Excluding drafts est votre job. Gatsby construit tout il trouve, donc draft
contenu sails straight dans le sitemap unless vous filter il. Faire que dans
gatsby-node.js avec a GraphQL filter (e.g. excluding entries sans a publish
date), pas par hiding il dans a React component — par alors c’est déjà construit et
listed.
DSG, SSR, et client-seulement routes besoin an explicit sitemap décision.
gatsby-plugin-sitemap reflects ce que il peut voir à construire temps. An SSG page est
straightforward — il exists as a static fichier, donc c’est naturally sitemap-eligible.
A DSG page’s HTML ne fait pas exist yet à construire temps (il generates on premier requête),
an SSR page jamais a fixed HTML à tout, et a client-seulement route a aucun
route-spécifique contenu à indexer dans le premier placer. ne pas assume quelconque de ces sont
dans le sitemap (or devrait être) simplement parce que le route exists — decide, page par page,
si il belongs, et vérifier le generated sitemap-index.xml en réalité reflects
que décision plutôt que a construire-time guess.
robots.txt: gatsby-plugin-robots-txt
gatsby-plugin-robots-txt generates robots.txt à construire temps. Le utile detail
pour le SEO est environment awareness: il lit process.env.GATSBY_ACTIVE_ENV alors
process.env.NODE_ENV, donc vous pouvez servir différent règles per environment. Le
classic utiliser est blocking robots d’exploration on Netlify preview/branch deploys donc votre
staging URLs ne pas obtenir accidentally indexé, pendant que leaving production ouvrir.
«## Canonical URLs (and the double-canonical bug) » (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.)
Two viable approaches:
gatsby-plugin-canonical-urlsajoute a<link rel="canonical">à chaque page. DéfinirstripQueryString: truedonc/blog?tag=fooet/blogne pas obtenir treated as séparé canonicalized pages — recommended pour la plupart sites.- Le Head API, paramètre canonicals yourself depuis
location.pathname:
export const Head = ({ location }) => (
<link rel="canonical" href={`https://example.com${location.pathname}`} />
)Le double canonical bug. Ce est a connu, facile-à-hit problème: si vous utiliser
gatsby-plugin-canonical-urls et a react-helmet balise canonical à le même
temps, vous emit deux <link rel="canonical"> balises. Pick un mechanism. (Si vous êtes
on react-helmet, gatsby-plugin-react-helmet-canonical-urls est le helmet-aware
option; on le Head API, définir le canonical là et drop le plugin.)
Trailing slashes. Gatsby pages peut être reachable avec et sans a trailing
slash, et Gatsby’s <Link> component utilise client-side History API routing — qui
bypasses serveur-side 301 redirections vous’d normally utiliser à normalize trailing slashes.
Decide on un formulaire, enforce il à le host/CDN level, et garder canonicals consistent
avec il.
Image SEO: gatsby-plugin-image
gatsby-plugin-image is genuinely un of Gatsby’s strengths. Two components:
StaticImage— pour images whose chemin est connu et hardcoded à construire temps.GatsbyImage— pour dynamic images coming depuis GraphQL.
Ce que il fait automatiquement: plusieurs sizes, WebP/AVIF formats, lazy chargement, et breakpoints (750/1080/1366/1920px). Il aussi generates placeholders (blurred, dominant color, or traced SVG) que reserve space et empêcher Cumulative Layout Shift — a Core Web Vitals metric. Parce que dimensions sont définir, vous éviter CLS, et modern formats plus lazy chargement aider LCP.
Le un chose il ne fait pas faire est écrire texte alternatif. c’est on vous, chaque temps —
manquant texte alternatif on GatsbyImage est un de le la plupart courant Gatsby SEO oversights.
(Migrating depuis le old gatsby-image package? il y a a codemod:
npx gatsby-codemods gatsby-plugin-image.)
Données structurées (JSON-LD)
Google’s preferred structured-données format est JSON-LD, et le clean façon à ajouter il dans modern Gatsby est via le Head API avec a script balise:
export const Head = ({ data }) => (
<script type="application/ld+json">
{JSON.stringify({
"@context": "https://schema.org",
"@type": "Article",
"headline": data.post.title,
})}
</script>
)gatsby-plugin-next-seo offers pre-built JSON-LD components si vous’d plutôt pas
hand-roll les. Un frequent confusion à clair up: gatsby-plugin-manifest est
pas a structured-données plugin — il generates le PWA web app manifest (icons,
theme color), rien à faire avec schema.
Le React bundle et Core Web Vitals
Here’s Gatsby’s réel weakness relative to the zero-JS generators.
- Complet hydration (le Gatsby 1–4 par défaut) hydrates le entier React tree et ships a 200KB+ React runtime à chaque page. Le HTML est pre-rendu, donc ce ne fait pas hurt crawlability — mais il absolutely affecte charger speed et CWV.
- Partiel hydration (Gatsby 5, experimental) hydrates seulement components marked
"use client"et laisse le rest as static HTML, cutting le JS shipped et directement improving TTI et CWV. Le limitations sont réel: production construit seulement, encore beta, et incompatible avec emotion, styled-components, etgatsby-plugin-offline.
Le takeaway: Gatsby’s JS payload est a performances problème, pas an indexability un. Googlebot encore renders JS à assess page-experience signaux, donc le bundle peut coût vous on CWV même though votre contenu indexes fine.
Gatsby vs Astro pour le SEO
Si vous êtes choosing a static framework aujourd’hui, ce est le comparaison que matters la plupart pour le SEO.
| Dimension | Gatsby | Astro |
|---|---|---|
| JS shipped to navigateur | 200KB+ (complet React runtime) | ~5KB (interactive islands seulement) |
| Rendering model | SSG → SPA (complet hydration) | SSG → MPA (zero hydration by par défaut) |
| Construire speed (40 pages) | 2–3 minutes | Sous 10 seconds |
| SEO plugin ecosystem | Mature (gatsby-plugin-*) | Growing |
| Crawl-budget impact | Plus élevé (plus JS pour Google to render) | Lower |
| Framework future | Uncertain (Netlify ownership, slowed activity) | Active, growing |
«Both pre-render indexable HTML — that’s a wash. The difference is the JS tax: Astro’s islands ship a fraction of the JavaScript, which a Vaihe comparison frames as “Reduced JavaScript execution conserves crawl budget and accelerates page scanning.” (One historical caveat on the other side: Astro’s image handling lacked automatic width/height at the time of that comparison, which produced Lighthouse warnings — check current Astro docs, as it may be resolved.) » (Traduction) (Résumé en français de la section soixante-dix, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«For context on how the whole field compares, see the static site generators hub. » (Traduction) (Résumé en français de la section soixante-onze, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«## The honest part: Gatsby’s maintenance trajectory » (Traduction) (Résumé en français de la section soixante-douze, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«I won’t sugarcoat this, and I won’t catastrophize it either. » (Traduction) (Résumé en français de la section soixante-treize, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
Netlify acquired Gatsby Inc. dans February 2023. Gatsby Cloud était sunset et clients étaient déplacé à Netlify; Netlify stated le acquisition voudrait “pas impact Gatsby JS.” Since alors, activity a slowed markedly. A widely-lire community GitHub discussion (#39062) argues Gatsby est effectively abandoned — minimal commits, aucun React 19 prise en charge, a 2024 roadmap que n’était pas delivered, et le telemetry service shut bas. Maintainers ont framed le actuel state as security corrections, limited dependency mises à jour, et faible-hanging-fruit bug corrections.
«What that means for SEO teams. For an existing Gatsby site, none of this is
an emergency — it builds, it indexes, it works. The risk is ecosystem decay over
time: SEO depends on plugins (gatsby-plugin-sitemap, image, canonical-urls), and
aging plugins (e.g. gatsby-source-shopify facing API deprecation) can eventually
break in ways that quietly degrade indexing. For a new project, weigh that
seriously — the frameworks people are migrating to are Astro and Next.js.
» (Traduction) (Résumé en français de la section soixante-quinze, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
Production checklist: vérifier every rendering chemin
A local gatsby develop session or même a clean gatsby build log ne fait pas prove
ce que a robot d’exploration en réalité receives. Parce que SSG, DSG, SSR, et client-seulement routes
chaque generate HTML differently, vérifier production behavior per chemin plutôt que
assuming un representative page covers tout de les:
- Raw HTML contenu. Pour chaque rendu chemin dans utiliser, récupérer a réel production
URL avec
curl -s <url>orview-source:— pas DevTools — et confirmer le contenu, titre, et meta balises a robot d’exploration voudrait voir sont en réalité là. - Metadata (Head export sortie). Confirmer le
Headexport’s balises land dans que raw HTML pour le chemin dans question. Ce est où DSG/SSR differ la plupart depuis SSG: le balises exist dans votre source soit façon, mais seulement a production récupérer proves ils fait il dans la réponse. - HTTP status. Vérifier la réponse code d’état on production, surtout pour SSR et DSG routes — une page que renders fine locally peut 500 dans production on premier requête or sous charger dans façons a construire jamais surfaces.
- Mise en cache behavior. SSG sortie est a static fichier avec predictable mise en cache. DSG caches après le premier requête — confirmer le deuxième requête est rapide et correct, pas simplement le premier. SSR réponses depend on votre mise en cache headers et hosting couche; vérifier stale or per-requête contenu n’est pas servi à le incorrect visitor.
- Échec et empty-state behavior. Pour SSR et DSG pages backed par requête-time or premier-requête données, vérifier ce que a robot d’exploration voit si que données récupérer fails or renvoie vide — an unhandled erreur state n’est pas le même page vous testé locally avec bon données.
- Sitemap generation et exclusions. Re-confirm ce seulement se produit on a
production construire (
gatsby build && gatsby serve, jamaisgatsby develop), et que le exclusions vous expect — drafts, client-seulement routes, n’importe quoi vous decided ne devrait pas être listed — sont en réalité absent depuis le generatedsitemap-index.xml, pas simplement absent depuis votre intent.
None of ce is optional per rendering chemin — a working gatsby build proves SSG
output, pas DSG, SSR, or client-only behavior.
Courant Gatsby SEO mistakes
- Encore en utilisant
gatsby-plugin-react-helmet— legacy; migrate à le Head API. - Meta balises dans DevTools mais pas dans page source — le SEO component est rendu
client-side; vérifier
view-source:, pas DevTools. - Draft contenu dans sitemaps — filter drafts dans
gatsby-node.jsavec GraphQL, pas dans a React component. - Orphan pages depuis
src/pages— Gatsby auto-routes tout là; stale fichiers construire et land dans le sitemap. - Double balise canonicals —
gatsby-plugin-canonical-urls+ react-helmet les deux firing. - Trailing-slash inconsistency —
<Link>client-routing bypasses serveur-side trailing-slash redirections. - Pas stripping requête strings depuis canonicals — définir
stripQueryString: true. - Texte alternatif omitted on
GatsbyImage— il n’est pas auto-generated. - Submitting
/sitemap.xml— le réel fichier est/sitemap-index.xml. - Testing le sitemap dans
gatsby develop— il seulement generates ongatsby build. - Noindex toggled par React state — Google peut ont déjà processed le raw
HTML; et quand il voit
noindexdans raw HTML il peut skip rendu entirely. Garder noindex decisions dans static HTML or serveur headers.
Pour le JavaScript-rendu fundamentals behind tout de ce, voir le parent JavaScript SEO hub.
AI summary
A condensed prendre on the Avancé version:
«- Gatsby has four rendering paths — SSG, DSG, SSR, and client-only routes.
SSG is the default: gatsby build pre-renders the page to static HTML, so
crawlers get full content on the first fetch — no rendering queue, and the
strongest indexability baseline. DSG defers generation to the first request; SSR
generates per request; client-only routes render nothing route-specific until
JavaScript runs in the browser (same profile as a plain client-side React app).
Verify production HTML per path — a successful gatsby build only proves SSG
behavior.
» (Traduction) (Résumé en français de la section quatre-vingt-sept, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«- The React-bundle cost is performance, not crawlability, and applies regardless
of rendering path. Gatsby hydrates a full React runtime (~200KB+) on the
client, which hits Core Web Vitals. The zero-JS generators (Hugo, Jekyll,
Eleventy) don’t have this; Astro ships ~5KB via islands.
» (Traduction) (Résumé en français de la section quatre-vingt-sept, sous-partie deux : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Use the Gatsby Head API (v4.19+), a named Head export from page/template
files, for titles/meta/canonical/JSON-LD. It works across all four rendering
paths and replaces the legacy gatsby-plugin-react-helmet. It works only in
pages/templates and dedupes by id.
» (Traduction) (Résumé en français de la section quatre-vingt-sept, sous-partie trois : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Production checklist per path: raw HTML content, Head-export metadata, HTTP
status, caching behavior, and failure/empty-state handling — check all five for
whichever rendering path a route actually uses, plus confirm sitemap generation
and exclusions only on a production build.
» (Traduction) (Résumé en français de la section quatre-vingt-sept, sous-partie quatre : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Sitemaps: gatsby-plugin-sitemap generates sitemap-index.xml (submit that,
not /sitemap.xml) and only runs on gatsby build, not in dev. Google ignores
<priority>/<changefreq> — focus on <lastmod>. Filter drafts in
gatsby-node.js. DSG, SSR, and client-only routes each need an explicit
sitemap-inclusion decision — don’t assume they’re covered the same way an SSG
page is.
» (Traduction) (Résumé en français de la section quatre-vingt-sept, sous-partie cinq : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Canonicals: Head API + location.pathname, or gatsby-plugin-canonical-urls
with stripQueryString: true — never both (double canonical bug).
» (Traduction) (Résumé en français de la section quatre-vingt-sept, sous-partie six : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Images: gatsby-plugin-image auto-handles sizes/WebP/lazy-load and prevents
CLS, but does not write alt text — that’s manual.
» (Traduction) (Résumé en français de la section quatre-vingt-sept, sous-partie sept : le texte source est conservé pour vérification lors de la relecture francophone.)
«- The “DevTools but not view-source” bug = SEO component rendering client-side
instead of via the Head export.
» (Traduction) (Résumé en français de la section quatre-vingt-sept, sous-partie huit : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Maintenance risk: Netlify acquired Gatsby in 2023; activity has slowed (no
React 19, undelivered roadmap). Fine for existing sites; for new projects weigh
Astro/Next.js.
» (Traduction) (Résumé en français de la section quatre-vingt-sept, sous-partie neuf : le texte source est conservé pour vérification lors de la relecture francophone.)
Documentation officielle
Primary-source documentation depuis Gatsby et depuis Google.
Gatsby
- Rendu options — le overview de Gatsby’s four rendu paths: SSG, DSG, SSR, et client-seulement routes.
- En utilisant Deferred Static Generation — DSG’s premier-requête generation behavior.
- En utilisant Rendu côté serveur — SSR’s requête-time sortie via Gatsby Functions.
- Client-seulement routes et utilisateur authentication — pourquoi client-seulement routes ne pas expose route-spécifique contenu dans le initial HTML.
- Ajout an SEO component — le recommended SEO-component modèle.
- Gatsby Head API référence — le modern, built-dans façon à manage head balises.
- Introducing le Gatsby Head API — pourquoi il replaced react-helmet.
- gatsby-plugin-sitemap — sitemap generation (production construit seulement).
- gatsby-plugin-image —
StaticImage/GatsbyImage, formats, CLS prevention. - gatsby-plugin-robots-txt — environment-aware robots.txt.
- gatsby-plugin-canonical-urls — site-wide balise canonicals et
stripQueryString. - gatsby-plugin-react-helmet — le legacy metadata approche.
- gatsby-plugin-suivant-seo — pre-built JSON-LD/schema components.
- React hydration dans Gatsby — comment le static HTML becomes interactive.
- Comprendre le JavaScript SEO basics — le explorer → rendre → indexer phases, et pourquoi pre-rendu aide.
Quotes from the source
On-le-record statements que appliquer directement à Gatsby’s architecture. Gatsby est a JavaScript SSG, donc le pertinent principal sources sont Google’s JavaScript-rendu guidance et Google reps on le même.
Recherche Google Central — JavaScript SEO basics
«- “Server-side or pre-rendering is still a great idea because it makes your website faster for users and crawlers, and not all bots can run JavaScript.” — the case for exactly what Gatsby does at build time. » (Traduction) (Résumé en français de la section quatre-vingt-dix-neuf, sous-partie un : 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 the rendering queue that pre-rendered HTML lets you skip. » (Traduction) (Résumé en français de la section quatre-vingt-dix-neuf, sous-partie deux : le texte source est conservé pour vérification lors de la relecture francophone.)
«Martin Splitt, Google (Developer Advocate) » (Traduction) (Résumé en français de la section cent, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«- “Even though Googlebot can render JavaScript, we don’t want to rely on that.” — the principle behind preferring SSG/SSR. (Via SEJ / Botify coverage.) » (Traduction) (Résumé en français de la section cent un, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.) «- “A lot of people are still looking at view source. That is not what we use for indexing. We use the rendered HTML.” — the exact reason the “DevTools vs view-source” Gatsby bug confuses people. (Via SEJ.) » (Traduction) (Résumé en français de la section cent un, sous-partie deux : le texte source est conservé pour vérification lors de la relecture francophone.) «- “The median time in the render queue is only five seconds.” — note this is the median; tail latency can be far longer. (BrightonSEO, via SEJ.) » (Traduction) (Résumé en français de la section cent un, sous-partie trois : le texte source est conservé pour vérification lors de la relecture francophone.)
John Mueller, Google (Recherche Advocate)
- “Serveur-side rendu est pas a requirement là. Nous peut rendre JavaScript-based pages pour le la plupart partie.” — context: SSR/SSG est meilleur pratique, pas strictly requis; Google va eventually rendre CSR contenu. (Via SEJ.)
«Note: these rep quotes are sourced through secondary coverage (Search Engine Journal, Botify) and should be confirmed against the original talks/posts before being treated as final. No Google or Bing rep has made framework-specific statements about Gatsby; these are general JavaScript-SEO statements that apply to it. » (Traduction) (Résumé en français de la section cent quatre, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«## Gatsby SEO checklist » (Traduction) (Résumé en français de la section cent sept, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«A pass to confirm a Gatsby build is actually search-friendly: » (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.)
«- [ ] Primary content appears in View Source (raw HTML), not just in DevTools —
confirms it’s pre-rendered, not client-side only.
» (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.)
«- [ ] Metadata is set via the Gatsby Head API (Head export from pages/
templates), not legacy react-helmet on new work.
» (Traduction) (Résumé en français de la section cent neuf, sous-partie deux : le texte source est conservé pour vérification lors de la relecture francophone.)
«- [ ] Every page has a unique, build-time <title> and meta description, with a
siteMetadata fallback.
» (Traduction) (Résumé en français de la section cent neuf, sous-partie trois : le texte source est conservé pour vérification lors de la relecture francophone.)
«- [ ] Canonical tags are set one way only — Head API or
gatsby-plugin-canonical-urls, never both (avoids the double-canonical bug).
» (Traduction) (Résumé en français de la section cent neuf, sous-partie quatre : le texte source est conservé pour vérification lors de la relecture francophone.)
«- [ ] stripQueryString: true is set so query-string variants don’t fragment
canonicals.
» (Traduction) (Résumé en français de la section cent neuf, sous-partie cinq : le texte source est conservé pour vérification lors de la relecture francophone.)
«- [ ] gatsby-plugin-sitemap is installed; you verified the output with
gatsby build && gatsby serve (it doesn’t run in dev).
» (Traduction) (Résumé en français de la section cent neuf, sous-partie six : le texte source est conservé pour vérification lors de la relecture francophone.)
«- [ ] You submitted /sitemap-index.xml (not /sitemap.xml) in Search Console.
» (Traduction) (Résumé en français de la section cent neuf, sous-partie sept : le texte source est conservé pour vérification lors de la relecture francophone.)
«- [ ] Draft content is filtered out in gatsby-node.js (GraphQL), so it never enters
the sitemap.
» (Traduction) (Résumé en français de la section cent neuf, sous-partie huit : le texte source est conservé pour vérification lors de la relecture francophone.)
«- [ ] No stale/orphan files in src/pages that auto-build into routes.
» (Traduction) (Résumé en français de la section cent neuf, sous-partie neuf : le texte source est conservé pour vérification lors de la relecture francophone.)
«- [ ] robots.txt blocks Netlify preview/branch deploys but leaves production open.
» (Traduction) (Résumé en français de la section cent neuf, sous-partie dix : le texte source est conservé pour vérification lors de la relecture francophone.)
«- [ ] Every GatsbyImage / StaticImage has explicit alt text.
» (Traduction) (Résumé en français de la section cent neuf, sous-partie onze : le texte source est conservé pour vérification lors de la relecture francophone.)
«- [ ] JS/CSS assets aren’t blocked in robots.txt.
» (Traduction) (Résumé en français de la section cent neuf, sous-partie douze : le texte source est conservé pour vérification lors de la relecture francophone.)
«- [ ] Trailing-slash form is decided and enforced at the host/CDN (not just via
<Link>).
» (Traduction) (Résumé en français de la section cent neuf, sous-partie treize : le texte source est conservé pour vérification lors de la relecture francophone.)
«- [ ] noindex decisions live in static HTML or server headers, not React state.
» (Traduction) (Résumé en français de la section cent neuf, sous-partie quatorze : le texte source est conservé pour vérification lors de la relecture francophone.)
«- [ ] Core Web Vitals checked — the React bundle is the likely drag; consider
partial hydration where viable.
» (Traduction) (Résumé en français de la section cent neuf, sous-partie quinze : le texte source est conservé pour vérification lors de la relecture francophone.)
«- [ ] For every rendering path in use (SSG, DSG, SSR, client-only), you checked
production raw HTML, metadata, HTTP status, caching behavior, and
failure/empty-state handling — not just a local gatsby build log.
» (Traduction) (Résumé en français de la section cent neuf, sous-partie seize : le texte source est conservé pour vérification lors de la relecture francophone.)
«- [ ] DSG, SSR, and client-only routes each have an explicit, verified sitemap
decision — none of them are covered by the same assumption as an SSG page.
» (Traduction) (Résumé en français de la section cent neuf, sous-partie dix-sept : le texte source est conservé pour vérification lors de la relecture francophone.)
«## The mental models » (Traduction) (Résumé en français de la section cent douze, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
1. Crawlability vs performances sont deux séparé scorecards. Gatsby aces crawlability (HTML est pre-rendu) mais pays on performances (le React bundle). ne pas conflate les — “Gatsby est mauvais pour SEO parce que React” mixes up le deux. Votre contenu indexes fine; votre Core Web Vitals sont où le JS tax montre up.
2. Le précédent le HTML exists, le moins peut go incorrect. SSG decides HTML à construire temps — le safest point. Gatsby’s par défaut page est an SSG, donc c’est on le sûr fin de le rendu spectrum (client-seulement → SSR → DSG → SSG, roughly riskiest à safest pour indexability). Mais Gatsby est a multi-mode framework — a donné page pourrait être DSG, SSR, or client-seulement à la place, chaque earning son propre placer on que spectrum. Know qui mode chaque route en réalité utilise avant assuming c’est on le sûr fin.
«3. Head API by default; react-helmet only by inheritance.
For anything new, the decision is made: Gatsby Head API. react-helmet is a thing you
migrate off of, not something you reach for. If a tag isn’t showing in raw HTML,
the first question is “is this in a Head export, or stuck in a component?”
» (Traduction) (Résumé en français de la section cent quinze, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
4. Pick exactly un canonical mechanism.
Head API canonical or gatsby-plugin-canonical-urls — jamais les deux. Two mechanisms =
two balise canonicals = the double-canonical bug. Même discipline pour anything que
writes to <head>: un source of truth per tag.
5. Gatsby builds everything it trouve — so filtering is votre job.
Drafts, stale src/pages fichiers, query-string variants: Gatsby doesn’t editorialize.
Si vous don’t exclude it (in gatsby-node.js, in canonical config, in sitemap
options), it ships and obtient crawled.
6. Nouveau project vs existing site changements le maintenance calculus. Existing Gatsby site: garder il, il fonctionne. Nouveau project: le slowed maintenance et ecosystem-decay risque sont réel inputs — weigh Astro/Suivant.js avant committing.
Gatsby SEO — cheat sheet
Metadata: qui approach
| Approach | Status | Utiliser it quand |
|---|---|---|
Gatsby Head API (Head export) | Current (v4.19+) | Tout nouveau fonctionner; pages/templates seulement |
gatsby-plugin-react-helmet | Legacy | Existing sites pending migration |
Plugins En un coup d’œil
| Plugin | Fait | SEO gotcha |
|---|---|---|
gatsby-plugin-sitemap | Generates sitemap-index.xml | Production construire seulement; submit le indexer URL |
gatsby-plugin-image | Sizes, WebP/AVIF, lazy-charger, CLS-sûr | Aucun auto texte alternatif |
gatsby-plugin-canonical-urls | Site-wide balise canonicals | ne pas pair avec react-helmet canonicals |
gatsby-plugin-robots-txt | Construire-time robots.txt | Utiliser env règles à bloquer preview deploys |
gatsby-plugin-next-seo | Pre-built JSON-LD components | — |
gatsby-plugin-manifest | PWA manifest (icons/theme) | Pas données structurées |
Rapide facts
- Sitemap fichier est
/sitemap-index.xml, pas/sitemap.xml. - Sitemap ne fait pas generate dans
gatsby develop— utilisergatsby build && gatsby serve. - Google ignores
<priority>/<changefreq>— précis<lastmod>seulement. - React bundle ≈ 200KB+ par page (complet hydration); a CWV coût, pas a explorer un.
- Astro ships ~5KB par comparaison (islands seulement).
gatsby develop≠ production: sitemap, robots, et some optimizations differ.- Netlify acquired Gatsby Feb 2023; maintenance a slowed (aucun React 19 yet).
Two-line SEO Head export
export const Head = ({ data, location }) => (
<>
<title>{data.post.title}</title>
<link rel="canonical" href={`https://example.com${location.pathname}`} />
</>
) Vérifier Gatsby’s production artifacts
Run ce après gatsby build, pas contre gatsby develop:
find public -name '*.html' -type f | while IFS= read -r file; do
title_count=$(grep -Eio '<title>[^<]*</title>' "$file" | wc -l | tr -d ' ')
canonical_count=$(grep -Eio '<link[^>]+rel=["'"']canonical["'"'][^>]*>' "$file" | wc -l | tr -d ' ')
robots=$(grep -Eio '<meta[^>]+name=["'"']robots["'"'][^>]*>' "$file" | head -1)
if [ "$title_count" -ne 1 ] || [ "$canonical_count" -ne 1 ]; then
printf '%s\ttitles=%s\tcanonicals=%s\t%s\n' "$file" "$title_count" "$canonical_count" "$robots"
fi
doneCe catches manquant or duplicate sortie depuis overlapping Head API/plugin mechanisms. Examiner le valeurs et sitemap membership séparément.
Outils pour Gatsby SEO
- Gatsby Head API (built-dans, v4.19+) — le aucun-dependency façon à manage
<title>, meta, canonical, et JSON-LD par page/template. gatsby-plugin-sitemap— generatessitemap-index.xmlon production construit.gatsby-plugin-image—StaticImage/GatsbyImage, responsive sizes, WebP/AVIF, lazy chargement, CLS-preventing placeholders.gatsby-plugin-canonical-urls— site-wide balise canonicals avecstripQueryString.gatsby-plugin-robots-txt— environment-aware robots.txt (bloquer preview deploys).gatsby-plugin-next-seo— pre-built JSON-LD/schema components si vous ne pas vouloir à hand-roll données structurées.view-source:/ GSC Inspection d’URL — le ground truth pour “est mon contenu et metadata dans le raw HTML?” (pas DevTools, qui montre le hydrated DOM).- Lighthouse / PageSpeed Insights — à voir le Core Web Vitals coût de le React bundle et si partiel hydration est worth pursuing.
gatsby build && gatsby serve— le seulement façon à tester sitemap, robots.txt, et production-seulement optimizations locally.
Ce que pas to do on a Gatsby site
Concrete mistakes personnes en réalité faire building et shipping Gatsby sites — prevention, pas diagnosis.
Keeping gatsby-plugin-react-helmet on nouveau fonctionner
Le mistake: reaching pour react-helmet par habit on nouveau pages or a nouveau project, parce que c’est ce que older Gatsby tutorials encore montrer.
Pourquoi c’est incorrect: react-helmet a connu problèmes avec React Hooks et concurrent rendu, plus a background-tab titre bug vous ont à patch avec defer={false}. c’est aussi a tiers bundle et Provider wrapper vous ne pas besoin anymore.
Que faire à la place: utiliser le built-dans Gatsby Head API (v4.19+) — a named Head export depuis lune page or template fichier. Reserve react-helmet pour existing code vous haven’t migrated yet.
Running two canonical mechanisms at une fois
Le mistake: paramètre a canonical via gatsby-plugin-canonical-urls et a react-helmet (or Head API) balise canonical on le même page.
Pourquoi it’s incorrect: les deux fire, and lune page ships two <link rel="canonical"> tags — a well-known Gatsby échec mode que muddies qui URL vous en réalité intended as canonical.
Que faire à la place: pick exactly un mechanism site-wide (le Head API, or le plugin avec stripQueryString: true) et drop le autre entirely.
Filtering drafts in a React component au lieu de at construire temps
Le mistake: hiding unpublished contenu avec a client-side vérifier (e.g. if (!post.published) return null) et assuming que garde il out de recherche.
Pourquoi c’est incorrect: Gatsby construit tout il trouve dans static HTML avant que component ever exécute dans le navigateur — le draft page est déjà construit et déjà listed dans le sitemap par le temps votre React vérifier executes.
Que faire à la place: filter drafts dans gatsby-node.js avec a GraphQL requête (e.g. excluding entries sans a publish date) donc ils jamais obtenir construit or listed dans le premier placer.
Shipping GatsbyImage sans texte alternatif
Le mistake: trusting gatsby-plugin-image à handle image SEO de bout en bout parce que il auto-generates sizes, formats, et placeholders.
Pourquoi c’est incorrect: le plugin optimizes delivery — il ne fait pas écrire texte alternatif. Manquant texte alternatif on GatsbyImage/StaticImage est un de le la plupart courant Gatsby SEO oversights precisely parce que tout sinon à propos de le image semble handled.
Que faire à la place: treat texte alternatif as a requis field on every image component, every temps — it’s the un piece of image SEO Gatsby leaves entirely to vous.
Assuming gatsby develop montre vous production SEO output
Le mistake: checking le sitemap, robots.txt, or noindex behavior dans gatsby develop et concluding c’est broken parce que rien montre up.
Pourquoi c’est incorrect: gatsby-plugin-sitemap et plusieurs autre construire-time behaviors simplement ne pas exécuter dans development mode — vous êtes pas looking à a bug, vous êtes looking à dev mode doing ce que dev mode fait.
Que faire à la place: run gatsby build && gatsby serve avant drawing quelconque conclusion à propos de sitemap, robots.txt, or production-only optimizations.
«### Letting <Link> client-routing hide trailing-slash inconsistency
» (Traduction) (Résumé en français de la section cent soixante-deux, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
The mistake: assuming votre serveur-side trailing-slash redirection rules appliquer everywhere, notamment in-app navigation.
Pourquoi c’est incorrect: Gatsby’s <Link> component utilise client-side History API routing, qui bypasses le serveur-side 301 redirections vous’d normally rely on à normalize trailing slashes — donc lien internes peut quietly servir le “wrong” formulaire sans ever hitting votre redirection règle.
Que faire à la place: decide on un trailing-slash formulaire, enforce il à le host/CDN level, et assurez-vous canonicals sont consistent avec il regardless de comment a donné page était reached.
Courant Gatsby SEO problèmes
Symptom-premier lookup pour problèmes vous êtes actively seeing on a Gatsby site — commencer depuis ce que vous observe.
Meta tags montrer up in DevTools but are manquant from view-source
Symptom: vous inspect lune page dans Chrome DevTools et le titre/meta description regarder correct, mais view-source: (or a raw curl) montre les manquant or générique.
Probable causer: le SEO component est rendu client-side — c’est utilisé as a regular component plutôt que as (or à l’intérieur) lune page’s Head export, donc il seulement apparaît dans le DOM après hydration.
Corriger: déplacer le balises dans lune page or template’s named Head export. Confirmer avec view-source: or curl -s <url> — pas DevTools, qui montre le hydrated DOM, pas ce que a robot’s raw récupérer voit.
Le sitemap is manquant or vide
Symptom: vous visit /sitemap-index.xml (or vérifier Search Console) and obtenir nothing, or an incomplete liste.
Probable causer: presque toujours que vous testé dans gatsby develop, où gatsby-plugin-sitemap ne fait pas exécuter à tout. Moins commonly, le plugin n’est pas installed/configuré dans gatsby-config.js.
Corriger: exécuter gatsby build && gatsby serve et vérifier à nouveau. Si c’est encore manquant, vérifier le plugin est présent dans gatsby-config.js. Confirmer par requesting /sitemap-index.xml directement — remember c’est le indexer URL, pas /sitemap.xml.
Une page has two balise canonicals
Symptom: viewing source (or running a schema/tag audit) montre two <link rel="canonical"> elements on the même page.
Probable causer: gatsby-plugin-canonical-urls et a react-helmet (or Head API) canonical sont les deux firing pour le même page.
Corriger: supprimer un mechanism donc seulement a unique source sets le canonical. Confirmer par viewing source à nouveau et checking avec Patrick’s Balise canonical Checker que exactly un canonical resolves.
Draft or orphan pages apparaître in le sitemap
Symptom: le sitemap (or Search Console coverage) listes URLs vous jamais meant to publish — draft posts, or stale fichiers sous src/pages.
Probable causer: Gatsby auto-construit et auto-routes tout il trouve — an unpublished GraphQL entry que n’est pas filtered, or a leftover fichier dans src/pages, obtient construit dans a réel static page et listed comme quelconque autre.
Corriger: filter drafts dans gatsby-node.js avec a GraphQL requête (e.g. excluding entries sans a publish date) donc ils sont jamais construit. Pour orphan src/pages fichiers, delete le stale fichier — filtering dans a component est aussi late, since lune page est déjà construit par alors.
Query-string variants of une page are getting indexé as duplicates
Symptom: Search Console montre near-duplicate URLs comme /blog and /blog?tag=foo les deux indexé, or flagged as contenu dupliqué.
Probable causer: gatsby-plugin-canonical-urls est running sans stripQueryString: true, donc requête-string variants sont canonicalized à themselves au lieu de le clean URL.
Corriger: définir stripQueryString: true dans le plugin config, rebuild, et re-vérifier le balise canonical on a requête-string URL — il devrait maintenant point à le clean chemin.
Une page vous intended to noindex is encore showing up in search
Symptom: vous définir une page to noindex, but it’s encore indexé weeks plus tard, or Search Console montre it as indexé despite the tag.
Probable causer: le noindex directive était toggled via React state plutôt que baked dans static HTML or serveur headers — Google peut ont déjà processed le raw HTML (sans le noindex) et, quand il fait voir noindex seulement dans a client-rendu réussir, peut skip rendu lune page à nouveau entirely.
Corriger: déplacer le noindex décision dans static HTML (via le Head export à construire temps) or an HTTP header, pas conditional React logic. Recheck avec view-source: à confirmer le balise est présent dans le raw réponse.
Testez vos connaissances: Gatsby SEO
Five rapide questions on optimizing a Gatsby site pour search. Pick an réponse pour chaque, alors vérifier.
Ressources utiles
Mon connexe writing
- JavaScript SEO: A Definitive Guide — rendu, DOM parity, et pourquoi static/prerendered sortie (comme Gatsby’s) est le faible-risque fin de le spectrum.
- Le Beginner’s Guide à SEO technique — où rendu architecture 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 autour le industry
- Gatsby Head API référence — le principal source pour le modern metadata approche.
- Introducing le Gatsby Head API — Gatsby’s propre explanation de pourquoi il replaced react-helmet.
- Recherche Google Central — JavaScript SEO basics — le explorer → rendre → indexer phases Gatsby’s construire lets vous skip pour contenu.
- Gatsby est joining Netlify — le 2023 acquisition announcement, pour context on maintenance.
- Netlify acquires frontend plateforme Gatsby (TechCrunch) — independent coverage de le acquisition.
- “Is GatsbyJS abandoned?” discussion #39062 — le community thread on Gatsby’s actuel maintenance state.
- SEO comparaison de Gatsby vs Suivant vs Astro (Vaihe) — le JS-payload et explorer-budget comparaison.
- Understanding partiel hydration dans Gatsby 5 (LogRocket) — le CWV-pertinent hydration improvement et son limites.
Journal des modifications
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.
Comparaison complète indisponible — aucun instantané antérieur n’a été archivé pour cette révision.