Nexoply

導入ガイド

Vue チャットボット:Vue 3・Nuxt アプリにAIチャットボットを追加する方法

Vue 3 や Nuxt にAIチャットボットを追加。コピーして使える Chatbot.vue コンポーネント、index.html の script タグ1つ、または useHead で設置できます。npm パッケージもAIキーも不要です。

2026年10月6日 更新 約 10 分で読めます

要点

Nexoply は npm パッケージではなく、script タグ1つで動作します。Vue 3 アプリでは、onMounted でスクリプトを一度だけ追加する下の小さな Chatbot.vue コンポーネントをコピーして App.vue で描画するか、タグを index.html の </body> の直前に貼り付けます。Nuxt 3 では、nuxt.config.ts の app.head.script に tagPosition: "bodyClose" を付けて追加するか、app.vue で useHead を使います。ブラウザでのみ動作し、Vue Router のナビゲーションでも消えず、Shadow DOM によってスタイルがあなたのものと分離されます。

  • プラグインも npm パッケージも不要:ウィジェットは常に https://nexoply.com/widget.js で、data-chatbot 属性にキーを指定します。
  • Vue 3(Vite):<script setup> と onMounted を使った、コピーして使える Chatbot.vue コンポーネント、または index.html の </body> の前にタグを1つ。
  • Nuxt 3:nuxt.config.ts の app.head.script、または app.vue の useHead。ブラウザでのみ動作するため、SSR でも安全です。
  • 2回読み込まれても問題ありません。チャットボットのキーごとに一度しか表示されないため、ホットリロードや再マウントでボタンが2つになることはありません。
  • window.dispatchEvent(new Event("nexoply:open-chat")) で、独自のボタンからチャットを開けます。

始める前に

Nexoply のアカウントとチャットボットのキーが必要です。無料で登録し(無料プランには月50会話が含まれ、カードは不要です)、ビジネス情報を追加するかウェブサイトから取り込んだら、ダッシュボードで チャットボット を開いて設置コードをコピーします。コードは次のような形です。

<script src="https://nexoply.com/widget.js" data-chatbot="YOUR-KEY" async></script>

data-chatbot の値がキーです。キーは公開情報で秘密ではありません。ウィジェットがどのビジネスのものかを示すだけなので、クライアント側のコードやリポジトリに含めても問題ありません。ウィジェットは自分の script タグから設定を読み取るため、属性名と、widget.js を含む src は記載どおりにしてください。

Vue 3:コピーして使える Chatbot.vue コンポーネント

src/components/Chatbot.vue を作成します。このコンポーネント自体は何も描画しません。マウント時に Nexoply のスクリプトをページに一度だけ追加し、チャットボタンとチャットウィンドウはウィジェットが表示します。

<!-- src/components/Chatbot.vue -->
<script setup lang="ts">
import { onMounted } from "vue";

const props = defineProps<{ chatbotKey: string }>();

onMounted(() => {
  // キーがない、またはスクリプトがすでにページにある場合は何もしない。
  if (!props.chatbotKey || document.querySelector("script[data-chatbot]")) return;
  const s = document.createElement("script");
  s.src = "https://nexoply.com/widget.js";
  s.async = true;
  s.dataset.chatbot = props.chatbotKey;
  document.body.appendChild(s);
});
</script>

<template><slot /></template>

訪問中ずっとマウントされたままの App.vue で一度だけ描画します。キーは .env に VITE_NEXOPLY_KEY=YOUR-KEY と書きます。

<!-- src/App.vue -->
<script setup lang="ts">
import Chatbot from "./components/Chatbot.vue";

const nexoplyKey = import.meta.env.VITE_NEXOPLY_KEY;
</script>

<template>
  <!-- レイアウトとルート -->
  <Chatbot :chatbot-key="nexoplyKey" />
</template>

JavaScript のプロジェクトでは、lang="ts" を削除し、型引数の代わりに defineProps({ chatbotKey: String }) と書きます。通常のコンポーネントなので、v-if="hasConsent" のように v-if で描画し、訪問者が同意バナーに同意した後にだけチャットを読み込むこともできます。

コンポーネントが不要なら、最もシンプルなのは、プロジェクト直下の index.html の </body> の直前にタグを貼り付ける方法です。非同期で読み込まれ、描画を妨げることはありません。

