# Instalarea clientului

> Încărcați client.js din CDN-ul Entase, apoi creați o instanță. Nu există niciun pachet de instalat și niciun pas de build.

Clientul este livrat din CDN-ul Entase ca un singur fișier. Nu există niciun pachet npm, niciun bundle de generat și nicio dependență de actualizat – primiți întotdeauna versiunea curentă.

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

Încărcarea scriptului definește o clasă globală `Entase`. Nu face nimic altceva de una singură: nu efectuează solicitări de rețea, nu modifică DOM-ul și nu afișează nimic. Totul începe când creați o instanță.

## Crearea unei instanțe

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

Creați **o singură instanță per pagină** și reutilizați-o pentru fiecare eveniment. Constructorul înregistrează un listener `message` pe fereastră și începe să detecteze ce mod de checkout are voie să utilizeze domeniul dvs., astfel că crearea mai multor instanțe înseamnă listenere duplicate și apeluri de detectare duplicate, fără niciun beneficiu.

Fiecare opțiune are o valoare implicită, astfel că `new Entase()` fără argumente este valid – însă fără `pk`, clientul nu poate verifica dacă domeniul dvs. poate utiliza checkout-ul inline și va reveni întotdeauna la o fereastră pop-up. Consultați [Moduri de checkout](/developers/js-client/checkout-modes.md).

## Încărcarea asincronă a scriptului

Dacă încărcați `client.js` cu `async` sau `defer`, clasa nu va exista încă atunci când rulează scriptul dvs. inline. Biblioteca emite un eveniment `entase:ready` pe `window` după ce s-a încărcat, așa că așteptați-l:

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

Verificarea `typeof` este importantă mai întâi: dacă scriptul a terminat deja încărcarea, `entase:ready` a fost deja emis, iar ascultarea acestuia ar aștepta la nesfârșit.

## Curățare

Într-o aplicație cu o singură pagină, apelați `destroy()` atunci când vizualizarea care deține instanța este demontată:

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

Aceasta elimină listener-ele de fereastră înregistrate de client. O instanță distrusă nu poate fi reutilizată – apelarea `book()` pe aceasta înregistrează o eroare și nu face nimic. Creați în schimb o instanță nouă.

## Politica de securitate a conținutului

Dacă site-ul dvs. trimite un antet `Content-Security-Policy`, checkout-ul are nevoie de:

- `script-src https://js.entase.com` – pentru a încărca biblioteca.
- `frame-src https://www.entase.com` – checkout-ul se afișează într-un iframe în modul panou.
- `connect-src https://www.entase.com` – clientul apelează API-ul Entase pentru a determina modul de checkout permis.

Fără `frame-src`, modul panou produce un panou gol. Fără `connect-src`, detectarea modului eșuează și fiecare checkout se deschide ca pop-up.
