# Installer le client

> Chargez client.js depuis le CDN d’Entase, puis créez une instance. Il n’y a aucun package à installer ni étape de compilation.

Le client est fourni depuis le CDN d’Entase sous la forme d’un fichier unique. Il n’y a aucun package npm, aucun bundle à compiler et aucune dépendance à maintenir à jour – vous obtenez toujours la version actuelle.

```html
<script src="https://js.entase.com/client.js"></script>
```

Le chargement du script définit une classe globale `Entase`. Il ne fait rien d’autre par lui-même : aucune requête réseau, aucune modification du DOM, aucun rendu. Tout commence lorsque vous créez une instance.

## Créer une instance

```js
const entase = new Entase({ pk: 'YOUR_PUBLISHABLE_KEY' });
```

Créez **une instance par page** et réutilisez-la pour chaque événement. Le constructeur enregistre un écouteur `message` sur la fenêtre et commence à détecter le mode de paiement que votre domaine est autorisé à utiliser. Créer plusieurs instances entraîne donc la duplication des écouteurs et des appels de détection, sans aucun avantage.

Chaque option possède une valeur par défaut ; `new Entase()` sans argument est donc valide – mais sans `pk`, le client ne peut pas vérifier que votre domaine peut utiliser le paiement intégré et utilisera toujours une fenêtre pop-up. Consultez [Modes de paiement](/developers/js-client/checkout-modes.md).

## Charger le script de façon asynchrone

Si vous chargez `client.js` avec `async` ou `defer`, la classe n’existera pas encore lorsque votre script inline s’exécutera. Une fois chargée, la bibliothèque déclenche un événement `entase:ready` sur `window` ; attendez-le donc :

```html
<script src="https://js.entase.com/client.js" async></script>
<script>
  let entase = null;

  const init = () => { entase = new Entase({ pk: 'YOUR_PUBLISHABLE_KEY' }); };

  if (typeof Entase !== 'undefined') init();
  else window.addEventListener('entase:ready', init);
</script>
```

La vérification `typeof` est importante : si le script a déjà fini de se charger, `entase:ready` s’est déjà déclenché et l’attendre durerait indéfiniment.

## Nettoyage

Dans une application monopage, appelez `destroy()` lorsque la vue qui possède l’instance est démontée :

```js
entase.destroy();
```

Cela supprime les écouteurs de fenêtre enregistrés par le client. Une instance détruite ne peut pas être réutilisée – appeler `book()` dessus consigne une erreur et ne fait rien. Créez plutôt une nouvelle instance.

## Politique de sécurité du contenu

Si votre site envoie un en-tête `Content-Security-Policy`, le paiement nécessite :

- `script-src https://js.entase.com` – pour charger la bibliothèque.
- `frame-src https://www.entase.com` – le paiement s’affiche dans un iframe en mode panneau.
- `connect-src https://www.entase.com` – le client appelle l’API Entase afin de déterminer le mode de paiement autorisé.

Sans `frame-src`, le mode panneau produit un panneau vide. Sans `connect-src`, la détection du mode échoue et chaque paiement s’ouvre dans une fenêtre pop-up.
