Optimisation du chargement de Fuse.js

📊 RĂ©sumĂ© de l'optimisation

ProblĂšme initial

Fuse.js (~25KB gzippé) était chargé globalement sur toutes les pages du site via base.njk, alors qu'il n'était utilisé que sur la page du blog pour la fonctionnalité de recherche.

Solution implémentée

Chargement dynamique conditionnel : Fuse.js est maintenant chargé uniquement :


✅ Modifications effectuĂ©es

1. Suppression du chargement global

Fichier modifié : _includes/layouts/base.njk

- <script src="https://cdn.jsdelivr.net/npm/fuse.js@6.6.2"></script>
  <script src="/scripts.js" defer></script>

2. Implémentation du chargement dynamique

Fichier modifié : blog/index.njk

Fonctionnalités ajoutées :

  1. Chargement asynchrone de Fuse.js

  2. Initialisation Ă  la demande

  3. Expérience utilisateur préservée

Code clé :

// Charger Fuse.js et initialiser la recherche (appelé au premier focus)
const initializeSearch = async () => {
  if (fuseLoading || fuseLoaded) return;
  
  fuseLoading = true;

  try {
    // Charger Fuse.js dynamiquement
    if (!window.Fuse) {
      const script = document.createElement('script');
      script.src = 'https://cdn.jsdelivr.net/npm/fuse.js@6.6.2';
      document.head.appendChild(script);
      
      await new Promise((resolve, reject) => {
        script.onload = resolve;
        script.onerror = reject;
      });
    }

    // Charger les données de recherche
    if (!searchData) {
      const response = await fetch('/search-index.json');
      searchData = await response.json();
    }

    // Initialiser Fuse
    fuse = new window.Fuse(searchData, { ... });
    
    fuseLoaded = true;
  } catch (error) {
    console.error('Erreur lors du chargement du moteur de recherche:', error);
  }
};

// ÉvĂ©nements de focus
if (searchInput) {
  searchInput.addEventListener('focus', initializeSearch, { once: true });
}
if (searchMobile) {
  searchMobile.addEventListener('focus', initializeSearch, { once: true });
}

📈 Gains de performance

Poids économisé sur les pages sans recherche

Page Avant Aprùs Économie
Page d'accueil +25KB (Fuse.js) 0KB -25KB
Pages destinations +25KB (Fuse.js) 0KB -25KB
Pages circuits +25KB (Fuse.js) 0KB -25KB
Pages articles +25KB (Fuse.js) 0KB -25KB
Page FAQ +25KB (Fuse.js) 0KB -25KB
Page Blog +25KB (dÚs le load) 25KB (au focus) Délai de chargement

Impact global

Expérience utilisateur sur la page blog

Métrique Avant AprÚs
Chargement initial Fuse.js chargé Fuse.js non chargé
Premier clic sur recherche Instantané ~200-500ms de délai initial
Recherches suivantes Instantané Instantané

Note : Le léger délai de 200-500ms au premier focus est imperceptible pour l'utilisateur car il correspond au temps de clic/focus avant de commencer à taper.


🔍 VĂ©rification

Tests effectués

  1. ✅ Build Eleventy rĂ©ussi - Aucune erreur de compilation
  2. ✅ Page blog gĂ©nĂ©rĂ©e - dist/blog/index.html créé
  3. ✅ Code intĂ©grĂ© - Script de chargement dynamique prĂ©sent
  4. ✅ Pages sans recherche - Fuse.js absent sur index.html et autres pages

Tests Ă  effectuer manuellement


🚀 Prochaines optimisations possibles

  1. Précharger les données de recherche avec <link rel="prefetch"> si l'utilisateur est sur la page blog
  2. Service Worker pour mettre Fuse.js en cache aprĂšs le premier chargement
  3. Analyse alternative : Envisager des solutions plus légÚres que Fuse.js (ex: FlexSearch ~2KB, minisearch ~6KB)

📝 CompatibilitĂ©


🔧 Maintenance

Si problĂšme avec la recherche

  1. Vérifier la console navigateur pour les erreurs
  2. Vérifier que /search-index.json est accessible
  3. Vérifier que le CDN Fuse.js est accessible

Pour revenir à l'ancienne méthode

Décommenter dans base.njk :

<script src="https://cdn.jsdelivr.net/npm/fuse.js@6.6.2"></script>

Et retirer le code de chargement dynamique dans blog/index.njk.


Date de l'optimisation : 16 octobre 2025
Impact estimé : -25KB sur 95% des pages du site