Files
parenthese/landing/src/main.jsx
T
IliesAllaliandClaude Opus 5.5 fcfb7d1494 Landing : pages préchargées au survol d'un lien (speculationrules)
- Règles de préchargement dans l'accueil et les 15 guides : une page du site est préparée quand on survole
  son lien (appui sur téléphone), et s'ouvre presque tout de suite. Pages seulement, pas les fichiers ;
  l'application n'est pas concernée. Ignoré par les navigateurs qui ne connaissent pas ces règles.
- Une page préchargée ne compte pas de visite avant d'être vraiment ouverte (PostHog attend
  prerenderingchange), et l'animation du logo se joue à l'ouverture, pas pendant le préchargement.
- CSP de la landing (deploy/nginx.conf) : empreinte des règles, et nouvelle empreinte du script du logo.
  Le mot-clé 'inline-speculation-rules' ne suffisait pas à Chrome.
- Test : chaque script en ligne des pages a son empreinte dans la CSP, chaque page a ses règles.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 18:05:12 +01:00

29 lines
1.2 KiB
React

import { StrictMode } from 'react'
import { createRoot, hydrateRoot } from 'react-dom/client'
import './index.css'
import App from './App.jsx'
import { analytics } from './analytics.js'
import { localeFromPath } from './i18n.js'
// PostHog après le premier rendu : les événements émis avant sont mis en file et envoyés à l'init.
// Page préchargée (survol d'un lien, speculationrules) : rien ne part avant qu'on l'ouvre vraiment.
const deferInit = () => analytics.init()
const scheduleInit = () => {
if ('requestIdleCallback' in window) window.requestIdleCallback(deferInit, { timeout: 3000 })
else window.setTimeout(deferInit, 1500)
}
if (document.prerendering) document.addEventListener('prerenderingchange', scheduleInit, { once: true })
else scheduleInit()
const container = document.getElementById('root')
const app = (
<StrictMode>
<App locale={localeFromPath(window.location.pathname)} />
</StrictMode>
)
// En production le HTML est prérendu (scripts/prerender.mjs) : on l'hydrate.
// En développement (vite dev) la racine est vide : rendu client classique.
if (container.hasChildNodes()) hydrateRoot(container, app)
else createRoot(container).render(app)