En bref
Pour ajouter un chatbot en React JS, copiez dans votre application le petit composant <Chatbot /> ci-dessous : il ajoute une seule fois le script Nexoply depuis un useEffect et n’affiche rien lui-même. Vous pouvez aussi coller le script d’une ligne dans index.html, juste avant </body>. Dans les deux cas, le bouton de chat apparaît sur toutes les routes, sans paquet npm à installer ni clé d’IA à gérer : l’assistant répond à partir des informations sur l’entreprise que vous ajoutez dans le tableau de bord.
- Un composant <Chatbot /> à copier-coller : un useEffect qui ajoute le script une seule fois. Prêt pour TypeScript, compatible avec StrictMode, sans fonction de nettoyage.
- Pas besoin de composant ? Une balise script dans index.html avant </body> (Vite : index.html à la racine du projet ; Create React App : public/index.html).
- Il se monte sur document.body dans un Shadow DOM, en dehors de votre racine React : les re-rendus, les changements de route et votre CSS ne l’affectent jamais.
- Ouvrez le chat depuis votre propre bouton avec window.dispatchEvent(new Event("nexoply:open-chat")).
- Vous testez sur localhost ? Ajoutez votre hôte de développement avec son port à la liste des sites autorisés, ou laissez cette liste vide.
Avant de commencer
Il vous faut deux choses avant de toucher à votre code :
- Un compte Nexoply et la clé de votre chatbot. Inscrivez-vous gratuitement (l’offre gratuite comprend 50 conversations par mois, sans carte bancaire), puis ouvrez Chatbot dans le tableau de bord. Le code d’installation qui s’y trouve contient déjà votre clé. Cette clé est publique : ce n’est pas un secret et elle ne donne aucun accès au compte, vous pouvez donc la mettre dans du code côté client.
- Les informations sur l’entreprise à partir desquelles l’assistant répond : services et prix, FAQ, politiques, horaires d’ouverture et zones d’intervention. Le plus rapide est d’entrer l’adresse du site web et de laisser Nexoply importer les pages publiques, y compris celles construites en JavaScript : un site React fonctionne donc aussi. Rien n’est ajouté avant d’avoir été approuvé.
Option 1 : un composant chatbot React prêt à copier
Créez src/components/Chatbot.tsx. Le composant n’affiche rien lui-même : il ajoute une seule fois le script Nexoply à la page, et c’est le widget qui dessine le bouton et la fenêtre de chat.
// src/components/Chatbot.tsx
import { useEffect } from "react";
type ChatbotProps = { chatbotKey: string };
export function Chatbot({ chatbotKey }: ChatbotProps) {
useEffect(() => {
// Pas de clé, ou le script est déjà sur la page : rien à faire.
if (!chatbotKey || document.querySelector("script[data-chatbot]")) return;
const s = document.createElement("script");
s.src = "https://nexoply.com/widget.js";
s.async = true;
s.dataset.chatbot = chatbotKey;
document.body.appendChild(s);
}, [chatbotKey]);
return null;
}Affichez-le une seule fois, dans le composant qui reste monté pendant toute la visite (en général App). Avec Vite, mettez VITE_NEXOPLY_KEY=YOUR-KEY dans un fichier .env :
// src/App.tsx
import { Chatbot } from "./components/Chatbot";
export default function App() {
return (
<>
{/* votre mise en page et vos routes */}
<Chatbot chatbotKey={import.meta.env.VITE_NEXOPLY_KEY} />
</>
);
}Le composant fonctionne tel quel dans un projet TypeScript avec Vite ou Create React App. En JavaScript pur, nommez le fichier Chatbot.jsx et supprimez le type ChatbotProps. Create React App ne connaît pas import.meta.env : passez plutôt process.env.REACT_APP_NEXOPLY_KEY. Comme c’est un composant ordinaire, vous pouvez aussi l’afficher sous condition, par exemple {hasConsent && <Chatbot chatbotKey={key} />}, pour ne charger le chat qu’après qu’un visiteur a accepté votre bandeau de cookies.
- Pourquoi il n’y a pas de fonction de nettoyage. Le widget n’a pas d’API pour le retirer une fois chargé, et il vit en dehors de votre arbre React : démonter le composant n’a donc rien à annuler.
- Pourquoi StrictMode ne pose pas de problème. En développement, React StrictMode exécute les effets deux fois. La vérification querySelector ignore la seconde exécution, et même si le script était ajouté deux fois, le widget ne se monte qu’une fois par clé de chatbot. Le rechargement à chaud est sans risque pour la même raison.
- Gardez l’attribut. Le widget lit ses réglages dans sa propre balise script : celle-ci doit donc garder l’attribut data-chatbot et un src contenant widget.js. C’est s.dataset.chatbot qui crée cet attribut.
Option 2 : une balise script dans index.html
Si vous n’avez pas besoin de contrôler le chargement depuis le code, passez-vous du composant. Toute SPA React a une page HTML de base : avec Vite, c’est index.html à la racine du projet ; avec Create React App, c’est public/index.html. Collez le code juste avant la balise de fermeture </body> :
<body>
<div id="root"></div>
<script type="module" src="/src/main.tsx"></script>
<!-- Chatbot IA Nexoply -->
<script src="https://nexoply.com/widget.js" data-chatbot="YOUR-KEY" async></script>
</body>Remplacez YOUR-KEY par la clé de la page Chatbot. Le script se charge de manière asynchrone : il ne bloque jamais le rendu de votre application. Ajoutez data-open="true" à la balise si vous voulez que la fenêtre de chat s’ouvre au chargement. C’est toute l’installation : recompilez, déployez, et le bouton s’affiche sur toutes les routes.
Bibliothèque de chatbot React ou chatbot IA hébergé
Une recherche « chatbot React » fait apparaître deux types d’outils, qui ne résolvent pas le même problème :
- Une bibliothèque d’interface de chatbot vous fournit des composants React pour le chat lui-même : une liste de messages, un champ de saisie, des bulles, parfois des étapes de conversation scénarisées. Tout ce qui se trouve derrière l’interface reste à construire : des scénarios fixes, ou un backend qui appelle un modèle d’IA avec votre propre clé d’API, ainsi que le contenu à partir duquel il répond, le stockage des conversations et la protection contre les abus. C’est adapté quand le chat fait partie de votre produit, par exemple un assistant qui travaille avec les données de vos propres utilisateurs.
- Un chatbot IA hébergé comme Nexoply fournit l’interface, l’IA et le backend ensemble. Il répond aux questions des visiteurs uniquement à partir des informations sur l’entreprise que vous ajoutez ou importez (services et prix, FAQ, politiques, horaires d’ouverture) et le dit quand il ne sait pas. Pas de clé d’IA, pas de code serveur ; les conversations, les questions sans réponse et la protection contre le spam se gèrent dans le tableau de bord. C’est adapté à un site web destiné aux clients, qui doit répondre aux questions sur l’entreprise.
Si vous voulez un contrôle total sur l’interface et le modèle, partez d’une bibliothèque. Si l’objectif est de répondre aux questions des visiteurs sans construire ni faire tourner de backend, le widget hébergé demande moins de travail. Découvrez comment Nexoply répond à partir des informations sur votre entreprise.
Son comportement dans une application monopage
- Il reste en dehors de votre arbre React. Le widget se monte sur document.body, en dehors de votre élément #root : les re-rendus et les changements de route ne le retirent ni ne modifient jamais son style.
- Un Shadow DOM dans les deux sens. Votre CSS (Tailwind, modules CSS, resets globaux) ne déborde pas sur le chat, et le CSS du chat ne déborde pas sur votre application.
- Les changements de route fonctionnent sans effort. Avec React Router ou tout routeur basé sur l’historique, les visiteurs gardent leur conversation pendant qu’ils naviguent, et les règles par page (comme un onglet latéral uniquement sur /pricing) sont revérifiées quand l’URL change. Aucun code supplémentaire.
- Aucun cookie. Il enregistre un identifiant de visiteur anonyme dans localStorage et la conversation en cours dans sessionStorage.
Ouvrir le chat depuis votre propre bouton
Vous voulez un bouton « Discutez avec nous » dans votre section d’accroche ou sur votre page de tarifs ? Déclenchez l’événement nexoply:open-chat sur window :
export function ChatButton() {
return (
<button onClick={() => window.dispatchEvent(new Event("nexoply:open-chat"))}>
Discutez avec nous
</button>
);
}Aucun import n’est nécessaire : le widget écoute cet événement sur window. Si vous préférez n’afficher que votre propre bouton, réglez le bouton de message sur « Aucun bouton » avec une règle par page dans le tableau de bord.
Tests en local et dépannage
Avant de déployer, vérifiez ces trois réglages :
- Sites autorisés. Si vous avez rempli Autoriser uniquement sur ces sites web (tableau de bord → Chatbot), ajoutez votre hôte de développement avec son port, par exemple localhost:5173 pour Vite ou localhost:3000 pour Create React App, ou laissez la liste vide pendant vos tests.
- Content-Security-Policy. Si votre application envoie un en-tête ou une balise meta CSP, autorisez https://nexoply.com dans script-src, connect-src et img-src.
- Vérifiez de bout en bout. Lancez l’application, cliquez sur le bouton de chat, posez une vraie question et retrouvez-la sous Conversations dans le tableau de bord.
Si le bouton n’apparaît toujours pas :
- Clé vide. Sans clé, le composant ne charge rien. Affichez import.meta.env.VITE_NEXOPLY_KEY dans la console : Vite n’expose que les variables qui commencent par VITE_, et il faut redémarrer le serveur de développement après avoir modifié .env.
- Requête bloquée. Regardez la console du navigateur et l’onglet Réseau pour repérer des erreurs CSP ou un widget.js bloqué.
- Chatbot désactivé. Vérifiez que l’interrupteur Chatbot activé est allumé.
- Bloqueurs de publicité. Plus rarement, une extension de navigateur bloque les widgets de chat. Essayez une fenêtre de navigation privée sans extensions.
Étapes suivantes : personnaliser sans redéployer
Une fois le script en place, vous n’aurez plus besoin de toucher au code : les modifications faites dans le tableau de bord arrivent sur le site en une minute environ. Sous Chatbot → Personnaliser, vous pouvez styliser le bouton de message (icône ou votre propre image ou SVG, libellé, forme, taille, couleurs, position) ou utiliser à la place un onglet latéral sur le bord de l’écran. Définissez une apparence différente sur mobile et utilisez des règles par page pour la modifier sur certaines routes (par exemple /pricing, ou /services/*). La fenêtre de chat reprend vos polices, vos couleurs et votre logo, et l’écran d’accueil peut proposer des boutons comme Réserver, Appeler ou WhatsApp.
Vous utilisez un autre framework ? Consultez comment ajouter un chatbot à Next.js avec next/script ou le guide du chatbot pour Vue et Nuxt ; pour un site vitrine sous WordPress, voyez le guide WordPress. Pour une vue d’ensemble, découvrez comment l’assistant apprend à connaître votre entreprise ou comparez les offres et les limites de conversations.
Questions fréquentes
Existe-t-il un composant de chatbot React simple ?
Oui : le composant <Chatbot /> de ce guide, moins de 20 lignes avec un useEffect, que vous copiez dans votre propre projet. Il n’existe pas de paquet npm officiel ni de bibliothèque de composants à installer, et vous n’en avez pas besoin. Le widget est toujours le script https://nexoply.com/widget.js avec un attribut data-chatbot, et tous les réglages se font dans le tableau de bord.
Fonctionne-t-il avec React Router et la navigation des SPA ?
Oui. Le widget garde la conversation pendant que les visiteurs naviguent côté client et revérifie les règles par page quand l’URL change, sans code supplémentaire. Il vit en dehors de votre arbre React : les changements de route ne le retirent jamais.
Ai-je besoin d’un backend ou d’une clé d’API d’IA ?
Non. Nexoply fait tourner l’IA et le backend, et aucune clé d’IA ni donnée privée n’est jamais envoyée au navigateur. La seule valeur présente dans votre code est la clé du chatbot, qui est publique et ne donne aucun accès à votre compte.
Va-t-il ralentir mon application ?
Pas de manière perceptible. Le script se charge de manière asynchrone et ne bloque jamais le rendu, et il s’exécute dans son propre Shadow DOM sans toucher à vos composants.
Fonctionne-t-il avec Next.js ?
Oui, avec le composant next/script dans votre layout racine. Consultez le guide Next.js pour les extraits de code App Router et Pages Router.
Comment le masquer sur certaines routes ?
Il n’existe pas d’API pour le retirer une fois chargé. Ajoutez plutôt une règle par page avec « Aucun bouton » (tableau de bord → Chatbot → Personnaliser → Bouton de message → Différent sur certaines pages), ou désactivez le chatbot.
