rubis/apps/landing/astro.config.mjs
ordinarthur 6993d80089
All checks were successful
Build & Deploy Landing / build-and-deploy (push) Successful in 59s
perf(landing): inline critical CSS + preload latin woff2
Élimine ~130 ms du critical path LCP rapportés par l'audit Lighthouse :

- `build.inlineStylesheets: "always"` dans astro.config.mjs : la
  feuille `_astro/Layout.<hash>.css` (~42 KiB) n'est plus une requête
  séparée render-blocking, elle est inlinée dans le HTML. Coût : +42 KiB
  par page prerenderée (≈10 KiB gzippé sur la wire). Gain : 80 ms FCP.
  `"auto"` aurait été ignoré (Layout.css > 4 KiB du seuil interne).

- `<link rel="preload">` sur les 2 woff2 latin (Inter body + Bricolage
  Grotesque display) dans Layout.astro. Casse la chaîne HTML→CSS→fonts
  du network dependency tree (~50 ms gagnés). URLs résolues via Vite
  `?url` import → hashing préservé entre les builds.

On ne preload que latin-wght-normal — les autres subsets (latin-ext,
vietnamese, cyrillic, greek) sont chargés à la demande et ne valent
pas le poids upfront pour un trafic FR/latin.

Vérifié build : `<link rel="stylesheet">` disparu du HTML rendu, 1
seul `<style>` inline présent, 2 `<link rel="preload">` avec les bons
hashes d'asset.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-09 18:45:06 +02:00

57 lines
2.0 KiB
JavaScript

// @ts-check
import { defineConfig } from "astro/config";
import react from "@astrojs/react";
import node from "@astrojs/node";
import tailwindcss from "@tailwindcss/vite";
/**
* Astro 6 — landing publique + blog rubis.pro.
*
* Stratégie de rendu (cf. /docs/tech/architecture.md §3) :
* - `output: "server"` → SSR par défaut, on opt-out par page avec
* `export const prerender = true;` pour les pages statiques.
* - Landing + pages légales : `prerender = true` (HTML figé au build, ultra-rapide).
* - Blog (/blog, /blog/:slug) : SSR pur, fetch Adonis API à la requête, cache
* HTTP côté Traefik / nginx pour absorber les pics — publish admin = immédiat.
*
* Adapter Node standalone : produit un serveur autonome dans `dist/server/`,
* démarré par `node ./dist/server/entry.mjs` dans le container K3s.
*/
export default defineConfig({
site: "https://rubis.pro",
output: "server",
adapter: node({
mode: "standalone",
}),
integrations: [
react(),
],
build: {
/**
* Inline TOUS les <link rel="stylesheet"> dans le HTML. Élimine 80 ms
* de render-blocking sur le critical path LCP en faisant disparaître
* la requête `/_astro/Layout.<hash>.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()],
},
server: {
host: "0.0.0.0",
port: 5174,
},
});