<body>
  <div id="app"></div>
  <script type="module" src="/src/main.ts"></script>
  <script src="https://nexoply.com/widget.js" data-chatbot="YOUR-KEY" async></script>
</body>

Nuxt 3:nuxt.config.ts または useHead

Nuxt ではコンポーネントは不要です。nuxt.config.ts でサイト全体にスクリプトを追加します。tagPosition: "bodyClose" を指定すると、</body> の直前に配置されます。

export default defineNuxtConfig({
  app: {
    head: {
      script: [
        {
          src: "https://nexoply.com/widget.js",
          async: true,
          "data-chatbot": "YOUR-KEY",
          tagPosition: "bodyClose",
        },
      ],
    },
  },
});

または、app.vue で useHead を使って追加します。キーを環境変数で管理したい場合は、nuxt.config.ts で runtimeConfig: { public: { nexoplyKey: "" } } を宣言して NUXT_PUBLIC_NEXOPLY_KEY を設定します。そうでなければ、キーをその場に直接書いてください。

<script setup lang="ts">
useHead({
  script: [
    {
      src: "https://nexoply.com/widget.js",
      async: true,
      "data-chatbot": useRuntimeConfig().public.nexoplyKey,
      tagPosition: "bodyClose",
    },
  ],
});
</script>

サーバーレンダリングでも問題ありません。Nuxt はタグを HTML に出力し、ウィジェットはブラウザでのみ動作します。アプリのマークアップには触れないため、ハイドレーションの不一致は起きません。

Vue チャットボットライブラリとホスト型AIチャットボットの違い

「Vue チャットボット」で検索すると2種類のツールが見つかりますが、解決する課題は異なります。

  • チャットボットUIライブラリ は、チャットそのものの Vue コンポーネント(メッセージ一覧、入力欄、吹き出し、場合によっては決められた会話の流れ)を提供します。UIの裏側はすべて自分で作ります。固定のシナリオか、自分のAPIキーでAIモデルを呼び出すバックエンド、さらに回答のもとになるコンテンツ、会話の保存、不正利用対策も必要です。ユーザー自身のデータを扱うアシスタントなど、チャットが自社製品の一部である場合に向いています。
  • ホスト型AIチャットボット(Nexoply など)は、UI、AI、バックエンドをまとめて提供します。追加または取り込んだビジネス情報(サービスと料金、よくある質問、ポリシー、営業時間)だけをもとに訪問者の質問に答え、わからないときはそう伝えます。AIキーもサーバー側のコードも不要で、会話、回答できなかった質問、スパム対策はダッシュボードで管理できます。ビジネスについての質問に答える必要がある、顧客向けのウェブサイトに向いています。

インターフェースとモデルを完全に制御したいなら、ライブラリから始めましょう。バックエンドを作らず運用もせずに訪問者の質問に答えることが目的なら、ホスト型ウィジェットのほうが手間がかかりません。Nexoply がビジネス情報をもとに答える仕組みもご覧ください。

Vue アプリでの動作

  • アプリの外で動作します。 #app(または Nuxt のルート)の外、document.body 上に表示されるため、再レンダリング、レイアウトの変更、ルート変更で消えることはありません。
  • Vue Router のナビゲーション。 訪問者がクライアント側でページを移動しても会話は続き、URL が変わるとページルール(/pricing だけにサイドタブを表示するなど)が再確認されます。追加のコードは不要です。
  • Shadow DOM。 あなたの CSS、Tailwind のクラス、UIライブラリはチャットに影響せず、チャットのスタイルもアプリに影響しません。
  • 軽量。 非同期で読み込まれ、Cookie は使わず、保存するのは localStorage の匿名の訪問者IDと、sessionStorage の現在の会話だけです。

独自のボタンからチャットを開く

ヒーローセクションや料金表に「ご質問はこちら」のようなボタンを置きたい場合は、クリックハンドラーから nexoply:open-chat イベントを発行します。

<script setup lang="ts">
function openChat() {
  window.dispatchEvent(new Event("nexoply:open-chat"));
}
</script>

<template>
  <button type="button" @click="openChat">ご質問はこちら</button>
</template>

ページの読み込みと同時にチャットを開くには、script タグに data-open="true" を追加します(Nuxt では "data-open": "true")。

