Qu’est-ce qu’une single-page app (SPA) ?
Définition et objectif
Une single-page application (SPA) est un type d’application web conçue pour offrir une expérience utilisateur plus fluide et plus rapide en mettant à jour dynamiquement le contenu sans recharger toute la page. Les SPA sont généralement construites à l’aide de frameworks JavaScript modernes tels que React, Next.js ou Vue.js. De nombreuses SPA utilisent également le server-side rendering (SSR), ce qui ajoute de la complexité aux implémentations côté client telles que l’A/B testing et la personnalisation. Le principal avantage des SPA est d’améliorer l’expérience de navigation du visiteur en chargeant les ressources une seule fois et en mettant à jour le contenu dynamiquement, plutôt qu’en rechargeant toute la page après chaque action.Défis de mise en œuvre et solutions
Les SPA introduisent des défis uniques pour des outils comme Kameleoon qui s’appuient sur les chargements de page pour appliquer des variations ou exécuter des scripts. Pour garantir des performances optimales, il est essentiel d’adapter la stratégie d’implémentation en fonction du type de SPA avec lequel vous travaillez. Dans les sections suivantes, nous décrirons les bonnes pratiques et les procédures pour gérer chaque scénario, garantissant une intégration fluide et un suivi précis du comportement des visiteurs sur votre site web.Configuration native
Si votre site web est une SPA complète, l’activation de l’option « support for dynamic websites » garantit que Kameleoon recherche les changements d’URL. Lorsque l’URL change, tous les scripts Kameleoon sont réexécutés, y compris le ciblage et le code de variation. Kameleoon surveillera également les mises à jour de votre SPA en utilisant unMutationObserver pour suivre les changements dans le DOM, même lorsque l’URL de la page reste statique. Cela permet à Kameleoon d’appliquer (ou de réappliquer) les changements de variation dynamiquement à mesure que des mises à jour se produisent sur votre site web. Kameleoon prend en charge diverses modifications effectuées via le graphic editor, notamment :
- Changements de style
- Modifications de texte
- Mises à jour de position (swap, insert before/after)
- Sélecteurs CSS personnalisés
- Cliquez sur Admin > Projects.
- Localisez la carte de votre projet et cliquez sur l’icône Edit.
- Cliquez sur Configuration et déployez le menu General.
- Faites défiler jusqu’à Advanced settings et activez Enable support for dynamic websites (Single Page App, Progressive Web App…) sur ON.

