- Deleted apps/web/src/utils/optimisticStoreUpdates.ts (unused file) - File was unused - no imports found in codebase - Mutations already use React Query's onMutate pattern - No TypeScript errors after deletion - Actions 4.4.1.2 and 4.4.1.3 complete
9.8 KiB
LIGHTHOUSE AUDIT REPORT - Veza Platform
Date: 2026-01-15
URL: https://10.10.10.6/
Lighthouse Version: 13.0.1
📊 RÉSUMÉ EXÉCUTIF
Scores Globaux
- Performance: ❌ Non calculé (erreur NO_LCP)
- Accessibility: ✅ 93/100 (Bien)
- Best Practices: ✅ 96/100 (Excellent)
- SEO: ✅ 91/100 (Bien)
Métriques de Performance Observées
- First Contentful Paint (FCP): 0.7s ✅ (Excellent)
- Speed Index: 0.7s ✅ (Excellent)
- Cumulative Layout Shift (CLS): 0 ✅ (Parfait)
- Max Potential FID: 20ms ✅ (Excellent)
- Total Byte Weight: 560 KiB (Acceptable)
🔴 PROBLÈMES CRITIQUES
1. Erreur JavaScript Console
Sévérité: 🔴 Critique
Impact: Application peut ne pas fonctionner correctement
TypeError: Cannot set properties of undefined (setting 'Children')
at chunk-C3tlqKw3.js:2:4843
Cause: Problème d'initialisation React - React.Children non disponible au moment de l'accès.
Solution: ✅ Déjà en cours de correction dans apps/web/src/main.tsx avec l'initialisation globale de React.
Action requise: Vérifier que le fix est bien déployé en production.
2. robots.txt Invalide
Sévérité: 🟡 Moyen
Impact: SEO - 59 erreurs de syntaxe
Problème: Le fichier /robots.txt retourne du HTML au lieu d'un fichier robots.txt valide.
Solution: Créer un fichier robots.txt valide dans apps/web/public/robots.txt.
Action requise: Créer le fichier robots.txt (voir section Solutions).
3. Missing Main Landmark
Sévérité: 🟡 Moyen
Impact: Accessibilité - Navigation difficile pour les lecteurs d'écran
Problème: Le document HTML ne contient pas d'élément <main> pour identifier le contenu principal.
Solution: Ajouter un élément <main> dans le Layout ou App component.
Action requise: Modifier le composant Layout pour inclure <main>.
🟡 PROBLÈMES MOYENS
4. Headers de Sécurité Manquants
Sévérité: 🟡 Moyen
Impact: Sécurité
Headers manquants:
- ❌ Content-Security-Policy (CSP): Aucun CSP en mode enforcement
- ❌ Strict-Transport-Security (HSTS): Aucun header HSTS trouvé
- ❌ Cross-Origin-Opener-Policy (COOP): Aucun header COOP trouvé
- ❌ Trusted Types: Pas de directive require-trusted-types-for dans CSP
Solution: Ajouter les headers dans la configuration Apache/Nginx.
Action requise: Mettre à jour config/incus/apache/veza-web.conf (voir section Solutions).
5. Source Maps Manquantes ou Invalides
Sévérité: 🟡 Moyen
Impact: Débogage en production
Problème:
- Plusieurs fichiers JS retournent du HTML au lieu de source maps
- SyntaxError: "Unexpected token '<', "<!doctype "... is not valid JSON"
Fichiers affectés:
chunk-C3tlqKw3.js.mapindex-sZ6H8osd.js.mapchunk-VMUEamc6.js.map- Et 6 autres fichiers
Solution:
- Vérifier que Vite génère bien les source maps en production
- Configurer Apache pour servir les
.mapfiles avec le bon Content-Type - Ou désactiver les source maps en production (recommandé pour la sécurité)
Action requise: Vérifier la configuration Vite et Apache.
6. Back/Forward Cache (bfcache) Désactivé
Sévérité: 🟢 Faible
Impact: Performance de navigation
Raisons:
- Back/forward cache désactivé par flags
cache-control:no-storesur la ressource principale- Requêtes JavaScript avec
Cache-Control: no-store - Désactivé par ligne de commande
Solution: Ajuster les headers Cache-Control pour permettre le bfcache.
Action requise: Modifier les headers Cache-Control (voir section Solutions).
✅ POINTS POSITIFS
Performance
- ✅ FCP excellent (0.7s)
- ✅ Speed Index excellent (0.7s)
- ✅ CLS parfait (0)
- ✅ Pas de long tasks bloquantes
- ✅ Temps de réponse serveur excellent (1ms)
- ✅ HTTP/2 utilisé
Accessibilité
- ✅ Document title présent
- ✅ Langue HTML définie (lang="en")
- ✅ Viewport configuré correctement
- ✅ Pas d'erreurs ARIA majeures
- ✅ Pas de problèmes de contraste détectés
SEO
- ✅ Meta description présente
- ✅ Status HTTP 200
- ✅ Liens crawlables
- ✅ Page indexable
- ✅ Hreflang valide
Best Practices
- ✅ HTTPS utilisé
- ✅ Pas de cookies tiers
- ✅ Pas d'APIs dépréciées
- ✅ Pas de requêtes de géolocalisation au chargement
- ✅ Pas de requêtes de notifications au chargement
🔧 SOLUTIONS DÉTAILLÉES
Solution 1: Créer robots.txt
Créer le fichier apps/web/public/robots.txt:
User-agent: *
Allow: /
# Sitemap (à ajouter quand disponible)
# Sitemap: https://10.10.10.6/sitemap.xml
Action: Créer le fichier et redéployer.
Solution 2: Ajouter Main Landmark
Modifier apps/web/src/components/layout/DashboardLayout.tsx ou créer un wrapper:
// Dans DashboardLayout ou App.tsx
<main id="main-content" role="main">
{children}
</main>
Action: Ajouter l'élément <main> dans le Layout.
Solution 3: Ajouter Headers de Sécurité
Mettre à jour config/incus/apache/veza-web.conf:
# Security headers
Header always set X-Frame-Options "SAMEORIGIN"
Header always set X-Content-Type-Options "nosniff"
Header always set X-XSS-Protection "1; mode=block"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
# HSTS (Strict-Transport-Security)
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
# COOP (Cross-Origin-Opener-Policy)
Header always set Cross-Origin-Opener-Policy "same-origin"
# CSP (Content Security Policy) - À adapter selon les besoins
Header always set Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://fonts.googleapis.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com; img-src 'self' data: https:; connect-src 'self' ws: wss:; frame-ancestors 'self';"
Action: Ajouter ces headers dans la configuration Apache.
Solution 4: Corriger Source Maps
Option A: Désactiver source maps en production (Recommandé)
Dans apps/web/vite.config.ts:
build: {
sourcemap: process.env.NODE_ENV === 'development',
// ...
}
Option B: Configurer Apache pour servir les source maps
Dans config/incus/apache/veza-web.conf:
# Source maps
<LocationMatch "^/js/.*\.map$">
Header set Content-Type "application/json"
Header set Cache-Control "no-cache, no-store, must-revalidate"
</LocationMatch>
Action: Choisir une option et l'implémenter.
Solution 5: Ajuster Cache-Control pour bfcache
Modifier les headers Cache-Control pour permettre le bfcache:
# Permettre bfcache pour index.html (mais toujours no-cache pour le contenu)
<LocationMatch "^/index\.html$">
Header set Cache-Control "no-cache, must-revalidate"
# Retirer no-store pour permettre bfcache
</LocationMatch>
Action: Ajuster les headers Cache-Control.
📋 CHECKLIST D'ACTIONS
Priorité Haute (Critique)
- Vérifier que le fix React.Children est déployé
- Créer le fichier robots.txt
- Ajouter l'élément
<main>dans le Layout
Priorité Moyenne
- Ajouter les headers de sécurité (CSP, HSTS, COOP)
- Corriger ou désactiver les source maps
- Ajuster les headers Cache-Control pour bfcache
Priorité Basse (Amélioration)
- Optimiser les fonts (font-display: swap déjà présent)
- Réduire la taille des bundles JavaScript (560 KiB acceptable)
- Ajouter un sitemap.xml
📈 MÉTRIQUES DÉTAILLÉES
Network Requests
- Total Requests: 14
- Total Transfer Size: 560 KiB
- Scripts: 9 fichiers (338 KiB)
- Stylesheets: 2 fichiers (184 KiB)
- Fonts: 1 fichier (49 KiB)
Performance Breakdown
- Main Thread Work: 103.8ms (Excellent)
- Other: 77ms
- Style & Layout: 13.2ms
- Parse HTML & CSS: 6.6ms
- Script Evaluation: 4.9ms
- JavaScript Execution: 3.7ms (Excellent)
- Network RTT: 0.04ms (local), 9ms (Google Fonts)
Third-Party Resources
- Google Fonts: 203 KiB
- CSS: 154 KiB
- Font file: 49 KiB
🔍 OBSERVATIONS
Points à Surveiller
-
LCP Error (NO_LCP): Lighthouse n'a pas pu calculer le Largest Contentful Paint. Cela peut indiquer que la page ne charge pas complètement ou qu'il n'y a pas d'élément LCP identifiable.
-
DOM Size: Très petit (3 éléments seulement), ce qui suggère que React ne s'est peut-être pas complètement rendu lors de l'audit.
-
Console Error: L'erreur React.Children suggère un problème de timing dans le chargement des modules.
Recommandations Générales
- Monitoring: Mettre en place un monitoring continu avec Lighthouse CI
- Testing: Ajouter des tests E2E pour vérifier le rendu complet de l'application
- Performance Budget: Définir un budget de performance (ex: < 600 KiB total)
- Security Audit: Effectuer un audit de sécurité complet
📝 NOTES TECHNIQUES
Configuration Actuelle
- Protocol: HTTP/2 ✅
- Compression: Gzip activé ✅
- Cache: Configuré pour les assets statiques ✅
- SPA Routing: Configuré correctement ✅
Environnement
- URL: https://10.10.10.6/
- User Agent: Chrome 143.0.0.0 (Linux)
- Form Factor: Desktop (mobile emulation désactivée)
- Throttling: Simulé (RTT: 40ms, Throughput: 10Mbps)
🎯 OBJECTIFS DE PROCHAINES ITÉRATIONS
- Performance Score: Atteindre 90+ (actuellement non calculé)
- Accessibility Score: Maintenir 95+ (actuellement 93)
- Best Practices Score: Maintenir 95+ (actuellement 96)
- SEO Score: Atteindre 95+ (actuellement 91)
Prochain Audit: À planifier après correction des problèmes critiques