Un client m'appelle en panne sèche. Son site e-commerce tourne sous React, design impeccable, animations fluides, temps de chargement correct. Sauf que dans Search Console, la page catégorie principale est indexée... avec un contenu vide. Zéro produit, zéro description. Google est passé, a vu une coquille. Le pire ? Le site gagnait de l'argent quand il envoyait du trafic organique sur cette page. Cinq semaines de silence, et une chute nette des sessions depuis la recherche.
Ce cas n'a rien d'exceptionnel. Le SEO pour site JavaScript reste l'un des sujets les plus mal compris du référencement, parce qu'on mélange trois choses distinctes : le fait que Google puisse exécuter du JavaScript, le fait qu'il le fasse vraiment sur votre site, et le fait que le résultat soit fiable. Ce sont trois questions différentes, et la troisième est celle qui coûte de l'argent.
Points clés à retenir
- Google exécute le JavaScript, mais dans une file d'attente de rendu distincte du crawl, souvent différée de plusieurs jours à plusieurs semaines.
- Ce que vous voyez dans votre navigateur n'est pas ce que Google indexe par défaut. Le HTML source reste la référence.
- Le server-side rendering et la génération statique restent les deux stratégies fiables. Le dynamic rendering a été abandonné comme contournement recommandé.
- La taille du bundle JavaScript et le nombre de requêtes bloquantes déterminent directement le délai avant rendu.
- Vérifier que le contenu est rendu ne suffit pas. Il faut prouver qu'il est indexé, via Search Console.
- Un échec de rendu silencieux (timeout, erreur JS) peut laisser une page entière hors de l'index sans que rien ne le signale dans l'interface.
Pourquoi Google voit autre chose que votre navigateur
Quand vous ouvrez votre site, votre navigateur télécharge le HTML, exécute le JavaScript, appelle les API, et affiche le résultat. Google fait la même chose, mais en trois temps, et pas dans le même ordre que vous.
Le premier passage est un crawl classique : Googlebot récupère le HTML brut, sans exécuter une ligne de JavaScript. À ce stade, une application monopage typique ressemble à ceci : une balise <div id="root"></div>, deux ou trois scripts, et rien d'autre. Pas de titre unique, pas de contenu, pas de liens internes exploitables.
Ensuite, la page entre dans une file d'attente de rendu. C'est là que tout se joue. Googlebot y revient plus tard, exécute le JavaScript, et obtient la version complète. Le problème, c'est "plus tard". Sur un site à faible autorité avec peu de budget de crawl, ce délai se compte en jours. Parfois en semaines. J'ai suivi un projet où une nouvelle page produit mettait en moyenne onze jours avant d'apparaître dans l'index, alors que le même contenu servi en HTML statique était indexé en moins de 48 heures.
Le HTML source n'est pas le DOM
C'est la confusion numéro un. Faites le test : clic droit sur votre page, puis "Afficher le code source". Comparez avec le résultat de l'inspecteur. Sur un site JavaScript mal configuré, le premier est vide, le second est plein.
Google indexe en priorité ce qu'il trouve dans le HTML source. Le rendu vient corriger ce HTML, mais c'est une correction, pas une garantie. Si votre contenu principal n'existe que dans le DOM après exécution, vous dépendez entièrement de la réussite du rendu.
Et le rendu peut échouer. Un timeout sur une API tierce, une erreur JavaScript non gérée, un script bloqué par un robots.txt mal écrit, et Google indexe une page cassée. Sans avertissement.
Combien de temps votre contenu attend-il avant d'être rendu ?
Personne ne peut vous donner un chiffre exact, et méfiez-vous de quiconque prétend le contraire. Le délai dépend de plusieurs facteurs qui interagissent entre eux.
Le premier, c'est votre budget de crawl. Google alloue à chaque site une quantité de ressources proportionnelle à sa popularité et à sa fraîcheur. Un site qui publie peu et reçoit peu de liens obtient un budget réduit — ce qui réduit aussi le nombre de rendus effectués.
Le deuxième, c'est le coût du rendu lui-même. Chaque page rendue consomme des ressources côté Google. Plus votre JavaScript est lourd, plus le rendu coûte cher, plus il est repoussé.
Le troisième, c'est la concurrence interne. Sur un site de 5 000 pages dont 4 500 sont des variantes de filtres et de paramètres, Google consacre l'essentiel de son budget à des pages sans valeur, et les 500 pages importantes attendent.
Ce qui allonge concrètement le délai
- Un bundle JavaScript supérieur à quelques mégaoctets, surtout s'il n'est pas découpé par route.
- Des appels API bloquants côté client pour afficher le contenu principal : prix, disponibilité, avis.
- Des scripts tiers (analytics, chat, A/B testing) chargés avant le contenu.
- Une pagination en JavaScript qui empêche Google de découvrir les pages suivantes.
- Des paramètres d'URL générés à l'infini qui gonflent le nombre de pages à rendre.
Dans un projet de place de marché, j'ai réduit le délai d'indexation moyen de 19 jours à 3 jours simplement en servant la fiche produit côté serveur et en supprimant le chargement des avis clients par JavaScript. Aucun changement de contenu. Uniquement l'ordre dans lequel les choses sont construites.
Quelle stratégie pour quel type de site ?
Il n'existe pas une réponse unique. Le bon choix dépend de ce que vous construisez et de la fréquence à laquelle votre contenu change.
| Stratégie | Quand l'utiliser | Coût d'implémentation | Fiabilité pour Google |
|---|---|---|---|
| Rendu côté client (CSR) | Application privée derrière authentification, contenu non indexable | Faible | Nulle pour le SEO |
| Rendu côté serveur (SSR) | Site avec contenu qui change souvent, pages personnalisées | Moyen à élevé | Très bonne |
| Génération statique (SSG) | Blog, documentation, pages marketing peu modifiées | Faible | Excellente |
| Rendu incrémental (ISR) | Catalogue volumineux, contenu semi-dynamique | Moyen | Très bonne |
| Rendu dynamique | Solution historique de contournement | Élevé | Abandonnée comme recommandation |
Si vous utilisez Next.js, Nuxt ou SvelteKit, ces frameworks gèrent déjà le SSR et le SSG. Le travail consiste moins à choisir une stratégie qu'à vérifier que la bonne est activée sur les bonnes pages. Beaucoup d'équipes activent le rendu statique sur la page d'accueil et laissent les pages catégories en rendu client par défaut. C'est exactement là que le trafic se perd.
Pour une petite structure avec un site vitrine et quelques articles, la génération statique est le choix évident. Rapide, peu coûteuse, et Google n'a aucun effort à fournir. Pour une application avec un espace client personnalisé, le SSR sur les pages publiques et le CSR derrière l'authentification est l'arbitrage qui tient dans le temps.
Comment vérifier que votre contenu est vraiment indexé (et pas seulement rendu)
Rendu ne veut pas dire indexé. Un contenu peut parfaitement s'afficher dans l'inspection d'URL de Search Console et rester absent de l'index pour une raison quelconque. Ces deux états doivent être vérifiés séparément.
Ce qu'il faut regarder dans Search Console
- Le rapport "Pages" : distinguer "Explorée, actuellement non indexée" de "Détectée, actuellement non indexée". La première signifie que Google a vu du contenu mais l'a jugé insuffisant. La seconde est le signe typique qu'une page attend son rendu.
- L'inspection d'URL en mode test en direct : Google exécute le rendu immédiatement. Si le contenu apparaît, votre JavaScript fonctionne. Comparez ensuite avec le HTML affiché dans l'onglet du même outil.
- Les statistiques de crawl par type de fichier : une proportion anormalement élevée de requêtes sur du JavaScript par rapport au HTML indique souvent que Google passe son temps à rendre au lieu d'explorer.
Un signe qui ne trompe pas : si votre HTML source et votre DOM rendu contiennent le même contenu textuel, vous êtes tranquille. Si le second est trois fois plus riche que le premier, vous avez un risque structurel.
Quand le rendu échoue, que se passe-t-il ?
L'échec est presque toujours silencieux. Aucune alerte, aucune notification. La page reste simplement non indexée, et vous le découvrez des semaines plus tard en consultant le trafic.
Les causes les plus fréquentes que j'ai rencontrées :
- Un timeout sur un appel API tiers qui bloque l'affichage du contenu principal.
- Une erreur JavaScript qui n'apparaît que dans certaines conditions (locale, A/B test actif, utilisateur non connecté).
- Un blocage
robots.txtsur les ressources JavaScript elles-mêmes, empêchant le rendu complet. - Une détection de navigateur qui sert une version dégradée à Googlebot.
Pour ce dernier point, une anecdote qui m'a coûté deux semaines : un script de détection servait une version simplifiée du site aux bots identifiés comme non-humains, par souci de performance. Sauf que Googlebot recevait cette version simplifiée, sans le contenu produit. Le correctif a consisté à supprimer ce mécanisme. Rien d'autre. Deux semaines de trafic perdues pour une optimisation de performance mal ciblée.
Les erreurs qui coûtent le plus cher
1. Optimiser le temps de chargement au détriment de l'accessibilité au crawler
Le chargement différé du contenu principal, du chargement au scroll, ou de l'affichage conditionnel est une pratique courante pour améliorer les scores de performance. Elle brise aussi l'indexation. Google n'effectue pas de scroll.
2. Compter sur la deuxième passe pour récupérer les liens internes
Un menu construit en JavaScript ne produit aucun lien dans le HTML source. Google peut le reconstituer après rendu, mais cette découverte est retardée et moins fiable. Votre maillage interne fonctionne dans le navigateur et dysfonctionne pour l'exploration.
3. Laisser les balises méta dépendre du rendu
Titre et meta description injectés par JavaScript arrivent souvent trop tard, ou pas du tout. Résultat : des résultats de recherche avec des titres génériques ou tronqués. Sur un projet, j'ai constaté que près d'un tiers des pages affichaient le titre par défaut du site dans les résultats, alors que le bon titre existait côté client.
4. Ignorer le rendu mobile
L'indexation se fait sur la version mobile. Si votre version mobile est une version allégée servie différemment parce que vous détectez le user-agent comme mobile, vérifiez qu'elle contient bien tout le contenu de la version de bureau. Un site dont la version mobile n'affichait que la moitié des produits de la catégorie a perdu sa position sur ces pages sans qu'aucun changement de contenu ne soit effectué.
Ce que je recommande concrètement
Ma position est simple et je la défends : servez votre contenu principal en HTML côté serveur, et n'utilisez le JavaScript que pour l'enrichissement. C'est moins élégant techniquement qu'une application entièrement côté client, mais le référencement n'a jamais été un concours d'architecture.
Concrètement, l'ordre dans lequel je travaille sur un projet :
- Identifier les pages qui génèrent du trafic organique et vérifier leur état d'indexation réelle.
- Repérer celles où le HTML source est vide et où le DOM est riche. Ce sont les urgences.
- Basculer ces pages en rendu serveur ou statique, en priorité sur les catégories et fiches produit.
- Vérifier que les balises méta, les liens de navigation et la pagination existent dans le HTML brut.
- Surveiller le rapport de couverture pendant plusieurs semaines après le changement.
Le reste — animations, interactions, état côté client — peut rester en JavaScript sans conséquence. Ce qui compte, c'est ce que Google voit au premier passage, pas ce que votre visiteur voit après deux secondes d'attente.
Il y a une ironie dans tout ça. On construit des applications JavaScript parce qu'elles offrent une expérience utilisateur supérieure, et on finit par optimiser contre le robot qui décide si un utilisateur vous trouvera. La question n'est pas de choisir entre les deux. C'est de comprendre que Google ne verra jamais votre site comme vous le voyez, et de construire pour ce qu'il voit réellement.