- Choisir la portée : vous pouvez activer la fonctionnalité pour l’ensemble du site ou la limiter à des éléments spécifiques à l’aide du Graphic editor. Restreindre la portée à des éléments sélectionnés permet de réduire le poids global du script. Découvrez comment marquer un élément comme dynamique ici.
- Définir un attribut personnalisé (facultatif) : cette option améliore l’identification des éléments et aide à éviter les problèmes liés aux attributs et sélecteurs dynamiques. Si votre site web ne génère pas d’ID HTML stables ou uniques, vous pouvez définir un attribut personnalisé que Kameleoon utilisera pour identifier les éléments modifiés. Cet attribut a priorité sur l’ID de l’élément lors de la construction du sélecteur.
- Éviter les sélecteurs d’ID dynamiques (facultatif) : cette option améliore également l’identification des éléments lorsqu’il s’agit d’attributs et de sélecteurs dynamiques. Par défaut, Kameleoon ignore les ID HTML qui contiennent des séquences numériques de plus de cinq chiffres. Vous pouvez définir votre propre expression régulière pour exclure des motifs d’ID supplémentaires si nécessaire.
Définir un attribut personnalisé
Vous pouvez définir un attribut personnalisé (par exemple,data-id, data-qa) pour identifier les éléments sur la page. Les attributs personnalisés sont particulièrement utiles lorsque votre site génère des ID dynamiques pour les éléments HTML.
Le Graphic Editor de Kameleoon identifie les éléments à l’aide de sélecteurs CSS, qui se divisent en deux catégories :
- Sélection basée sur l’ID : si l’élément a un ID, Kameleoon l’utilisera pour localiser et modifier l’élément lors du chargement de la page.
- Sélecteur combinatoire : si aucun ID n’est trouvé, Kameleoon crée un chemin de sélecteur en utilisant l’élément parent le plus proche ayant un ID.
<button custom-id="1">) qui identifie de manière fiable les éléments entre les mises à jour.
Éviter les sélecteurs d’ID dynamiques
Par défaut, Kameleoon évite d’utiliser les ID d’élément qui contiennent des nombres générés dynamiquement de plus de cinq chiffres consécutifs. À la place, il construit un chemin en utilisant un élément parent statique proche ayant un ID. Vous pouvez personnaliser ce comportement en spécifiant une expression régulière pour exclure certains ID dynamiques, garantissant un ciblage plus précis.Configuration personnalisée
Si votre site web n’est pas une SPA complète ou si vous devez gérer des parties spécifiques du site, reportez-vous à la section ci-dessous. Il existe quatre cas d’usage différents pour les configurations SPA personnalisées.SPA partielles
Pour activer cette option pour des pages spécifiques, désactivez-la dans Advanced settings et ajoutez le code suivant à votre Global script :Changements de page sans changement d’URL
Dans les cas où le DOM est mis à jour sans changement d’URL, appuyez-vous sur des indicateurs alternatifs pour recharger Kameleoon. Voici un exemple utilisantsessionStorage pour détecter les changements de page. Vous pouvez ajouter le code à votre Global script :
Détecter les changements de page avec pathname
Pour les pages où vous devez réexécuter Kameleoon, mais uniquement lorsque le pathname change (en ignorant les paramètres de requête), détectez les changements en utilisant le pathname au lieu d’une URL complète. Le code ci-dessous peut être ajouté à votre Global script :
Réappliquer le code de variation sans recharger Kameleoon
Dans certains cas, certains éléments de la page sont dynamiques, et lorsque le code est réhydraté, il peut écraser le code Kameleoon déjà appliqué. Pour éviter cela, vous avez deux options :- Vous pouvez informer Kameleoon lorsque la page ou un élément spécifique a fini d’être rendu en utilisant l’une des méthodes suivantes :
- Définissez une variable window ; par exemple,
window.pageLoadForKam = true. - Déclenchez un événement sur la page que Kameleoon peut écouter. Par exemple, en utilisant
pageLoadedoucontentUpdated:window.addEventListener('pageLoaded', () -> { runKameleoonVariationCode }). - Ajoutez une classe ou un attribut spécifique à la balise
<body>ou à l’élément cible. Ensuite, dans le code de variation, utilisez cette classe ou cet attribut pour effectuer des changements sur la page ou des éléments spécifiques.
- Définissez une variable window ; par exemple,
- Dans le code de variation, vous pouvez définir le quatrième argument de la fonction
runWhenElementPresentsurtrue. Cet argument active la prise en charge des éléments dynamiques et des single-page applications (SPA). Lorsque cette option est activée, si le sélecteur CSS spécifié pour l’élément n’est pas trouvé par Kameleoon lors du chargement initial de la page, Kameleoon surveillera le DOM pour ce sélecteur. Une fois l’élément apparu dans le DOM, Kameleoon exécutera la fonction de rappel. De plus, si un nouvel élément correspondant au sélecteur est ajouté ultérieurement à la page, Kameleoon réexécutera le rappel avec l’élément nouvellement ajouté.
Récupérer les données du dataLayer
Lors de l’utilisation de GTM comme méthode de récupération pour définir les valeurs de custom data, Kameleoon s’appuie sur undataLayer défini pour accéder à ses valeurs. Si le dataLayer est mis à jour après chaque changement d’URL en empilant de nouvelles entrées au lieu de supprimer les anciennes, Kameleoon peut récupérer des valeurs obsolètes. Cette récupération se produit parce que les anciennes données persistent à travers les pages, et Kameleoon peut s’exécuter avant que le dataLayer ne soit mis à jour. Pour éviter ce problème, assurez-vous que les entrées obsolètes sont supprimées avant d’en ajouter de nouvelles. Vous pouvez également implémenter un code personnalisé pour attendre les changements dans la longueur du dataLayer avant de récupérer les dernières valeurs :
Considérations générales
Écouteurs d’événements, timeouts et intervalles
UtilisezKameleoon.API.Utils pour gérer les écouteurs d’événements, les timeouts ou les intervalles. Ces méthodes garantissent que les écouteurs et les minuteurs sont automatiquement supprimés lorsqu’un changement d’URL se produit sans rechargement de la page. Ces suppressions évitent les doublons lors de la réexécution de Kameleoon.
ID d’élément uniques
Lors de l’ajout d’éléments via Kameleoon, assurez-vous que leurid commence par kameleoonElement. Cette convention de nommage garantit que l’élément est supprimé avant que Kameleoon ne s’exécute à nouveau, évitant les duplications ou conflits.
Exemple :
<div id="kameleoonElement-myNewCTA"></div>
Incrémentation des pages vues
Kameleoon ne compte une nouvelle page que lorsque tous ses scripts sont réexécutés, ce qui se produit dans deux conditions :- Lorsque
Kameleoon.API.Core.enableSinglePageSupport()est appelée, combinée à un changement d’URL. - Lorsque
Kameleoon.API.Core.load()est explicitement déclenchée.
Alternatives
SDK REACT et JS
Kameleoon propose un SDK React et un SDK JavaScript/TypeScript conçus pour les single-page applications. Ces SDK fournissent une méthode alternative pour exécuter des expériences et gérer des feature flags au sein de votre SPA en intégrant le SDK dans le code de votre application. Pour une liste complète des fonctionnalités disponibles pour les SPA, consultez notre documentation SDK.Plugin GatsbyJS
Kameleoon fournit également un plugin dédié pour les applications GatsbyJS. Pour intégrer Kameleoon à votre application GatsbyJS, suivez les instructions décrites dans cet article.Framework Next.js
Si votre site web est construit avec Next.js, il y a un point important à considérer lors de l’utilisation du Graphic editor de Kameleoon. Les sites web Next.js se chargent d’une manière spécifique qui pourrait entrer en conflit avec les changements de Kameleoon s’ils se produisent trop rapidement, ce qui pourrait entraîner un affichage incorrect de la page.Solution recommandée
L’équipe Kameleoon a créé un guide de configuration Next.js dédié qui résout automatiquement ce problème. Cette configuration garantit :- Kameleoon se charge rapidement et efficacement.
- Votre page s’affiche en douceur sans flickering.
- Les changements apparaissent au bon moment sans casser votre site.
- La navigation entre les pages fonctionne correctement.
Approches alternatives
Si vous ne pouvez pas utiliser la configuration recommandée ci-dessus, il existe d’autres moyens d’éviter les conflits. Votre développeur peut ajouter un simple signal qui indique à Kameleoon « la page est prête pour les changements maintenant ».- Méthode 1 : Indicateur de page prête
- Ajoutez un marqueur à l’élément
<body>une fois la page entièrement chargée. Configurez ensuite vos expériences Kameleoon pour qu’elles ne s’exécutent que lorsque ce marqueur est présent.
- Ajoutez un marqueur à l’élément
- Méthode 2 : Événement personnalisé
- Utilisez la file d’attente de commandes de Kameleoon pour envoyer un signal lorsque votre page est prête :
Events.trigger('my page is hydrated'). - Configurez ensuite vos expériences pour utiliser le critère de ciblage Custom event afin d’attendre ce signal avant d’effectuer des changements. Pour plus de détails sur la mise en œuvre des événements personnalisés et d’autres ciblages, consultez cet article
- Utilisez la file d’attente de commandes de Kameleoon pour envoyer un signal lorsque votre page est prête :
La configuration Next.js dédiée gère tout cela automatiquement, vous n’aurez donc pas à vous soucier de ces détails techniques.