Виджет не загружается
Тег скрипта виджета на странице, но поисковый UI не появляется — диагностика сбоя загрузки скрипта, отсутствующего контейнера, блокировок CSP, проблем с ключом и монтирования в Shadow DOM.
Если вы внедрили widget.js, а строка поиска не появляется, пройдите по этому списку по порядку. Каждая проверка устраняет одну причину.
Проверка 1: скрипт действительно загрузился
Откройте инструменты разработчика браузера → Network → фильтр по widget.js. Вы должны увидеть 200. Если вы видите:
| Статус | Причина |
|---|---|
0 (failed) | CSP блокирует script-src от app.aacsearch.com |
403 | Источник не разрешён для поискового ключа |
404 | Неверный путь; widget.js находится по адресу https://app.aacsearch.com/api/widget/widget.js |
Blocked by CORS | Такого не должно быть — скрипт отдаётся с разрешительным CORS; если происходит, создайте тикет |
Для CSP добавьте app.aacsearch.com в вашу директиву script-src:
<meta
http-equiv="Content-Security-Policy"
content="script-src 'self' https://app.aacsearch.com; img-src 'self' data: https:;"
/>Проверка 2: контейнер существует на момент загрузки
Виджет монтируется в элемент, определяемый data-container. Если элемент не существует в момент выполнения скрипта, монтирование молча завершается неудачей.
<!-- ❌ Контейнер после скрипта -->
<script
src="https://app.aacsearch.com/api/widget/widget.js"
data-container="#aac-search"
data-api-key="ss_search_..."
data-index-slug="products"
></script>
<div id="aac-search"></div>
<!-- ✅ Контейнер перед скриптом -->
<div id="aac-search"></div>
<script
src="https://app.aacsearch.com/api/widget/widget.js"
data-container="#aac-search"
data-api-key="ss_search_..."
data-index-slug="products"
></script>Если контейнер отрисовывается SPA-фреймворком после первой отрисовки, отложите инициализацию:
// Пример React — дождитесь, пока контейнер появится в DOM
useEffect(() => {
const script = document.createElement("script");
script.src = "https://app.aacsearch.com/api/widget/widget.js";
script.dataset.container = "#aac-search";
script.dataset.apiKey = process.env.NEXT_PUBLIC_AACSEARCH_SEARCH_KEY!;
script.dataset.indexSlug = "products";
document.body.appendChild(script);
return () => document.body.removeChild(script);
}, []);Проверка 3: API-ключ действителен для этого источника
Виджет вызывает публичный поисковый эндпоинт при каждом нажатии клавиши. Если у поискового ключа заданы allowedOrigins, источник витрины должен быть в этом списке.
В инструментах разработчика → Network → фильтр по /api/search/...:
| Статус первого вызова | Диагноз |
|---|---|
200 | Всё хорошо — проблема в другом (рендеринг, CSS) |
403 origin_not_allowed | Добавьте источник витрины в ключ — см. Ошибки аутентификации |
401 | Ключ отозван, истёк или неверный префикс — см. Ошибки аутентификации |
429 | Лимит запросов — см. Лимиты запросов |
404 index_not_found | data-index-slug не соответствует существующему индексу |
Проверка 4: монтирование в Shadow DOM
Виджет рендерится внутри корня Shadow DOM, прикреплённого к вашему контейнеру. Если ваш CSS использует !important или глобальный селектор, нацеленный на предков [shadow-root], виджет может рендериться, но быть невидимым.
В инструментах разработчика → Elements → раскройте контейнер → ищите #shadow-root (open). Если он там есть, виджет загрузился. Если внутреннее содержимое имеет display: none или opacity: 0, виноват ваш CSS.
/* ❌ Частая ошибка */
* {
visibility: visible !important;
}
/* ✅ Ограничьте своими компонентами */
.my-component * {
visibility: visible !important;
}Проверка 5: ошибки в консоли
Консоль браузера → ищите сообщения с префиксом [aacsearch].
| Сообщение консоли | Значение |
|---|---|
[aacsearch] container "#aac-search" not found | Контейнер отсутствует — см. Проверку 2 |
[aacsearch] missing data-api-key | Атрибут data-api-key не задан на теге скрипта |
[aacsearch] failed to fetch translations | Сеть заблокировала i18n-пакет; виджет переключается на английский |
[aacsearch] failed to render: <error> | Ошибка на странице витрины; сообщите error в тикете |
Проверка 6: блокировщик рекламы / расширение
Небольшая, но реальная причина: расширения типа uBlock с пользовательскими правилами иногда блокируют сторонние скрипты, подпадающие под общий паттерн. Проверьте в окне инкогнито без расширений, чтобы исключить это.
Проверка 7: смена маршрута SPA
Если виджет смонтировался на главной странице, но исчез после перехода на страницу товара, SPA, вероятно, удалил контейнер. Переинициализируйте при каждой смене маршрута:
// Пример React — Next.js App Router
import { useEffect } from "react";
import { usePathname } from "next/navigation";
useEffect(() => {
window.AACSearch?.mount({
container: "#aac-search",
apiKey: process.env.NEXT_PUBLIC_AACSEARCH_SEARCH_KEY!,
indexSlug: "products",
});
return () => window.AACSearch?.unmount("#aac-search");
}, [usePathname()]);Матрица решений
| Диагноз | Исправление |
|---|---|
| CSP блокирует скрипт | Добавить app.aacsearch.com в script-src |
| Контейнер отсутствует | Переместить <div> перед <script>, или перемонтировать при смене маршрута |
| Ключ неверен / источник не разрешён | См. Ошибки аутентификации |
| Опечатка в slug индекса | Использовать фактический slug из Поиск → Индексы |
| Пользовательский CSS скрывает виджет | Ограничить глобальные селекторы своими компонентами |
| Расширение блокирует скрипт | Добавить app.aacsearch.com в белый список блокировщика рекламы пользователя или задокументировать как известное ограничение |
Диагностический пакет
| Поле | Примечания |
|---|---|
| ID организации | обязательно |
| Slug индекса | обязательно |
| URL витрины | обязательно (чтобы мы могли воспроизвести) |
| Браузер + версия | обязательно |
| Ошибки консоли | скриншот или текст |
| Сетевая панель | строка widget.js + первая строка /api/search/... |
| Используемый заголовок CSP | из заголовков ответа страницы витрины |
Связанные страницы
Медленный поиск
Задержка поиска выше ожидаемой — диагностика холодных стартов, завышенного `perPage`, сложного `filterBy`, отсутствующих фасетов и давления вышестоящего поискового движка.
Ошибки индексации
Документы отправлены в AACsearch, но не появляются в поиске — диагностика задержки очереди буфера, несоответствия схемы, ошибок валидации и давления переиндексации.