# Instalar o cliente

> Carregue client.js da CDN da Entase e crie uma instância. Não há pacote para instalar nem etapa de compilação.

O cliente é disponibilizado pela CDN da Entase como um único arquivo. Não há pacote npm, bundle para compilar nem dependência para manter atualizada – você sempre recebe a versão atual.

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

Carregar o script define uma classe global `Entase`. Ele não faz mais nada por conta própria: nenhuma solicitação de rede, nenhuma alteração no DOM, nada é renderizado. Tudo começa quando você cria uma instância.

## Criar uma instância

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

Crie **uma instância por página** e reutilize-a para todos os eventos. O construtor registra um listener de `message` na janela e começa a detectar qual modo de checkout seu domínio tem permissão para usar, portanto criar várias instâncias resulta em listeners duplicados e chamadas de detecção duplicadas sem nenhum benefício.

Todas as opções têm um valor padrão, portanto `new Entase()` sem argumentos é válido – mas, sem `pk`, o cliente não pode verificar se seu domínio pode usar o checkout embutido e sempre recorrerá a uma janela pop-up. Consulte [Modos de checkout](/developers/js-client/checkout-modes.md).

## Carregar o script de forma assíncrona

Se você carregar `client.js` com `async` ou `defer`, a classe ainda não existirá quando seu script embutido for executado. A biblioteca dispara um evento `entase:ready` em `window` depois de ser carregada, portanto aguarde por ele:

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

A verificação com `typeof` primeiro é importante: se o script já terminou de carregar, `entase:ready` já foi disparado, e escutá-lo faria você esperar para sempre.

## Limpeza

Em um aplicativo de página única, chame `destroy()` quando a visualização à qual a instância pertence for desmontada:

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

Isso remove os listeners de janela que o cliente registrou. Uma instância destruída não pode ser reutilizada – chamar `book()` nela registra um erro e não faz nada. Crie uma nova instância.

## Política de Segurança de Conteúdo

Se seu site enviar um cabeçalho `Content-Security-Policy`, o checkout precisará de:

- `script-src https://js.entase.com` – para carregar a biblioteca.
- `frame-src https://www.entase.com` – o checkout é renderizado em um iframe no modo de painel.
- `connect-src https://www.entase.com` – o cliente chama a API da Entase para determinar o modo de checkout permitido.

Sem `frame-src`, o modo de painel gera um painel vazio. Sem `connect-src`, a detecção de modo falha e todos os checkouts são abertos como pop-ups.
