Join our community of websites already using SEOJuice to automate the boring SEO work.
See what our customers say and learn about sustainable SEO that drives long-term growth.
Explore the blog →TL;DR : Le SEO des SPA n’est plus un problème de rendu, c’est un problème de livraison : les URL, les codes-statut, les métadonnées et le contenu principal doivent exister avant que JavaScript n’entre en jeu, car Google peut rendre la page tardivement et les crawlers dopés à l’IA ne rendent souvent rien du tout.
La plupart des conseils sur le SEO des SPA commencent encore par la mauvaise question : Google peut-il rendre JavaScript ?
Oui. Google peut rendre JavaScript. Martin Splitt le répète depuis des années, et pourtant beaucoup déboguent encore les SPA en scrutant view-source: comme si c’était la page indexée par Google.
« Beaucoup de gens regardent encore le code source. Ce n’est pas ce que nous utilisons pour l’indexation. Nous utilisons le HTML rendu. »
Martin Splitt, Developer Advocate chez Google
Cette citation compte parce qu’elle met fin à une mauvaise habitude. Si vous inspectez seulement le code source initial d’une application React, Vue, Angular, SvelteKit, Nuxt, Remix ou Next.js, vous risquez de passer à côté de ce que Google voit réellement. Le DOM rendu est essentiel.
Mais cela ne signifie pas que le rendu côté client est sûr pour chaque route publique. Le rendu coûte du temps. Il peut échouer. Il peut se produire après le crawl. D’autres bots ne rendront peut-être jamais la page. La vraie question pour le spa seo est : le crawler reçoit-il un document exploitable assez tôt ?
« View source » montre la première réponse HTML. Pour une appli CSR classique, cette réponse peut être une coque vide, un nœud racine, un bundle JavaScript et un espoir. Google peut rendre la page plus tard, exécuter la route, appeler les API et découvrir le vrai contenu. Peut-être.
C’est ce « peut-être » qui rend les classements instables. La page peut être parfaite dans votre navigateur et rester fragile pour la recherche ; le navigateur est patient, les crawlers fonctionnent avec des files d’attente, des budgets, des time-outs et des modes d’échec.
seojuice.io est sciemment divisé : les pages publiques envoient du HTML statique en premier, le tableau de bord connecté se comporte comme une appli. Deux stratégies de rendu sous un même domaine, car ces routes ont des objectifs différents.
Le blog, les outils et les landing pages doivent être trouvés, crawlés, compris, partagés et cités. Le tableau de bord n’a pas besoin de ranquer sur « interface scoring santé page » et ne le fera jamais. JavaScript peut enrichir la page publique après le chargement, mais la première réponse doit déjà ressembler à une page.
Pendant des années, j’ai traité cela comme un problème propre à Google (je me trompais). Puis les crawlers IA ont empiré l’ancien raccourci.
« Les résultats montrent systématiquement qu’aucun des principaux crawlers IA ne rend actuellement JavaScript. »
Vercel Engineering
Si GPTBot, ClaudeBot, PerplexityBot ou un autre crawler ne voit qu’une coque d’appli, votre contenu est invisible pour cette surface. Le rendu de Google aide Google (et seulement Google) : il ne sauve pas tous les crawlers, bots d’aperçu, outils de monitoring, parseurs sociaux ou systèmes d’ingestion IA.
C’est l’étape que la plupart des équipes sautent. Elles se demandent si toute la SPA doit passer en SSR. Ce cadrage gaspille du temps d’ingénierie.
Une vraie SPA mélange presque toujours deux choses : des pages crawlables et des états d’application privés. Pages de tarifs, articles de blog, documentation, templates, intégrations, pages de comparaison, pages produits : ce sont des pages. Tableaux de bord, étapes d’onboarding, modales, filtres, écrans de compte, rapports sauvegardés : ce sont des états d’appli.
La correction commence par la classification. Ne demandez pas aux devs de « corriger le SEO de l’appli ». Demandez-leur de marquer les routes qui méritent du trafic de recherche, puis choisissez rendu, indexation, canoniques et codes-statut par route.
| Type de route | Doit ranquer ? | Choix de rendu | Règle d’indexation |
|---|---|---|---|
| Article de blog | Oui | SSG ou SSR | Index, canonique vers soi |
| Landing page produit | Oui | SSG ou SSR | Index, canonique vers soi |
| Page de résultats de recherche | Souvent non | CSR ou SSR | Souvent noindex |
| Route de tableau de bord | Non | CSR suffisant | Bloquer derrière auth ou noindex |
| URL de filtre à facettes | Parfois | SSR seulement si curé | Canonique ou noindex |
Voilà comment je l’explique dans un audit technique SEO. Une SPA avec 40 URL publiques et 4 000 états de tableau de bord n’a pas 4 040 pages SEO. Elle a 40 pages et une interface produit.
Cette distinction change la roadmap. Les routes publiques ont besoin d’URL stables, de canoniques auto-référencées, de métadonnées servies côté serveur, de liens crawlables, d’un HTML utile dès le premier octet et des bons codes-statut. Les routes de tableau de bord nécessitent interaction rapide, auth, gestion d’état et confidentialité. Imposer un seul modèle de rendu aux deux groupes dégrade généralement les deux.
Chez mindnow, c’était l’erreur SPA la plus fréquente que je voyais sur les projets clients. L’équipe voulait une architecture front élégante unique. La recherche voulait des documents ennuyeux. Le compromis n’était pas d’abandonner l’appli, mais d’arrêter de prétendre que chaque route a le même objectif.
La stratégie de rendu est un choix d’architecture, pas un réglage de plugin SEO : si vous choisissez le mauvais modèle, chaque ticket suivant devient un contournement.
Le rendu côté client convient très bien aux écrans logiciels authentifiés. Si l’utilisateur doit se connecter, les crawlers ne devraient pas indexer la route de toute façon. Le CSR devient risqué lorsque la même coque d’appli sert des pages de tarifs, docs, articles et pages produits dont le contenu n’apparaît qu’après l’exécution de JavaScript et la réponse des API.
La génération statique construit les pages en HTML avant le déploiement (ou pendant). Pour les blogs, docs, changelogs, glossaires, templates et la plupart des contenus marketing, le SSG est difficile à battre : rapide, cacheable, économique et ami des crawlers.
Le rendu côté serveur est plus adapté quand le contenu public varie selon la requête, la géographie, le stock, les permissions ou la fraîcheur. Lee Robinson a résumé simplement le modèle Next.js :
« Next.js pré-rend la page en HTML côté serveur à chaque requête. »
Lee Robinson, VP Developer Experience chez Vercel
Le SSR donne du HTML aux crawlers sans attendre le bundle client, tout en reflétant des données fraîches.
L’Incremental Static Regeneration (pages statiques régénérées après publication) est souvent le meilleur compromis pour de vastes bibliothèques de contenu. Vous obtenez du HTML statique pour la plupart des requêtes, puis une régénération quand le contenu change. Pour le SEO programmatique, la doc et les grosses librairies de templates, l’ISR évite les rebuilds douloureux sans basculer en CSR complet.
Le dynamic rendering sert une version aux crawlers et une autre aux utilisateurs. Il peut sauver une SPA legacy quand la migration n’est pas prête, mais je ne bâtirais pas une nouvelle stratégie de recherche dessus.
« Je verrais ça comme une solution temporaire – où temporaire peut signifier quelques années – mais c’est plutôt un palliatif limité dans le temps. »
John Mueller, Search Advocate chez Google
C’est le bon état d’esprit. Utilisez le dynamic rendering comme pont, puis remplacez-le par des routes publiques server-rendered ou static-first.
Les échecs SEO d’une SPA sont généralement ennuyeux. Pas des pénalités mystérieuses, mais des bugs de livraison.
Le premier piège est la coque universelle. Chaque URL renvoie la même réponse 200, le même nœud vide et le même bundle. Le routeur décide plus tard si /pricing, /docs/api ou /totally-fake-url existe. Cela fait trop travailler les crawlers et crée le deuxième piège : les soft 404.
« Au lieu de répondre 404, ça répond 200 … en montrant toujours une page après exécution du JavaScript. »
Martin Splitt, Developer Advocate chez Google
Les routes invalides doivent renvoyer de vrais codes 404 ou 410. Un composant « page non trouvée » côté client servi avec un 200 reste un mauvais signal (c’est le piège « soft 404 » qui dilapide le budget d’indexation).
Troisième piège : la navigation qu’un crawler ne peut pas suivre. Boutons, handlers de clic, composants custom et événements du routeur sont parfaits pour l’interaction, mais la découverte interne a toujours besoin d’ancres crawlables avec de vrais attributs href. Si vos pages clés ne sont atteignables qu’après un clic JavaScript, votre crawlabilité est plus faible qu’il n’y paraît.
Les métadonnées sont un autre écueil. Beaucoup de SPA mettent à jour titres, descriptions, canoniques, robots, Open Graph et schéma après changement de route. Visuellement ça marche, mais ça peut échouer pour les crawlers, parseurs sociaux et bots IA. Les métadonnées spécifiques à la route doivent être présentes dans le HTML renvoyé pour toute URL indexable.
Les canoniques méritent leur propre alerte. J’ai vu des applis hydratées écraser un canonical correct avec un domaine de staging, une URL racine ou la route précédente. Ce bug est silencieux. Personne ne le voit avant que des URLs dupliquées se groupent mal ou que la mauvaise page ranque.
Le scroll infini est aussi un piège quand il cache le contenu derrière l’état client. Si la page 2, page 3 et les anciens éléments n’ont pas d’URL crawlables, les moteurs ne les découvriront jamais. Préférez des URLs paginées pour les archives et catégories importantes.
Un contenu principal chargé via API est fragile. Si le H1, le corps, les détails produit, les avis ou les liens internes nécessitent deux appels API après l’hydratation, vous avez plus de points de défaillance. Le trafic bot peut atteindre des limites de débit. Les API peuvent bloquer des user agents inconnus. Les time-outs peuvent laisser le DOM rendu maigre.
Le hash routing doit rester hors des pages publiques indexables. Une URL comme /docs#pricing marche pour un fragment, mais un routage basé sur le hash pour de vraies pages complique inutilement découverte, canonisation et analytics.
Enfin, surveillez auth et poids du bundle ensemble. Du contenu public accidentellement protégé par un contrôle login peut disparaître des crawlers. Des bundles lourds retardent le rendu et gaspillent le budget de crawl. Les deux ressemblent à des problèmes « JavaScript SEO », mais la solution pratique est un découpage plus propre des routes et moins de travail client pour les pages publiques.
La meilleure règle SPA SEO que je connaisse est simple : si la route mérite du trafic de recherche, la première réponse doit ressembler à une page.
Chaque URL publique doit donc renvoyer du HTML utile avec les signaux clés déjà en place :
<title> correcte ;
Puis JavaScript peut hydrater les composants, personnaliser des éléments, charger des calculateurs, suivre des événements, filtrer des tableaux et enrichir l’expérience. Il ne doit pas être requis pour que le crawler comprenne le sujet de la page.
C’est aussi là que l’architecture de site et le SEO des SPA se rejoignent. Une route publique sans liens crawlables pointant vers elle reste faible, même en server-rendered. Un document magnifiquement rendu mais enfoui à cinq clics derrière une navigation client-only ne performera pas comme une page placée dans un maillage interne clair.
La règle du document-first garde les équipes honnêtes. La page tarifs est un document. Un article de blog est un document. Une page de doc est un document. Un filtre sauvegardé, une modale ouverte ou une étape d’onboarding est un état d’appli. Traiter l’état d’appli comme une page de recherche crée du bloat. Traiter les pages publiques comme un état d’appli les rend invisibles.
Chez seojuice.io, cette séparation est voulue. Les routes publiques doivent être assez ennuyeuses pour les crawlers. Le produit peut rester interactif après login. Ces deux idées cohabitent.
Si vous testez seulement l’expérience navigateur, vous testez le scénario le plus heureux. Le SEO des SPA a besoin de tests plus rugueux.
curl -I https://example.com/missing-route.Le test le plus inconfortable est celui du H1. Si Googlebot a besoin de cinq étapes et deux appels API pour trouver le H1, la page est fragile même si elle finit indexée.
Screaming Frog, Sitebulb, Google Search Console, Chrome DevTools, Rich Results Test et les logs serveur aident tous. L’outil importe moins que la comparaison : vous voulez savoir ce qui existe à la première réponse, ce qui apparaît après rendu, et ce que Google a réellement indexé.
C’est ici que beaucoup d’audits JavaScript SEO s’arrêtent trop tôt. Ils prouvent que Google peut rendre une page. Bien. Testez maintenant les routes invalides, la pagination, les changements de canonique, les changements de métadonnées, les échecs API, les réponses lentes et les crawlers non-Google.
Utilisez cette checklist au niveau de la route. Un « pass » global masque trop d’échecs.
404 ou 410, pas 200.href.« Si ce n’est pas crawlé, ça ne peut pas ressortir en recherche. Peu importe la surface. »
Jamie Indigo, Consultante SEO technique chez Not a Robot
Cette phrase est la checklist entière en une ligne. Recherche, réponses IA, aperçus de lien et systèmes de découverte dépendent d’abord de l’accès. Le classement vient après.
Si je lançais une SPA moderne avec le trafic search en tête, je ne rendrais pas tout le produit côté serveur. Je le scinderais.
| Zone du site | Approche recommandée |
|---|---|
| Site marketing | Génération statique |
| Blog et docs | Génération statique ou ISR |
| Pages produit | SSR ou ISR |
| Pages SEO programmatiques | Génération statique avec fort pruning |
| Dashboard | CSR derrière auth |
| Pages de recherche & filtres | Noindex sauf si curées manuellement |
| Routes invalides | Vrai 404 ou 410 |
| Layout partagé | Métadonnées et navigation server-rendered |
C’est ainsi que je le découperais sur seojuice.io. Les pages marketing et les articles doivent être HTML-first. Les surfaces produit nécessitant de la fraîcheur peuvent utiliser SSR ou ISR. Le dashboard peut rester une appli car le ranquer serait inutile.
Les pages SEO programmatiques demandent une discipline supplémentaire. La génération statique facilite la création de milliers de pages, y compris des milliers que personne ne devrait indexer. Générez seulement les pages avec une vraie demande de recherche, un contenu utile et des liens internes. Émondez le reste avant que Google ne doive décider à votre place.
La SPA gagnante n’est pas celle qui prouve que les crawlers peuvent exécuter JavaScript. C’est celle qui ne leur fait pas faire du travail inutile.
Oui. Une SPA peut ranquer si ses routes indexables renvoient un contenu crawlable, des métadonnées correctes, des liens internes et des codes-statut valides. Google peut rendre JavaScript, mais tout miser dessus rend le site plus fragile.
Non, pas pour chaque route. Le SSR est utile pour les pages publiques à contenu changeant. Le SSG ou l’ISR est souvent meilleur pour le contenu stable. Le CSR est suffisant pour les dashboards privés, écrans de compte et états d’appli qui ne doivent pas être indexés.
Les routes hash sont un mauvais choix pour les pages indexables. Elles conviennent aux fragments internes, mais le contenu public doit avoir des URL propres, des métadonnées spécifiques et des codes-statut côté serveur.
Généralement non. Les pages de recherche internes et les filtres à facettes créent souvent des URL thin ou dupliquées. Des pages filtrées curées peuvent être indexées si elles ont une demande unique, un contenu stable et une stratégie canonique claire.
Demandez une URL fictive et vérifiez le code-statut. Si /this-page-should-not-exist renvoie 200 avec un message client « not found », vous risquez un soft 404.
SEOJuice aide les équipes à renforcer les liens internes crawlables sur les pages publiques qui méritent réellement du trafic de recherche. Si votre SPA comporte des routes orphelines, des templates enfouis ou des pages que Google ne semble jamais atteindre, l’automatisation du maillage interne peut rendre la couche documentaire plus facile à suivre pour les crawlers.
no credit card required
No related articles found.