ローカルでのテスト、許可するウェブサイト、トラブルシューティング

  • 許可するウェブサイト。 チャットボットページで 許可するウェブサイト を入力している場合は、開発用ホストもポート番号付きで追加します(Vite なら localhost:5173、Nuxt なら localhost:3000)。テスト中は一覧を空のままにしてもかまいません。
  • Content-Security-Policy。 アプリが CSP ヘッダーを送信している場合は、script-src、connect-src、img-src で https://nexoply.com を許可してください。
  • テストする。 開発サーバーを起動してアプリを開き、実際の質問をして、ダッシュボードの 会話 に会話が表示されるか確認します。

ボタンが表示されない場合:

  • タグを確認する。 ブラウザの開発者ツールで、data-chatbot 属性があり src に widget.js を含む script を探します。見つからない場合はキーが空の可能性があります。VITE_NEXOPLY_KEY または NUXT_PUBLIC_NEXOPLY_KEY が設定されているか確認し、.env を編集した後は開発サーバーを再起動してください。
  • コンソールと Network タブを確認する。 CSP エラーは、nexoply.com がまだ許可されていないことを意味します。リクエストのブロックは広告ブロッカーが原因の場合もあるため、拡張機能なしのプライベートウィンドウで試してください。
  • ダッシュボードを確認する。 チャットボットを有効にする のスイッチがオンか、また許可リストを使っている場合は、ドメイン(または localhost とポート番号)が含まれているか確認します。
  • 意図的に非表示になっていないか。 「ボタンなし」に設定したページルールがあると、該当するページでは表示されません。

次のステップ:コードに触れずにカスタマイズ

タグを設置したら、あとはすべてダッシュボードで行えます。変更は再デプロイなしで約1分でサイトに反映されます。チャットボット → カスタマイズ では、メッセージボタン(アイコンまたは独自の画像、ラベル、形、サイズ、色、位置)をデザインしたり、代わりに画面の端にサイドタブを表示したりできます。スマートフォンでは別のデザインにでき、ページルールで特定のページ(/blog/* など)だけボタンを変えたり非表示にしたりできます。チャットウィンドウをブランドに合わせてデザインし、スタート画面に予約、電話、WhatsApp などのボタンを追加しましょう。

アシスタントがビジネスを学ぶ仕組みとカスタマイズのオプション一覧をご覧いただくか、プランと会話数の上限を比較してください。別のフレームワークをお使いなら、React チャットボットコンポーネントのガイドとnext/script で Next.js にチャットボットを追加する方法をご覧ください。

よくある質問

シンプルな Vue チャットボットコンポーネントはありますか?

はい。このガイドの Chatbot.vue コンポーネントです。onMounted を使った <script setup> ブロックで、ご自身のプロジェクトにコピーして使います。公式の Vue プラグインやインストールする npm パッケージはなく、必要もありません。ウィジェットは常に、data-chatbot 属性にキーを指定したスクリプト https://nexoply.com/widget.js で、設定はすべてダッシュボードで行います。

Vue Router などの SPA のナビゲーションでも動作しますか?

はい。アプリの外に表示され、訪問者がクライアント側でページを移動しても会話を維持し、URL が変わるとページルールを再確認します。追加のコードは不要です。

バックエンドやAIのAPIキーは必要ですか?

いいえ。AIとバックエンドは Nexoply が運用し、AIキーや非公開のデータがブラウザに送られることはありません。コードに含めるのはチャットボットのキーだけで、これは公開情報であり、アカウントへのアクセス権はありません。

Nuxt の SSR でも動作しますか?

はい。nuxt.config.ts または useHead で、script タグを通常どおり出力します。ウィジェットはブラウザでのみ動作し、Nuxt のマークアップには触れないため、ハイドレーションの問題は起きません。

一部のページだけに表示できますか?

はい。ページルールを使います:ダッシュボード → チャットボット → カスタマイズ → メッセージボタン → 一部のページで変更。非表示にしたいページでは「ボタンなし」を選びます。読み込み後にウィジェットを削除する API はないため、ページルールで設定します。

独自のボタンからチャットを開けますか?

はい。任意のクリックハンドラーから window.dispatchEvent(new Event("nexoply:open-chat")) を呼び出してください。

質問への対応は、ウェブサイトにおまかせ

ビジネス情報を追加し、アシスタントをテストして、ウェブサイトに設置しましょう。すべて無料プランでできます。