Skip to content

フロントエンド概要

N.E.K.O. のメイン UI は FastAPI メインサーバーから配信されます。リポジトリには、ビルドと実行時の境界が異なる 3 つのフロントエンドコードベースがあります。

コードベース

サーフェス技術ソース実行時成果物
メイン UI と補助ページJinja2、Vanilla JavaScript、CSStemplates/static/app/static/live2d/static/vrm/static/mmd/メインサーバーが描画し、通常はポート 48911 を使用
チャット UIReact 18、TypeScriptfrontend/react-neko-chat/static/react/neko-chat/neko-chat-window.iife.js.css
プラグインマネージャーVue 3、TypeScriptfrontend/plugin-manager/frontend/plugin-manager/dist/、プラグインサーバーから配信

アバターレンダラーはメイン UI の一部です。Live2D は Pixi/Cubism、VRM と MMD は Three.js、PNGTuber は static/pngtuber-core.js を使用します。Electron デスクトップペットはホストモードであり、別のアバター形式ではありません。

唯一のチャット実装

frontend/react-neko-chat/ がチャット UI の唯一の実装です。IIFE は window.NekoChatWindow を公開し、static/app/app-react-chat-window/ のスクリプトが #react-chat-window-root にマウントします。

templates/index.htmltemplates/chat.html はどちらもこのマウント先を持ちます。前者はメインページ内の折りたたみ可能なフローティング UI、後者は compact または full の独立チャット UI を提供します。

古い #chat-container DOM は旧スクリプト向けの互換シェルとしてのみ残っています。両テンプレートで非表示にされ、static/app/app-chat-adapter.js が従来の appendMessage() 呼び出しを window.reactChatWindowHost への呼び出しに置き換えます。旧コンテナに新しい UI やロジックを追加しないでください。

Web と Electron ホスト

ブラウザーでは / が単一のメインページです。開発とテストでは /chat/chat_full/subtitle も直接開けます。

Electron ディストリビューションは別のホストアプリです。複数のルートを独立したウィンドウに読み込み、ペットはメインページテンプレート、チャットは /chat または /chat_full、字幕は /subtitle を使います。レンダラーは window.nekoChatWindowwindow.nekoSubtitle など preload のグローバルを検出し、ネイティブウィンドウ生成と IPC はホストが所有します。

クロスウィンドウの Web フォールバックは static/app/app-interpage/ にあり、neko_page_channel BroadcastChannel と同一オリジンの postMessage を使います。ルート、アセット URL、初期化順序、ウィンドウ通信を変更するときは、ブラウザーと Electron の両方を確認してください。

読み込みとアセットの規則

  • サーバー描画ページでは /static/... のルート相対 URL を使い、現在のルートからアセットパスを組み立てません。
  • ユーザーモデルと Workshop モデルは専用マウントから配信されます。ファイルシステムパスをブラウザー URL に変換しないでください。
  • static/ のクラシックスクリプトは規定のグローバルと DOM イベントで通信するため、テンプレートの読み込み順序も実行時契約です。
  • React チャットの変更は frontend/react-neko-chat/ で行い、生成ファイルを編集せず IIFE を再ビルドします。
  • プラグインマネージャーの変更は frontend/plugin-manager/ で行います。そのビルドとローカライズはメインページから独立しています。

現在のエントリーポイントはページとテンプレート国際化、各レンダラーのページを参照してください。