# Instalowanie klienta

> Załaduj client.js z CDN Entase, a następnie utwórz instancję. Nie ma żadnej paczki do zainstalowania ani etapu kompilacji.

Klient jest dostarczany z CDN Entase jako pojedynczy plik. Nie ma paczki npm, pakietu do zbudowania ani zależności, którą trzeba aktualizować – zawsze otrzymujesz aktualną wersję.

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

Załadowanie skryptu definiuje globalną klasę `Entase`. Samodzielnie nie robi nic więcej: nie wysyła żądań sieciowych, nie zmienia DOM ani niczego nie renderuje. Wszystko zaczyna się po utworzeniu instancji.

## Tworzenie instancji

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

Utwórz **jedną instancję na stronę** i używaj jej ponownie dla każdego wydarzenia. Konstruktor rejestruje nasłuchiwanie `message` w obiekcie window i rozpoczyna wykrywanie, z którego trybu finalizacji zakupu może korzystać Twoja domena, więc utworzenie kilku instancji powoduje powielenie nasłuchiwania i wywołań wykrywania bez żadnych korzyści.

Każda opcja ma wartość domyślną, więc `new Entase()` bez argumentów jest prawidłowe – jednak bez `pk` klient nie może sprawdzić, czy Twoja domena może korzystać z finalizacji zakupu wbudowanej w stronę, i zawsze przejdzie do wyskakującego okna. Zobacz [Tryby finalizacji zakupu](/developers/js-client/checkout-modes.md).

## Asynchroniczne ładowanie skryptu

Jeśli ładujesz `client.js` z użyciem `async` lub `defer`, klasa nie będzie jeszcze istnieć podczas wykonywania skryptu wbudowanego. Po załadowaniu biblioteka wysyła zdarzenie `entase:ready` w obiekcie `window`, dlatego poczekaj na nie:

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

Najpierw ważne jest sprawdzenie `typeof`: jeśli skrypt zakończył już ładowanie, `entase:ready` zostało już wysłane, a oczekiwanie na nie trwałoby w nieskończoność.

## Czyszczenie

W aplikacji jednostronicowej wywołaj `destroy()`, gdy widok, do którego należy instancja, zostanie odmontowany:

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

Spowoduje to usunięcie nasłuchiwania w obiekcie window zarejestrowanego przez klienta. Zniszczonej instancji nie można użyć ponownie – wywołanie na niej `book()` zapisuje błąd w logu i nic nie robi. Zamiast tego utwórz nową instancję.

## Polityka bezpieczeństwa treści

Jeśli Twoja witryna wysyła nagłówek `Content-Security-Policy`, finalizacja zakupu wymaga:

- `script-src https://js.entase.com` – do załadowania biblioteki.
- `frame-src https://www.entase.com` – finalizacja zakupu jest renderowana w elemencie iframe w trybie panelu.
- `connect-src https://www.entase.com` – klient wywołuje API Entase, aby określić dozwolony tryb finalizacji zakupu.

Bez `frame-src` tryb panelu powoduje wyświetlenie pustego panelu. Bez `connect-src` wykrywanie trybu nie działa, a każda finalizacja zakupu otwiera się jako wyskakujące okno.
