Vue и Nuxt
Смонтируйте публичный загрузчик один раз в браузерном компоненте Vue или плагине Nuxt.
Смонтируйте публичный загрузчик один раз в браузерном компоненте Vue или плагине Nuxt.
Подготовьте встраивание#
Включите встраивание для агента и добавьте точные origin локального, предпросмотра и продакшен-развёртываний. Решите, принадлежит ли агент всему приложению или только выбранным компонентам маршрутов.
Плагин Nuxt на весь сайт#
Создайте плагин .client.ts, чтобы никакой DOM-код не выполнялся при серверном рендеринге. Nuxt загружает его один раз в браузере, что сохраняет загрузчик и диалог стабильными между клиентскими переходами.
// plugins/make-agent-fast.client.ts
const slug = "YOUR_SITE_SLUG";
export default defineNuxtPlugin(() => {
if (document.getElementById(`maf-embed-root-${slug}`)) return;
const script = document.createElement("script");
script.id = "maf-agent";
script.src = "https://makeagent.fast/embed.js?v=20260728-widget-v2";
script.dataset.agent = slug;
script.dataset.position = "right";
script.dataset.label = "Ask us";
script.async = true;
document.body.appendChild(script);
});Не помещайте секреты в runtimeConfig.public; в браузере допустимы только публичный slug сайта и визуальные настройки. Настоящие ключи MAF API и провайдеров остаются в приватной серверной конфигурации.
У плагина на весь сайт намеренно нет очистки при размонтировании: он принадлежит времени жизни приложения Nuxt. При горячей замене модулей в разработке прежний корень может оставаться до полной перезагрузки; защита корня предотвращает второй загрузчик. Проверяйте финальное поведение на чистой продакшен-сборке, а не многократной правкой плагина в одной долгоживущей вкладке.
Компонент Vue для отдельных маршрутов#
Для выбранных маршрутов монтируйте в onMounted и удаляйте и скрипт, и созданный корень в onBeforeUnmount.
<script setup lang="ts">
import { onBeforeUnmount, onMounted } from "vue";
const slug = "YOUR_SITE_SLUG";
let script: HTMLScriptElement | null = null;
onMounted(() => {
if (document.getElementById(`maf-embed-root-${slug}`)) return;
script = document.createElement("script");
script.id = "maf-agent";
script.src = "https://makeagent.fast/embed.js?v=20260728-widget-v2";
script.dataset.agent = slug;
script.async = true;
document.body.appendChild(script);
});
onBeforeUnmount(() => {
script?.remove();
document.getElementById(`maf-embed-root-${slug}`)?.remove();
});
</script>Используйте один компонент-владелец. Несколько компонентов с разными slug намеренно создают несколько агентов, что редко желательно.
Если приложение Vue переключает аутентифицированных арендаторов без полной загрузки страницы, трактуйте это как явное снятие/повторный монтаж. Удалите корень старого slug, проверьте публичный slug нового арендатора по доверенному состоянию приложения, затем добавьте новый скрипт. Изменение script.dataset.agent после выполнения загрузчика не перенацеливает существующий iframe.
Заголовки безопасности сайта по-прежнему действуют для вывода Nuxt/Vue. Добавьте origin загрузчика/фрейма в CSP и разрешайте микрофон только при включённом голосе; клиентский плагин не может переопределить политику браузера на уровне ответа.
Проверьте SSR и маршрутизацию#
- Запустите продакшен-сборку Nuxt/Vue и убедитесь, что нет ошибки
document is not defined. - Загрузите маршрут со встраиванием напрямую и убедитесь, что корень один.
- Переходите на клиенте и проверьте поведение на весь сайт против поведения по маршруту.
- Проверьте
embed.js, iframe, CSP и точный origin. - Отправьте сообщение и проверьте поведение на мобильном и с микрофоном.
Решение проблем#
| Симптом | Решение |
|---|---|
| Падение SSR | Переименуйте плагин Nuxt в .client.ts или держите DOM-работу в onMounted |
| Загрузчик остаётся после ухода с маршрута | Удаляйте корень с нужным slug в onBeforeUnmount |
| Загрузчик сбрасывается на каждом маршруте | Используйте клиентский плагин/макет на весь сайт вместо компонента страницы |
| Превью-домен не работает | Добавьте этот точный HTTPS origin отдельно |
| Скрипт вставляется дважды | Используйте одного стабильного владельца и защиту по корню/ID |
Npm-адаптер для Vue/Nuxt пока не опубликован; этот гайд использует поддерживаемый размещённый загрузчик напрямую.