Chargement du script — performance
Charger le widget Ekoo dans le <head> pour un démarrage plus rapide
Par défaut, beaucoup d'intégrations placent le script Ekoo en fin de <body>. C'est sûr mais sous-optimal : le navigateur attend la fin du parsing HTML pour commencer le téléchargement. Le déplacer dans le <head> avec defer permet au navigateur de télécharger le script en parallèle du HTML, ce qui réduit le temps avant l'apparition du widget et améliore votre LCP.
C'est sûr
Le widget Ekoo s'auto-initialise sur l'événement window.load. Le placer dans le <head> avec defer n'introduit aucune race condition : le script attendra que le DOM (et donc vos balises <ekoo-widget>) soient prêts avant de monter quoi que ce soit.
Pattern recommandé
1<!DOCTYPE html>2<html>3<head>4 <meta charset="UTF-8" />5 <title>My product page</title>67 <!-- Ekoo widget — loaded as early as possible, executed after the HTML is parsed -->8 <script src="https://app.ekoo.co/widgets/widget-4.0.0-standalone.js" defer></script>9</head>10<body>11 <ekoo-widget12 data-ekoo="YOUR_WEBSITE_ID"13 data-ekoo-product-id="MY_PRODUCT_ID"14 data-ekoo-locale="fr"15 ></ekoo-widget>16</body>17</html>defer vs async vs sans attribut
| Attribut | Téléchargement | Exécution | Pour Ekoo |
|---|---|---|---|
defer | Parallèle au HTML | Après le parsing du HTML, dans l'ordre du document | Recommandé |
async | Parallèle au HTML | Dès que le téléchargement finit (ordre non garanti) | OK techniquement, mais risque si vous utilisez window.ekooOptions |
| (aucun) | Bloque le parsing HTML | Immédiate | À éviter dans le <head> |
N'utilisez pas async avec window.ekooOptions
Si vous configurez le widget via window.ekooOptions (plutôt que via les attributs data-ekoo-*), restez sur defer. Avec async, le script peut s'exécuter avant votre déclaration de ekooOptions, ce qui produit une initialisation vide.
Aller plus loin : preconnect + preload
Pour un gain supplémentaire (utile si votre LCP est tendu), vous pouvez ajouter deux resource hints avant la balise <script> :
preconnect— ouvre la connexion TCP/TLS versapp.ekoo.coavant même la requête.preload— signale au navigateur que ce script est critique et doit être téléchargé en haute priorité.
1<head>2 <!-- 1. Open the TCP / TLS connection to app.ekoo.co as soon as possible -->3 <link rel="preconnect" href="https://app.ekoo.co" crossorigin />45 <!-- 2. Tell the browser to fetch the script with high priority -->6 <link7 rel="preload"8 as="script"9 href="https://app.ekoo.co/widgets/widget-4.0.0-standalone.js"10 crossorigin11 />1213 <!-- 3. Actually load the script (defer = parsed after the HTML) -->14 <script src="https://app.ekoo.co/widgets/widget-4.0.0-standalone.js" defer></script>15</head>Variantes par stack
Google Tag Manager / Commanders Act
Créez un tag Custom HTML dédié, déclencheur All Pages (ou Consent Initialization — All Pages si vous gérez le consentement). Ce tag charge uniquement le script — l'insertion du conteneur <ekoo-widget> reste dans votre tag par page produit.
1<script>2(function () {3 if (window.__ekooStandaloneLoaded) return;4 window.__ekooStandaloneLoaded = true;56 var s = document.createElement('script');7 s.src = 'https://app.ekoo.co/widgets/widget-4.0.0-standalone.js';8 s.defer = true;9 document.head.appendChild(s);10})();11</script>Note
Le garde-fou window.__ekooStandaloneLoaded évite tout double chargement si le tag se déclenche plusieurs fois (navigation virtuelle, déclencheurs cumulés).
Shopify
Ajoutez la balise dans layout/theme.liquid à l'intérieur du <head> :
1{% comment %} layout/theme.liquid — inside <head> {% endcomment %}2<link rel="preconnect" href="https://app.ekoo.co" crossorigin>3<script src="https://app.ekoo.co/widgets/widget-4.0.0-standalone.js" defer></script>WordPress
Utilisez wp_enqueue_script avec in_footer => false et strategy => 'defer' :
1function ekoo_enqueue_widget_script_in_head() {2 wp_enqueue_script(3 'ekoo-widget',4 'https://app.ekoo.co/widgets/widget-4.0.0-standalone.js',5 array(),6 '4.0.0',7 array(8 'strategy' => 'defer', // executed after HTML is parsed9 'in_footer' => false, // → printed inside <head>10 )11 );12}13add_action( 'wp_enqueue_scripts', 'ekoo_enqueue_widget_script_in_head' );Next.js (App Router)
1// app/layout.tsx — Next.js App Router2import Script from 'next/script'34export default function RootLayout({ children }: { children: React.ReactNode }) {5 return (6 <html>7 <head>8 <link rel="preconnect" href="https://app.ekoo.co" crossOrigin="anonymous" />9 </head>10 <body>11 {children}1213 {/* beforeInteractive = injected in <head> at build time, blocks hydration */}14 {/* Use 'afterInteractive' if you don't need the script before React hydrates */}15 <Script16 src="https://app.ekoo.co/widgets/widget-4.0.0-standalone.js"17 strategy="beforeInteractive"18 />19 </body>20 </html>21 )22}Mesurer le gain
- Mesurez d'abord avant avec Chrome DevTools → Lighthouse (Mobile, Performance) — relevez le LCP et le « Time to Interactive ».
- Déplacez le script vers le <head> avec
defer. - Re-mesurez. Vous devriez voir le téléchargement du script Ekoo commencer immédiatement (timeline « Network »).
- Si le LCP est critique, ajoutez
preconnectpuispreload.
Pièges courants
- Oublier
defer— sans cet attribut, un<script>dans le<head>bloque le parsing HTML — vous gagnez sur le téléchargement mais perdez sur le rendu. - Charger le script sur toutes les pages sans conteneur — c'est OK (le script ne fait rien sans
<ekoo-widget>), mais ~30 KB transférés inutilement. Filtrez par type de page si possible. - Double chargement — si vous chargez le script à la fois dans le
<head>et via un autre tag (GTM, plugin), utilisez le gardewindow.__ekooStandaloneLoaded. - CSP — ajoutez
app.ekoo.coàscript-srcetconnect-src.
Note
Voir aussi Cycle de vie du widget pour comprendre comment window.ekooLoad / ekooReload / ekooUnload interagissent avec le chargement.