Suivant.js SEO
Comment faire a Suivant.js site crawlable, indexable, et rankable — le deux routers, rendu modes (SSG/SSR/ISR/Serveur Components), le App Router Metadata API, sitemap.ts, robots.ts, suivant/image, suivant/lien, et le mistakes que quietly break il.
«Next.js solves the hardest JavaScript SEO problems by default — if you use it right. The App Router's Server Components and SSG/ISR put content in the HTML so there's no render-queue delay; the native Metadata API resolves titles, canonicals, and Open Graph on the server; sitemap.ts and robots.ts are file conventions. The framework gives you the infrastructure but writes none of your tags for you. The failures are predictable: missing metadataBase, no priority on the LCP image, metadata exported from a Client Component (silently does nothing), and 404 views returning 200.» _(Traduction)_ (Résumé en français du champ tldr : le texte source est conservé pour relecture francophone.)
TL;DR — Suivant.js est un de le meilleur frameworks pour le SEO quand vous utiliser il correct. Construire votre pages on le serveur or à construire temps (pas entirely dans le navigateur), définir a unique titre, description, et canonical on chaque page, et utiliser le built-dans
next/imageetnext/linkcomponents. Suivant.js donne vous tout le outils — mais il ne va pas écrire votre SEO balises pour vous.
Ce que Suivant.js SEO is
Suivant.js est a popular framework construit on React pour making sites web et web apps. Parce que c’est React sous le hood, a lot de lune page peut être construit avec JavaScript — et c’est où SEO questions come dans. Suivant.js SEO est simplement le pratique de making certain moteur de recherches peut explorer, rendre, et indexer a Suivant.js site, et en utilisant le framework’s built-dans fonctionnalités à faire que bien.
Le bon news: Suivant.js peut construire votre pages ahead de temps or on le serveur, donc moteur de recherches obtenir le finished HTML correct away. Que avoids le biggest risque avec JavaScript sites — contenu que seulement montre up après scripts exécuter. (Pour le broader picture, voir JavaScript SEO.)
The un big decision: où lune page obtient construit
Quand quelqu’un — or Googlebot — demande pour une page, où fait le finished HTML come depuis? Suivant.js donne vous a quelques options:
- À construire temps (Static / SSG) — lune page est construit dans a plain HTML fichier ahead de temps. Rapide, et moteur de recherches obtenir tout immédiatement.
- On le serveur, per requête (SSR) — le serveur construit le complet page chaque temps. Aussi recherche-friendly, et toujours fresh.
- A mix (ISR) — static pages que refresh on a timer. A bon par défaut pour la plupart contenu.
- Dans le navigateur (Client-Side / CSR) — le serveur sends a near-empty shell et JavaScript fills il dans. Ce est le risky un pour le SEO; éviter il pour votre principal contenu.
«The modern App Router uses Server Components by default, which means your content ends up in the HTML automatically — a great starting point for SEO. » (Traduction) (Résumé en français de la section dix, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
The simple checklist
- Donner chaque page a unique titre et description.
- Définir a URL canonique on chaque page.
- Utiliser le
next/imagecomponent pour images (il arrête lune page depuis jumping autour as images charger, et rend les plus petit). - Utiliser
next/linkpour lien internes (il crée réel liens Google peut suivre). - ne pas put votre principal contenu behind rendu côté client.
- Créer a sitemap et a robots.txt (Suivant.js a simple fichier-based façons à faire les deux). Preuve à l’appui de cette affirmation Next.js App Router supports special metadata files for sitemap and robots output. Portée : Next.js App Router file conventions. Niveau de confiance : élevé · Vérifié : Next.js: Metadata files
The chose personnes obtenir incorrect
“Next.js handles SEO automatiquement.” Il ne fait pas — pas le parties que matter. Suivant.js donne vous le machinery (a metadata système, sitemap et robots conventions, an image component), mais vous encore ont à écrire votre titles, descriptions, et canonicals yourself. Preuve à l’appui de cette affirmation Next.js provides metadata APIs, but developers supply page-specific metadata values. Portée : Next.js App Router metadata and generateMetadata APIs. Niveau de confiance : élevé · Vérifié : Next.js: Metadata and OG images Chaque page nécessite son propre. A site où chaque page shares un titre, or a aucun canonical, est le la plupart courant façon a Suivant.js construire underperforms.
Vouloir le deeper version — le deux routers, le Metadata API, metadataBase, le LCP
image trick, et le mistakes que quietly break indexation? Switch à le Avancé
tab.
«> TL;DR — Next.js solves the hardest JavaScript SEO problems by default *when you
use it right*. The App Router defaults to Server Components and supports SSG/SSR/ISR — all of which ship rendered HTML, so there’s no render-queue delay. Set metadata with the native Metadata API (
metadata/generateMetadata), and remembermetadataBaseor your canonicals and OG images go relative. Useapp/sitemap.tsandapp/robots.ts, pre-build dynamic routes withgenerateStaticParams, setpriorityon the LCP image, and keep links as realnext/linkanchors. The Pages Router is also SEO-capable vianext/head. The failures are predictable — and most of them aren’t Next.js’s fault, they’re yours. » (Traduction) (Résumé en français de la section dix-huit, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
Où Suivant.js fits
Suivant.js est a React framework, donc tout dans JavaScript SEO s’applique. Ce que rend il worth son propre guide est que Suivant.js ships premier-class réponses à la plupart JS-SEO problèmes: serveur rendu, static generation, a metadata système, et sitemap/robots conventions. Le difficile partie n’est pas si Google peut lire il — Google a rendu JavaScript pour années — c’est choosing le correct rendu mode et pas leaving le SEO basics unwired. Ce est a specialized cas de CMS headless SEO: le CMS barely matters, le frontend’s rendu decisions decide tout.
Un framing à garder straight: “ce est a Next.js site” ne fait pas tell vous comment quelconque unique URL est delivered. Rendu mode, mise en cache, et Serveur/Client Component boundaries sont définir per route (parfois per segment) — a project peut mix a static marketing page, an SSR produit page, et a Client Component dashboard. ne pas extrapolate un route’s behavior à “the whole app”; tester le spécifique URL.
Deux routers, deux sets de mechanics
Suivant.js has two routers, and ils handle SEO differently:
«- Pages Router (the older model) — data fetching via getStaticProps /
getServerSideProps; metadata via <Head> from next/head (or the next-seo
package); no Server Components.
» (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.)
«- App Router (v13+, the current and recommended approach) — React Server Components
by default; the native Metadata API (metadata export / generateMetadata);
file conventions for app/sitemap.ts and app/robots.ts; generateStaticParams for
dynamic routes. Preuve à l’appui de cette affirmation The App Router uses Server Components and supports generateStaticParams plus metadata file conventions. Portée : Current Next.js App Router behavior; route rendering can become dynamic based on APIs used. Niveau de confiance : élevé · Vérifié : Next.js: Server and Client Components Next.js: generateStaticParams
» (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.)
Les deux peut classer bien. Le App Router donne vous a cleaner, integrated metadata système (aucun
next/head juggling) et Serveur Components out de le box, qui est pourquoi je voudrais reach pour il
on a nouveau construire. Mais “App Router or vous ne peut pas faire SEO” est a myth — plenty de Pages Router
sites classer fine.
Rendering modes and ce que chaque signifie pour le SEO
«How Google handles JavaScript is a three-phase pipeline — crawl, then a deferred render wave, then index. “All pages with a 200 HTTP status code are sent to the rendering queue.” The whole game in Next.js is choosing a mode that puts your content in the HTML before that render wave, so there’s nothing to wait for. Preuve à l’appui de cette affirmation Google crawls, renders, and indexes JavaScript pages, and successful pages can enter the rendering queue. Portée : Google Search processing, not a promise that a URL will be indexed. Niveau de confiance : élevé · Vérifié : Google: JavaScript SEO basics » (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.)
- Static Site Generation (SSG) — pages pre-rendu à construire temps. HTML est
immédiatement disponible avec aucun rendre-queue risque. Meilleur pour contenu que ne fait pas modifier
chaque minute.
generateStaticParams()(App Router) /getStaticPaths()(Pages Router) decides qui dynamic routes obtenir pre-built. - Incremental Static Regeneration (ISR) — static pages que revalidate après a définir
interval (
export const revalidate = 3600). Robots d’exploration obtenir static HTML avec faible TTFB et le contenu stays fresh. A strong par défaut — avec un trap: après le window expires le suivant requête (possibly Googlebot) encore obtient le stale page; le fresh version sert on la requête après que. Pour genuinely volatile données (prices, stock), SSR est safer. - Rendu côté serveur (SSR) — HTML rendu per requête. Robots d’exploration obtenir entièrement
rendu HTML immédiatement; le tradeoff est serveur latency, donc watch TTFB et LCP.
export const dynamic = 'force-dynamic'or en utilisant requête-time APIs (cookies, headers) opts a route dans SSR. - React Serveur Components (App Router par défaut) — rendre on le serveur et send HTML;
aucun JavaScript ships pour le component itself. Contenu est dans le initial réponse avec aucun
hydration gap. Ce est le meilleur par défaut pour le SEO. Interactivity lives dans Client Components
marked
'use client'. - Rendu côté client (CSR) — rendu entirely dans le navigateur. Googlebot peut indexer
il après le rendre wave (median ~10 seconds, mais le 90th percentile stretches à
hours), et autre robots d’exploration — Bingbot, AI bots, social preview bots — peut obtenir an vide
page. Dans le App Router, CSR est opt-dans (
'use client'); dans lune pages Router, éviter fetching principal contenu dansuseEffect. ne pas utiliser il pour contenu vous vouloir ranked.
A reminder Je garder coming back à: “Googlebot peut rendre il” n’est pas le même as “vous devez faire Googlebot rendre il.” Rendu est expensive, deferred, et pas universal à travers robots d’exploration.
Le Metadata API (App Router)
Le Metadata API est Serveur Component seulement — metadata resolves on le serveur avant
lune page renders, donc il lands dans le initial HTML. Export metadata depuis layout.js or
page.js:
export const metadata: Metadata = {
title: 'My Page',
description: 'Page description',
}Or, quand the tags depend on récupéré données, utiliser generateMetadata():
export async function generateMetadata({ params }) {
const post = await getPost(params.slug)
return { title: post.title, description: post.description }
}The fields que matter pour le SEO:
title— prend en charge a string, a template ('%s | Brand'), a par défaut, et an absolute override. Définir le template une fois dans le root layout et per-page titles inherit il.description,alternates.canonical(le correct façon à définir a canonical dans le App Router),openGraph(images doit resolve à absolute URLs),twitter(aussi utilisé par LinkedIn et Slack previews), etrobots(indexer/suivre plus googleBot-spécifique directives comme max-extrait, max-image-preview).metadataBase— requis pour canonical et OG image URLs à resolve correctement. Forgetting il est le unique la plupart courant Suivant.js metadata bug: relative URLs leak dans votre canonical et Ouvrir Graph balises, breaking social previews et muddying canonical signaux.
A title-template exemple:
// app/layout.tsx
export const metadata: Metadata = {
metadataBase: new URL('https://example.com'),
title: { template: '%s | Brand Name', default: 'Brand Name' },
}
// app/blog/page.tsx
export const metadata: Metadata = { title: 'My Blog Post' }
// Output: <title>My Blog Post | Brand Name</title>Deux gotchas. Premier, metadata est shallowly merged depuis layout à page — a nested
object comme openGraph défini dans a child segment remplace le parent’s entirely, donc
une page-level openGraph: { title: 'Home' } quietly drops quelconque openGraph.images définir dans
le layout. Deuxième — et ce un bites personnes — metadata seulement fonctionne dans Serveur
Components. Export il depuis a 'use client' fichier et il silently ne fait pashing.
«Streaming metadata. For dynamically rendered pages, generateMetadata can stream the
metadata after the initial HTML. Googlebot executes JavaScript and inspects the full DOM,
so streamed metadata works for Google. But Next.js detects “HTML-limited bots” —
Bingbot, Twitterbot, Slackbot, facebookexternalhit — and ships them blocking
metadata in the <head> instead. Per the Next.js docs, “streaming metadata is disabled
for bots and crawlers that expect metadata to be in the <head> tag.” This is automatic;
no configuration needed. It’s a detail almost no competing guide covers, and it’s why
streaming metadata isn’t a risk for the bots that can’t wait for it. Prerendered pages
are a different case entirely — metadata there resolves at build time, so there’s no
stream to worry about. This behavior is version-specific (current as of Next.js 16.2.10);
re-check the generateMetadata docs when you upgrade. And because delivery paths differ
by entry point, verify metadata two ways, not one: a direct/production request (curl -I
or View Source) and a client-side navigation to the same route — the head can update
differently between the two.
» (Traduction) (Résumé en français de la section quarante, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
Metadata with suivant/head (Pages Router)
On lune pages Router, metadata lives in <Head> from next/head:
import Head from 'next/head'
export default function Page() {
return (
<>
<Head>
<title>My Page | Brand</title>
<meta name="description" content="Description" />
<link rel="canonical" href="https://example.com/my-page" />
</Head>
{/* page content */}
</>
)
}Définir titre et description par page (pas simplement dans _app.js), et put a canonical on
chaque page notamment paginated variants. Le next-seo package standardizes ce avec a
<NextSeo> component et structured-données helpers. Migrating à le App Router mostly
signifie trading next/head et next-seo pour le native metadata export.
Faire vous besoin le next-seo package? c’est a tiers plugin (pas partie de Suivant.js
itself) — actively maintained, à v7.2,0 as de ce writing, pas archived. Son propre docs
sont explicit à propos de où il fits: pour standard meta balises on le App Router, le package’s
README recommends en utilisant Suivant.js’s built-dans generateMetadata/metadata export au lieu de
<NextSeo>; on le Pages Router, <NextSeo> est encore a reasonable convenience couche
over next/head. Le un App Router utiliser cas le package encore covers est son JSON-LD
helper components (ArticleJsonLd, FAQPageJsonLd, etc. avec useAppDir), qui some
teams préférer over hand-rolling <script type="application/ld+json">. Bottom line: on a nouveau
App Router construire, reach pour le native Metadata API premier — le package est optional, pas a
requirement, et son propre maintainers dire donc.
Sitemaps
In the App Router, app/sitemap.ts is a fichier convention que outputs /sitemap.xml:
import type { MetadataRoute } from 'next'
export default function sitemap(): MetadataRoute.Sitemap {
return [
{ url: 'https://acme.com', lastModified: new Date(), priority: 1 },
{ url: 'https://acme.com/blog', lastModified: new Date(), priority: 0.8 },
]
}Pour grand sites, generateSitemaps() shards dans plusieurs fichiers (Google’s limite est
50 000 URLs per sitemap), chaque servi à /.../sitemap/[id].xml. Le sitemap sortie aussi
prend en charge image sitemaps, video sitemaps, et localized alternates.languages. On le
Pages Router, utiliser next-sitemap or generate pages/sitemap.xml.js avec
getServerSideProps.
robots.txt
app/robots.ts generates votre robots fichier programmatically:
export default function robots(): MetadataRoute.Robots {
return {
rules: [{ userAgent: '*', allow: '/', disallow: '/private/' }],
sitemap: 'https://acme.com/sitemap.xml',
}
}Per-utilisateur-agent règles et plusieurs sitemaps sont pris en charge. Lune pages Router utilise a static
public/robots.txt. Le règle vous pouveznot obtenir incorrect on soit router: jamais disallow votre
JavaScript or CSS — Google ne va pas rendre depuis bloqué fichiers, et on a JS framework que
peut blank out lune page entirely.
suivant/image et Core Web Vitals
next/image est un de le strongest raisons à utiliser le framework pour le SEO. Il lazy-charge
ci-dessous-le-fold images, exige width/height (or fill) donc il reserves space et
empêche layout shift / CLS, sert WebP/AVIF automatiquement, et emits a proper
srcset depuis le sizes prop. Le unique la plupart important CWV optimization est le
priority prop on votre hero / ci-dessus-le-fold image, qui preloads il pour a faster LCP:
<Image src="/hero.jpg" width={1200} height={630} priority alt="Hero" />Forgetting priority on le LCP image est le la plupart courant Suivant.js CWV mistake — et CWV
problèmes sont widespread on réel Suivant.js sites (voir le Stats tab pour le Salt Agency
données). alt est requis: vide pour decorative images, descriptive pour contenu images.
suivant/lien and maillage interne
next/link renders standard <a href> anchors dans le HTML, donc Google suit les
normally, et il ajoute client-side navigation plus background prefetching de dans-viewport
liens dans production. Le SEO règle est simple: utiliser next/link pour lien internes, et jamais
substitute an onClick handler or JavaScript navigation que ne fait pas produce a réel
anchor — ceux liens ne sont pas crawlable. Utiliser prefetch={false} on faible-valeur liens à enregistrer
bandwidth si vous devez.
Dynamic routes and generateStaticParams
generateStaticParams() indique Suivant.js qui dynamic routes to pre-render at construire temps:
// app/blog/[slug]/page.tsx
export async function generateStaticParams() {
const posts = await getPosts()
return posts.map((post) => ({ slug: post.slug }))
} «Pages built this way are fully static HTML — best for SEO. Without it, dynamic routes are
rendered on-demand (SSR) by default, which is fine but reintroduces server latency. Combine
it with revalidate (ISR) for content that updates regularly. Make sure all important
dynamic URLs are in generateStaticParams so nothing waits on the render queue.
» (Traduction) (Résumé en français de la section soixante-trois, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«## Structured data (JSON-LD) » (Traduction) (Résumé en français de la section soixante-quatre, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«The Metadata API has no structured-data field — you inject JSON-LD as a <script> in a
Server Component, which keeps it in the server-rendered HTML at zero client-bundle cost:
» (Traduction) (Résumé en français de la section soixante-cinq, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
const jsonLd = { '@context': 'https://schema.org', '@type': 'Article', /* … */ }
return <script type="application/ld+json"
dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd) }} />Article/BlogPosting, BreadcrumbList, Produit, et FAQPage sont le usual types. Valider avec le Résultats enrichis Tester après quelconque rendu modifier.
Courant Suivant.js SEO mistakes
Drawn depuis réel audits et le patterns ci-dessus:
- Manquant or relative canonicals — souvent depuis a forgotten
metadataBase, qui aussi breaks OG image URLs. - Aucun
priorityon le LCP image — le biggest CWV miss. - 404 views returning
200— utiliser le built-dansnotFound()à retourner a réel status; soft 404s sont rampant on Suivant.js sites. metadataexported depuis a Client Component — silently ne fait pashing; c’est Serveur Component seulement.- CSR pour principal contenu — fetching critical contenu dans
useEffectsignifie non-Google robots d’exploration obtenir vide pages. - Hash (
#) routing au lieu de le History API — ceux views ne sont pas séparément crawlable. - Pas exporting
generateStaticParams— dynamic routes rendre on-demand au lieu de étant pre-built. openGraphoverwritten par layout inheritance — child segments remplacer, pas merge.- Blocking JS/CSS dans robots.txt or via a Contenu Security Policy que arrête Googlebot’s headless Chrome depuis chargement scripts — tester avec Inspection d’URL.
Deployment notes
Suivant.js est construit par Vercel; hosting là donne tight integration (edge CDN pour static et
ISR pages, bon TTFB) mais n’est pas requis. Define redirection permanentes dans redirects() dans
next.config.js (renvoie 308, or 301 avec permanent: true) pour fiable signaling à
robots d’exploration, définir security et mise en cache headers via headers(), et utiliser X-Robots-Tag réponse
headers pour path-based noindex règles quand per-page robots metadata est awkward.
Ce que à vérifier où. Cache state, code d’états, redirections, et streamed metadata ne pas tout montrer up dans le même tester — a route peut regarder fine dans un vérifier et encore être broken dans un autre:
| Vérifier | Où à regarder | Pourquoi il peut differ depuis ce que vous voir rendu |
|---|---|---|
| Cache/revalidation age | Réponse headers on a direct requête (curl -I) | ISR peut servir a stale page on la requête correct après le window expires |
| Direct HTTP status | curl -I on le production URL, pas le rendu UI | A “pas trouvé” view sans notFound() encore renvoie 200 |
| Redirection behavior | Le réel context que fires il — redirect() dans a Serveur Action, a Route Handler, vs. a client onClick | Code d’état et réponse chemin differ par invocation context, pas simplement le destination |
| Streamed metadata | Direct requête et client-side navigation à le même route | Ordinary clients peut obtenir streamed metadata; HTML-limited bots obtenir blocking metadata; le deux paths ne sont pas identical |
| Client-side transitions | Navigate dans-app, alors re-vérifier le <head> | A route c’est correct on premier charger peut drift après a client transition |
None de ce est guaranteed par le framework — Suivant.js donne vous le mechanisms
(redirects(), notFound(), revalidation, streaming), mais cache keys, invalidation,
preview state, et deployment configuration sont encore votre responsibility à obtenir correct et
à tester dans production, pas simplement locally.
«One last note on dynamic rendering — serving prerendered HTML to bots and JavaScript to users. Google has deprecated it as a recommendation: “dynamic rendering was a workaround and not a long-term solution.” You don’t need it on Next.js anyway — SSR, SSG, ISR, and Server Components all put content in the HTML natively. Mention it so you recognize it in an audit; don’t build on it. » (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.)
Le happy chemin: App Router + Serveur Components + ISR + le Metadata API (avec
metadataBase) + next/image avec priority. Obtenir ceux correct et la plupart de Suivant.js SEO est
handled.
AI summary
A condensed prendre on the Avancé version:
«- Next.js solves most JS-SEO problems by default — if you pick the right rendering
mode and wire up the basics. The framework gives you infrastructure; it writes none of
your tags.
» (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.)
«- Two routers: App Router (v13+, recommended) uses Server Components and the native
Metadata API; Pages Router uses next/head / next-seo. Both can rank.
» (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.)
«- Rendering modes: SSG and Server Components are the best default (content in
the HTML, no render-queue delay). ISR is a strong middle ground but has a
stale-on-first-request-after-revalidation trap. SSR for volatile data. CSR is
risky — non-Google crawlers may get an empty page.
» (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.)
«- Metadata API (App Router): metadata export or generateMetadata(), Server
Component only. metadataBase is required or canonicals and OG images go relative.
openGraph in a child segment replaces the parent’s; metadata in a 'use client'
file does nothing.
» (Traduction) (Résumé en français de la section quatre-vingt-deux, sous-partie quatre : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Streaming metadata works for Google but Next.js ships blocking metadata to
HTML-limited bots (Bingbot, Twitterbot, Slackbot, facebookexternalhit) automatically.
» (Traduction) (Résumé en français de la section quatre-vingt-deux, sous-partie cinq : le texte source est conservé pour vérification lors de la relecture francophone.)
«- File conventions: app/sitemap.ts (with generateSitemaps() for 50k+ URLs) and
app/robots.ts. Never block .js/.css.
» (Traduction) (Résumé en français de la section quatre-vingt-deux, sous-partie six : le texte source est conservé pour vérification lors de la relecture francophone.)
«- next/image prevents CLS, serves WebP/AVIF; set priority on the LCP image —
the top CWV win. next/link renders real crawlable <a href> anchors and prefetches.
» (Traduction) (Résumé en français de la section quatre-vingt-deux, sous-partie sept : le texte source est conservé pour vérification lors de la relecture francophone.)
«- generateStaticParams pre-builds dynamic routes; without it they render on-demand.
» (Traduction) (Résumé en français de la section quatre-vingt-deux, sous-partie huit : le texte source est conservé pour vérification lors de la relecture francophone.)
«- JSON-LD is injected as a <script> in a Server Component (no Metadata API field).
» (Traduction) (Résumé en français de la section quatre-vingt-deux, sous-partie neuf : le texte source est conservé pour vérification lors de la relecture francophone.)
«- The next-seo package is optional, not required. It’s actively maintained
third-party software (v7.2.0, not archived), and its own docs recommend the built-in
generateMetadata/metadata export for App Router meta tags — <NextSeo> remains
useful mainly on the Pages Router, or for its JSON-LD helper components.
» (Traduction) (Résumé en français de la section quatre-vingt-deux, sous-partie dix : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Rendering mode is set per route, not per project — don’t assume one URL’s behavior
from another’s; test the specific route (direct request and client navigation both).
» (Traduction) (Résumé en français de la section quatre-vingt-deux, sous-partie onze : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Top mistakes: missing metadataBase, no LCP priority, 404s returning 200 (use
notFound()), metadata in a Client Component, CSR primary content.
» (Traduction) (Résumé en français de la section quatre-vingt-deux, sous-partie douze : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Dynamic rendering is deprecated — you don’t need it; SSR/SSG/ISR/Server Components
cover it.
» (Traduction) (Résumé en français de la section quatre-vingt-deux, sous-partie treize : le texte source est conservé pour vérification lors de la relecture francophone.)
«## Official documentation » (Traduction) (Résumé en français de la section quatre-vingt-cinq, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«Primary-source documentation from Next.js and the search engines. » (Traduction) (Résumé en français de la section quatre-vingt-six, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«Next.js
» (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.)
«- Metadata and OG Images — the App Router metadata system, metadataBase, and OG image generation.
» (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.)
«- generateMetadata API Reference — static metadata vs. generateMetadata, streaming metadata, and the HTML-limited bots list.
» (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.)
«- sitemap.xml File Convention — app/sitemap.ts, generateSitemaps(), image/video/localized sitemaps.
» (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.)
«- robots.txt File Convention — app/robots.ts, per-user-agent rules, and multiple sitemaps.
» (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.)
«- Learn: SEO — Next.js’s own SEO learning path (introductory; partly predates the App Router).
» (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.)
«Google » (Traduction) (Résumé en français de la section quatre-vingt-huit, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.) «- Understand JavaScript SEO Basics — the crawl → render → index pipeline, the 200-status rendering queue, soft 404s in SPAs, canonicals, and the History API. » (Traduction) (Résumé en français de la section quatre-vingt-huit, sous-partie deux : le texte source est conservé pour vérification lors de la relecture francophone.) «- Dynamic Rendering (deprecated workaround) — why Google deprecated it and what to use instead (SSR, static rendering, hydration). » (Traduction) (Résumé en français de la section quatre-vingt-huit, sous-partie trois : le texte source est conservé pour vérification lors de la relecture francophone.) «- In-Depth Guide to How Google Search Works — where rendering sits in crawl → index → serve. » (Traduction) (Résumé en français de la section quatre-vingt-huit, sous-partie quatre : le texte source est conservé pour vérification lors de la relecture francophone.)
«Bing / Microsoft » (Traduction) (Résumé en français de la section quatre-vingt-neuf, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.) «- IndexNow / indexnow.org — the push protocol to wire to a Next.js publish/revalidation event. » (Traduction) (Résumé en français de la section quatre-vingt-neuf, sous-partie deux : le texte source est conservé pour vérification lors de la relecture francophone.)
«## Quotes from the source » (Traduction) (Résumé en français de la section quatre-vingt-douze, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
On-le-record statements depuis Google, Suivant.js, et Google reps. Chaque lien est a deep lien que jumps à le quoted passage on le page source.
Google — comment JavaScript pages sont processed
«- “All pages with a 200 HTTP status code are sent to the rendering queue, no matter whether JavaScript is present on the page.” — Google Search Central docs. Jump to quote » (Traduction) (Résumé en français de la section quatre-vingt-quinze, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
Google — dynamic rendu est deprecated
«- “Dynamic rendering was a workaround and not a long-term solution for problems with JavaScript-generated content in search engines.” — Google Search Central docs. Jump to quote » (Traduction) (Résumé en français de la section quatre-vingt-dix-sept, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.) «- “…creates additional complexities and resource requirements.” — Google Search Central docs. Jump to quote » (Traduction) (Résumé en français de la section quatre-vingt-dix-sept, sous-partie deux : le texte source est conservé pour vérification lors de la relecture francophone.)
Suivant.js — streaming metadata et HTML-limited bots
«- “Streaming metadata is disabled for bots and crawlers that expect metadata to be in the <head> tag (e.g. Twitterbot, Slackbot, Bingbot).”
— Next.js docs, generateMetadata.
Jump to quote
» (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.)
John Mueller, Google (via Moteur de recherche Journal coverage)
- On le growing role de JavaScript dans SEO: “vous êtes going à exécuter dans significantly plus JavaScript over le suivant years que dans le 2-ish decades dans SEO avant. Si vous êtes keen on technique SEO, alors past HTML vous êtes going à besoin à understand JS plus et plus.” Lire le coverage
Suivant.js SEO checklist
A rapide réussir to confirmer a Suivant.js site is crawlable, indexable, and fast:
- Principal contenu renders dans HTML on premier requête (Serveur Components / SSG / SSR / ISR) — pas seulement après client-side JavaScript.
- Aucun important page dépend on CSR pour son principal contenu.
- Chaque page a a unique titre et description (utiliser a titre
templatedans le root layout). -
metadataBaseest définir dans le root layout (App Router) donc canonicals et OG images sont absolute. - A canonical est définir par page via
alternates.canonical(App Router) or<link rel="canonical">(Pages Router) — pas a unique shared homepage canonical. -
metadataest exported seulement depuis Serveur Components, jamais a'use client'fichier. -
generateStaticParamscovers tout important dynamic routes. -
app/sitemap.ts(ornext-sitemap) outputs a actuel sitemap;generateSitemaps()shards sites over 50k URLs. -
app/robots.ts/public/robots.txtexists et ne fait pas bloquer.jsor.css. - Images utiliser
next/imageavecwidth/heightorfill; le LCP image apriority; tout ontalt. - Lien internes utiliser
next/link(réel<a href>) — aucunonClick-seulement navigation. - 404 views appel
notFound()et retourner a réel404(aucun soft 404s). - JSON-LD est injected dans a Serveur Component
<head>/corps et passes le Rich Résultats Tester. - Redirection permanentes actif dans
redirects()dansnext.config.js(308 /permanent).
The mental models
1. Rendu mode est le produit. Avant debugging n’importe quoi dans a Suivant.js site, réponse un question: comment est ce route rendu? Serveur Components / SSG / SSR / ISR put contenu dans le HTML et sont faible-risque; CSR est le risky un. Presque chaque Suivant.js SEO problème resolves à ce.
2. Le framework donne infrastructure, pas contenu. Suivant.js ships le Metadata API, sitemap/robots conventions, et le Image component — mais il écrit none de votre titles, descriptions, canonicals, or données structurées. “Suivant.js handles SEO automatiquement” est le la plupart expensive myth ici.
3. Un source de truth pour URLs.
Définir metadataBase une fois et construire canonicals, OG images, et sitemap entries depuis il
(absolute, jamais relative). Un base URL kills le relative-canonical et broken-OG-image
class de bugs.
4. Serveur Components premier, Client Components seulement où nécessaire.
Par défaut à Serveur Components donc contenu et metadata land dans le HTML. Reach pour
'use client' seulement pour interactivity — et remember metadata ne peut pas come depuis a Client
Component.
5. Le décision règle pour rendu. Mostly static (blogs, docs, marketing) → SSG (or ISR on a timer). Toujours-fresh / volatile (prices, stock) → SSR. Changements hourly/daily, vouloir static speed → ISR (mind le stale-premier-requête trap). Interactive, behind a login, non indexée → CSR est fine. Public contenu vous vouloir ranked → jamais CSR.
Suivant.js SEO — cheat sheet
Rendering modes
| Mode | Où HTML is construit | SEO | Meilleur pour | Watch out pour |
|---|---|---|---|---|
| SSG | Construire temps → static | ✅ Meilleur | Mostly-static content | Stale jusqu’à rebuild |
| Server Components | Server (App Router par défaut) | ✅ Meilleur | La plupart content | Interactivity nécessite Client Components |
| ISR | Static + timed regen | ✅ Bon | Hourly/daily content | Premier requête post-revalidation is stale |
| SSR | Server, per requête | ✅ Bon | Always-fresh données | Plus élevé TTFB / infra cost |
| CSR | In le navigateur | ⚠️ Risky | Logged-in dashboards | Vide page to non-Google robots d’exploration |
«App Router vs Pages Router » (Traduction) (Résumé en français de la section cent vingt et un, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
| Fonctionnalité | App Router | Pages Router |
|---|---|---|
| Metadata | metadata / generateMetadata | next/head + next-seo |
| Server Components | Par défaut | Indisponible |
| Streaming metadata (bot-aware) | Yes | Aucun |
| Sitemap | app/sitemap.ts | next-sitemap / manual |
| Robots | app/robots.ts | public/robots.txt |
| Canonical | alternates.canonical | <link rel="canonical"> in <Head> |
| Données fetching | async Server Components | getStaticProps / getServerSideProps |
Rapide règles
- Définir
metadataBaseor canonicals/OG images go relative. metadataest Serveur Component seulement —'use client'exports ne faites pashing.- Child-segment
openGraphremplace le parent’s (aucun merge). priorityon le LCP image = le top CWV win.- Lien internes =
next/link(réel<a href>); aucunonClick-seulement nav. - 404 → appel
notFound()(réel404, pas soft 404). - Jamais disallow
.js/.css. - Streaming metadata → blocking pour Bingbot, Twitterbot, Slackbot, facebookexternalhit.
- Dynamic rendu: deprecated — utiliser SSR / SSG / ISR / Serveur Components.
Rapide checks pour a Suivant.js construire
A few command-line checks avant vous reach pour a complet robot d’exploration.
Is votre content in the raw HTML (or seulement après JS runs)?
macOS / Linux:
# Raw HTML as the server sends it — the "first fetch", before any client JS
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 headline actually in the raw HTML? (empty result = CSR / JS-dependent)
grep -o "Your headline text" raw.html
# Did metadataBase do its job? Canonical and OG URLs should be absolute, not relative
grep -iE 'rel="canonical"|og:(url|image)' 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"
Select-String -Path raw.html -Pattern 'rel="canonical"','og:url','og:image'Si le headline est manquant depuis raw.html mais montre dans votre navigateur, que route est
client-rendu. Si canonicals or OG image URLs come out relative, vous avez forgotten
metadataBase.
Confirmer vous aren’t blocking JS/CSS (notamment the Suivant.js _next directory)
macOS / Linux:
curl -sL https://example.com/robots.txt | \
grep -iE "disallow.*\.(js|css)|Disallow:\s*/_next"Windows (PowerShell):
(Invoke-WebRequest "https://example.com/robots.txt").Content |
Select-String -Pattern "Disallow.*\.(js|css)","Disallow:\s*/_next"Quelconque match ici est presque toujours a mistake — Google ne va pas rendre depuis bloqué fichiers. A plain
curl ne peut pas exécuter JavaScript, donc pour le rendu DOM utiliser Inspection d’URL’s “View Exploré
Page → rendu HTML.”
Outils pour auditing a Suivant.js site
- Inspection d’URL (Recherche Google Console) — le source de truth. Exécuter a actif tester,
alors view le rendu HTML, screenshot, et page resources (ce que chargé vs.
ce que était bloqué) à catch CSR gaps et bloqué
_nextresources. - Résultats enrichis Tester — confirmer JSON-LD fait il dans le rendu sortie après quelconque rendu modifier.
- Lighthouse / Chrome DevTools — mesurer LCP, CLS, et INP; vérifier si votre hero
image est preloaded (
priority). - Ahrefs Site Audit — explore avec JavaScript rendu, surfacing manquant/relative canonicals, broken metadata, chaîne de redirectionss, et indexability problèmes à travers le frontend.
- Screaming Frog SEO Spider — explorer avec JS rendu on/off à diff raw vs. rendu HTML, et construire pre/post explorer comparisons pour migrations.
- Bing Webmaster Outils — Bing’s Inspection d’URL et où IndexNow submissions apparaître.
Mistakes to éviter on Suivant.js
Concrete patterns que quietly break SEO on réel Suivant.js builds — prevent ces avant ils ship, plutôt que debugging les après a trafic drop.
Shipping sans metadataBase in the root layout
Pourquoi c’est incorrect: sans metadataBase, alternates.canonical et openGraph.images
resolve à relative paths au lieu de absolute URLs. A relative canonical peut confuse
canonicalization signaux, et relative OG image URLs break lien previews on social et
messaging apps.
Que faire à la place: définir metadataBase: new URL('https://example.com') une fois dans
app/layout.tsx et let chaque page inherit il. Vérifier il avec grep -iE 'rel="canonical"|og:(url|image)' contre a raw HTML récupérer — l’URLs devrait commencer avec https://.
Overwriting a layout’s openGraph depuis a child segment
Pourquoi c’est incorrect: metadata merges shallowly depuis layout à page. Une page-level
openGraph: { title: 'Home' } ne fait pas merge avec le layout’s openGraph.images — il
remplace le entier object, silently dropping le images.
Que faire à la place: soit repeat le complet openGraph object (images inclus) à
chaque level que overrides il, or seulement override le spécifique top-level metadata champs vous
en réalité besoin à modifier, et laisser openGraph untouched où le layout’s par défaut est fine.
Exporting metadata depuis a Client Component
Pourquoi c’est incorrect: le Metadata API est Serveur Component seulement. Ajouter 'use client' à a fichier
que aussi exports metadata et le export ne fait pashing — aucun erreur, aucun warning, simplement a
page avec aucun titre or description.
Que faire à la place: garder metadata / generateMetadata exports dans a plain Serveur
Component fichier (page.tsx or layout.tsx sans 'use client'). Si une page nécessite client
interactivity, put que dans a séparé child component et import il — ne pas ajouter
'use client' à le fichier que owns le metadata export.
Fetching principal content in useEffect (or relying on complet CSR)
Pourquoi c’est incorrect: contenu rendu seulement dans le navigateur n’est pas dans le initial HTML. Google va eventually rendre il, mais le median rendre delay est réel et le 90th percentile stretches à hours — et non-Google robots d’exploration (Bing, social preview bots, la plupart AI robots d’exploration) souvent ne pas rendre JavaScript à tout, donc ils voir an vide page.
Que faire à la place: par défaut à Serveur Components, SSG, ISR, or SSR pour n’importe quoi vous
vouloir indexé. Reserve 'use client' et useEffect données-fetching pour interactive UI que
ne fait pas besoin à être crawlable — a filter widget, pas le article corps.
Returning 200 pour a “not found” view
Pourquoi c’est incorrect: rendu a “pas trouvé” message sans appel notFound() renvoie a
normal 200 status. c’est a soft 404 — Google peut indexer le empty-contenu page au lieu de
recognizing il as manquant, et soft 404s sont un de le la plupart courant real-world Suivant.js SEO
problèmes.
Que faire à la place: appel le built-dans notFound() function donc le route renvoie a réel
404. Confirmer avec curl -I on a known-manquant URL et vérifier le code d’état directement,
pas simplement ce que renders dans le navigateur.
«### Skipping generateStaticParams on important dynamic routes
» (Traduction) (Résumé en français de la section cent cinquante-neuf, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
Pourquoi it’s incorrect: sans it, dynamic routes fall back to on-demand rendering (SSR), qui encore fonctionne pour le SEO but adds server latency to every premier requête pour que URL — notamment Googlebot’s.
Que faire à la place: enumerate l’URLs que matter (produit pages, blog posts,
category pages) dans generateStaticParams() donc ils sont pre-built, et pair il avec
revalidate (ISR) pour contenu que changements après launch.
Testez vos connaissances: Suivant.js SEO
Five rapide questions on making a Suivant.js site crawlable, indexable, et rapide. Pick an réponse pour chaque, alors vérifier.
Ressources utiles
Mon connexe writing
- JavaScript SEO: A Definitive Guide — mon complet guide à rendu, DOM parity, canonicals dans JS, sitemaps, et le rendu-mode trade-offs que Suivant.js sits on top de. Ce Suivant.js guide est le framework-spécifique couche on top de il.
- Le Beginner’s Guide à SEO technique — où rendu et exploration fit dans le bigger picture.
Mon speaking
- JavaScript SEO — Ungagged 2019 (SlideShare) — mon walkthrough de comment frameworks séparé frontend depuis backend et comment Googlebot renders. (Standing disclaimer: le dynamic-rendu recommendation dans que deck est maintenant outdated — Google deprecated il.)
Depuis autour le industry
- Metadata et OG Images (Suivant.js docs) — le App Router metadata système,
metadataBase, et OG image generation. - generateMetadata API Référence (Suivant.js docs) — static vs. dynamic metadata et le HTML-limited bots / streaming-metadata behavior.
- sitemap.xml Fichier Convention (Suivant.js docs) —
app/sitemap.ts,generateSitemaps(), et localized/image sitemaps. - Courant SEO Problèmes on Suivant.js Sites web (Salt Agency) — a 50-site audit study avec réel données on soft 404s et LCP échecs.
- Comment Google Handles JavaScript Throughout le Indexation Traiter (Vercel) — rendre-timing données depuis nextjs.org’s propre serveur beacons.
- Le Complet Suivant.js SEO Guide (Strapi) — a thorough framework-walkthrough covering rendu modes, metadata, et données structurées.
- App Router vs Pages Router pour le SEO (Wisp) — a focused comparaison de le deux routers depuis an SEO angle.
- r/TechSEO — le community pour rendu/indexation debugging.
Stats worth citing
- Rendre timing est généralement rapide, occasionally very lent. Vercel’s analysis de 37 000+ serveur-beacon pairs on nextjs.org trouvé a median rendre temps de ~10 seconds, mais a 90th percentile de ~3 hours et a 99th percentile de ~18 hours — qui est exactly pourquoi vous ne pas vouloir principal contenu waiting on le rendre queue. Source
- CWV et soft 404s sont widespread on réel Suivant.js sites. Salt Agency’s audit de 50
Suivant.js sites trouvé 41/50 returning soft 404s (404 views à a
200status) et seulement 3/50 passing LCP thresholds — a reminder que le framework’s CWV advantages seulement aider si vous utilisernext/imageavecpriorityet retourner réel code d’états. Source
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.
-
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.