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/catch
Initialisation Ă 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