diff --git a/apps/landing/astro.config.mjs b/apps/landing/astro.config.mjs index cc95d9e..c7d057e 100644 --- a/apps/landing/astro.config.mjs +++ b/apps/landing/astro.config.mjs @@ -26,6 +26,26 @@ export default defineConfig({ integrations: [ react(), ], + build: { + /** + * Inline TOUS les dans le HTML. Élimine 80 ms + * de render-blocking sur le critical path LCP en faisant disparaître + * la requête `/_astro/Layout..css` (~42 KiB) du chemin critique + * — cf. audit Lighthouse render-blocking-resources. + * + * Tradeoff assumé : le HTML pèse +42 KiB par page (mais ~10 KiB + * gzippé) au lieu d'avoir une feuille séparée cacheable. Pour une + * landing à 5 pages prerendered c'est négligeable, et sur SSR le + * gain LCP est plus important que la mutualisation cross-page (le + * cache HTTP côté Traefik garde déjà les pages prêtes). + * + * `"auto"` aurait été plus conservateur mais le seuil par défaut + * (`vite.build.assetsInlineLimit` = 4 KiB) est inférieur à la taille + * de Layout.css → la feuille restait externe et le render-blocking + * persistait. + */ + inlineStylesheets: "always", + }, vite: { plugins: [tailwindcss()], }, diff --git a/apps/landing/src/layouts/Layout.astro b/apps/landing/src/layouts/Layout.astro index 398e612..048d6ba 100644 --- a/apps/landing/src/layouts/Layout.astro +++ b/apps/landing/src/layouts/Layout.astro @@ -14,6 +14,20 @@ import "../styles/app.css"; import { SiteHeader } from "../components/SiteHeader"; import { SiteFooter } from "../components/SiteFooter"; +/** + * URLs hashées (au build) des deux woff2 latin que la quasi-totalité du + * contenu utilise — Inter (body) + Bricolage Grotesque (display). Le + * suffix `?url` Vite retourne le path final après hashing, donc le + * preload reste valide même après un rebuild qui change le hash. + * + * Préchargées en HEAD pour casser la chaîne `HTML → CSS → fonts` du + * critical path (cf. audit Lighthouse network-dependency-tree, ~50 ms + * gagnés sur le LCP). On NE preload PAS les latin-ext / vietnamese / + * cyrillic / greek : poids inutile pour 99% du trafic FR/latin. + */ +import interLatinWoff2 from "@fontsource-variable/inter/files/inter-latin-wght-normal.woff2?url"; +import bricolageLatinWoff2 from "@fontsource-variable/bricolage-grotesque/files/bricolage-grotesque-latin-wght-normal.woff2?url"; + const SITE_URL = "https://rubis.pro"; /** @@ -105,6 +119,14 @@ const jsonLdArray = jsonLd ? (Array.isArray(jsonLd) ? jsonLd : [jsonLd]) : []; + {/* Preload des fonts critiques (latin uniquement) — coupe la chaîne + HTML→CSS→woff2 en faisant démarrer le téléchargement au plus tôt. + crossorigin="anonymous" est obligatoire pour matcher la requête + woff2 que Vite émet derrière (sans cred), sinon le browser refait + un round-trip et le preload est ignoré. */} + + + {/* Favicons */}