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.
Chargement dynamique conditionnel : Fuse.js est maintenant chargé uniquement :
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>
Fichier modifié : blog/index.njk
Chargement asynchrone de Fuse.js
createElement('script')try/catchInitialisation Ă la demande
focus sur les champs de recherche (desktop + mobile){ once: true } pour garantir un seul chargementfuseLoaded et fuseLoading pour éviter les doublonsExpérience utilisateur préservée
// 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 });
}
| 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 |
| 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.
dist/blog/index.html crééhttp://localhost:8080/blog/<link rel="prefetch"> si l'utilisateur est sur la page blog/search-index.json est accessibleDé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