Refacto styled-components sur MonSite. gatsby develop tourne nickel : pages OK, styles OK, hot reload OK. Je merge, deploy Netlify, ouverture du site → flash de contenu non stylé pendant ~1s puis tout se ré-applique. FOUC bien gras visible à chaque chargement.
Le piège
En gatsby develop, le rendu est full client-side via webpack-dev-server. Le SSR n’est pas exercé : si la config SSR de styled-components est cassée, on ne le voit jamais en local.
Le build prod (gatsby build) lui passe par le pipeline SSR de Gatsby. Sans gatsby-plugin-styled-components (ou avec une config Babel manquante), les classes générées côté serveur n’ont pas la même hash que côté client → mismatch → React remplace tout au mount → FOUC.
Au moment du refacto j’ai retiré gatsby-plugin-styled-components de gatsby-config.js parce que « ça marche sans en local ». C’était lui qui injectait le babel-plugin-styled-components nécessaire au SSR.
Le diagnostic 30 secondes
gatsby build
grep data-styled public/index.html
- Retourne du contenu → SSR styled-components OK
- Retourne rien → SSR cassé, FOUC garanti en prod
Le fix
Garder gatsby-plugin-styled-components dans gatsby-config.js :
module.exports = {
plugins: [
'gatsby-plugin-styled-components',
// ...
],
}
Lessons learned
- Ne jamais faire confiance à
gatsby developpour valider un refacto styled-components / SSR / hydration. C’est un mode CSR-only sur le critical path concerné. - Le check de 30s :
gatsby build+grep data-styled public/index.html. À automatiser en pre-merge si on touche aux styles. gatsby-plugin-styled-componentsn’est pas optionnel dès qu’on utilise styled-components. Le retirer est silencieusement cassant.- Vaut sans doute pareil pour
gatsby-plugin-emotion,gatsby-plugin-muiet tout autre injecteur SSR de CSS-in-JS.
#gatsby #styled-components #ssr #react #frontend #monsite