# Установка клиента

> Загрузите client.js из CDN Entase, затем создайте экземпляр. Не нужно устанавливать пакет или выполнять сборку.

Клиент поставляется из CDN Entase в виде одного файла. Нет npm-пакета, нет бандла для сборки и нет зависимостей, которые нужно поддерживать в актуальном состоянии – вы всегда получаете текущую версию.

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

При загрузке скрипта определяется глобальный класс `Entase`. Сам по себе он больше ничего не делает: не выполняет сетевых запросов, не изменяет DOM и ничего не отрисовывает. Всё начинается, когда вы создаёте экземпляр.

## Создание экземпляра

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

Создавайте **один экземпляр для каждой страницы** и используйте его повторно для всех событий. Конструктор регистрирует слушатель `message` в окне и начинает определять, какой режим оформления заказа разрешён для вашего домена, поэтому создание нескольких экземпляров приводит к дублированию слушателей и вызовов определения режима без какой-либо пользы.

У каждого параметра есть значение по умолчанию, поэтому `new Entase()` без аргументов допустим – но без `pk` клиент не сможет проверить, может ли ваш домен использовать встроенное оформление заказа, и всегда будет переключаться на всплывающее окно. См. [Режимы оформления заказа](/developers/js-client/checkout-modes.md).

## Асинхронная загрузка скрипта

Если вы загружаете `client.js` с помощью `async` или `defer`, класса ещё не будет, когда выполнится ваш встроенный скрипт. После загрузки библиотека отправляет событие `entase:ready` в `window`, поэтому дождитесь его:

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

Проверка `typeof` важна: если скрипт уже завершил загрузку, событие `entase:ready` уже было отправлено, и его ожидание будет бесконечным.

## Очистка

В одностраничном приложении вызывайте `destroy()`, когда представление, которому принадлежит экземпляр, размонтируется:

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

Это удалит зарегистрированные клиентом слушатели окна. Уничтоженный экземпляр нельзя использовать повторно – вызов `book()` для него записывает ошибку в журнал и ничего не делает. Вместо этого создайте новый экземпляр.

## Политика безопасности контента

Если ваш сайт отправляет заголовок `Content-Security-Policy`, для оформления заказа необходимы:

- `script-src https://js.entase.com` – для загрузки библиотеки.
- `frame-src https://www.entase.com` – в режиме панели оформление заказа отображается в iframe.
- `connect-src https://www.entase.com` – клиент вызывает API Entase, чтобы определить разрешённый режим оформления заказа.

Без `frame-src` режим панели создаёт пустую панель. Без `connect-src` определение режима завершается ошибкой, и каждое оформление заказа открывается во всплывающем окне.
