# Installazione del client

> Carica client.js dalla CDN di Entase, quindi crea un'istanza. Non c'è alcun pacchetto da installare né passaggi di build.

Il client viene distribuito dalla CDN di Entase come singolo file. Non c'è alcun pacchetto npm, nessun bundle da creare e nessuna dipendenza da mantenere aggiornata – ottieni sempre la versione corrente.

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

Il caricamento dello script definisce una classe `Entase` globale. Non fa nient'altro autonomamente: nessuna richiesta di rete, nessuna modifica al DOM, nessun rendering. Tutto inizia quando crei un'istanza.

## Creazione di un'istanza

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

Crea **un'istanza per pagina** e riutilizzala per ogni evento. Il costruttore registra un listener `message` sulla finestra e inizia a rilevare quale modalità di checkout è consentita per il tuo dominio, quindi creare più istanze comporta listener duplicati e chiamate di rilevamento duplicate senza alcun vantaggio.

Ogni opzione ha un valore predefinito, quindi `new Entase()` senza argomenti è valido – ma senza `pk` il client non può verificare che il tuo dominio possa usare il checkout inline e userà sempre come alternativa una finestra pop-up. Vedi [Modalità di checkout](/developers/js-client/checkout-modes.md).

## Caricamento asincrono dello script

Se carichi `client.js` con `async` o `defer`, la classe non esisterà ancora quando verrà eseguito il tuo script inline. Una volta caricata, la libreria invia un evento `entase:ready` su `window`, quindi attendilo:

```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>
```

È importante eseguire prima il controllo `typeof`: se lo script ha già terminato il caricamento, `entase:ready` è già stato inviato e restare in ascolto attenderebbe per sempre.

## Pulizia

In un'applicazione a pagina singola, chiama `destroy()` quando la vista proprietaria dell'istanza viene smontata:

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

Questo rimuove i listener della finestra registrati dal client. Un'istanza eliminata non può essere riutilizzata – chiamare `book()` su di essa registra un errore e non fa nulla. Crea invece una nuova istanza.

## Politica di sicurezza dei contenuti

Se il tuo sito invia un'intestazione `Content-Security-Policy`, il checkout richiede:

- `script-src https://js.entase.com` – per caricare la libreria.
- `frame-src https://www.entase.com` – il checkout viene visualizzato in un iframe in modalità pannello.
- `connect-src https://www.entase.com` – il client chiama l'API di Entase per determinare la modalità di checkout consentita.

Senza `frame-src`, la modalità pannello produce un pannello vuoto. Senza `connect-src`, il rilevamento della modalità non riesce e ogni checkout si apre come pop-up.
