markstream-vue について
通常はViteベースでNuxtではない、通常のVue 3プロジェクトでMarkstream Vueを使うためのスキルです。MarkdownやAIチャット画面の開発者向けに、ストリーミング表示、コードブロック、長い履歴の仮想化を案内します。
主な機能
- 01チャット・ドキュメント・軽量モードの選択
- 02Markdownのストリーミング速度の設定
- 03組み込みコードブロック描画
- 04長いチャット履歴の仮想化
- 05カスタムコンポーネントの登録と検証
活用シーン
- 01AIチャットメッセージ画面の構築
- 02リッチなMarkdown文書の描画
- 03長い会話タイムラインへの対応
- 04ノードやコードブロックのカスタマイズ
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ simon-he95/ markstream-vue --skill markstream-vueインストール後、Claude Code で/markstream-vueを入力して読み込まれたか確認します。
同梱ファイルagents/openai.yaml
詳細
Markstream Vue 3
ホストアプリが通常の Vue 3 アプリで、一般的に Vite ベースであり、Nuxt ではない場合にこのスキルを使用します。
ワークフロー
- リポジトリが Vue 3 であり、Nuxt ではないことを確認します。
markstream-vueと、必要な機能に必要なオプションのピア依存関係のみをインストールします。- リセットCSSの後に
markstream-vue/index.cssをインポートします。- Tailwind または UnoCSS のプロジェクトでは、
@import 'markstream-vue/index.css' layer(components);を使用します。 - ルートの JS インポートではスタイルは注入されません。
markstream-vue/index.cssまたはmarkstream-vue/index.px.cssを明示的に使用します。
- Tailwind または UnoCSS のプロジェクトでは、
contentから始め、表示領域に応じてレンダラーモードを選択します。- AI チャットや SSE 出力には
mode="chat"を使用します。軽量なバッチを使用し、fade=falseとmax-live-nodes=0を設定します。smooth-streaming="auto"は表示中の出力のペースを調整します。 - リッチなドキュメント表示領域には
mode="docs"を使用します。これはデフォルトで、より大きなバッチ、ツールチップ、フェードを有効にします。 - 表示領域は軽量でもチャットではない場合は、
mode="minimal"を使用します。 - 通常のフェンス付きコードには組み込みの
CodeBlockNodeが使用されます。オプションのピア依存関係であるstream-diffsがインストールされている場合は拡張され、そうでない場合は<pre><code>にフォールバックします。プレーンな経路を強制するにはrender-code-blocks-as-pre=trueを設定します。アプリ側でレンダラーを管理する場合は、スコープを限定したsetCustomComponents(...)でcode_blockを置き換えます。 - ラッパーに依存するフェード、バッチ処理、遅延処理、仮想化、タイプライター、カスタムコンポーネントなどの機能も無効にできる場合にのみ、
dom-mode="minimal"を使用します。それ以外の場合はフル DOM にフォールバックします。 typewriterが制御するのは点滅カーソルのみで、デフォルトはfalseです。高頻度のチャットにはtypewriter="simple"を推奨します。複雑なインラインカーソルの配置には precise モードを使用します。- チャンクの生のタイミングを維持するには
:smooth-streaming="false"を設定します。初回画面のコンテンツでも滑らかなペースを強制するには:smooth-streaming="true"を設定します(SSR ではハイドレーションの不一致が発生する可能性があります)。 - Vue 3(Nuxt を含む)では、
smooth-streamingは出力のペースを制御し、fadeは不透明度を制御します。両方を同時に有効にできます。mode="chat"では、軽量なデフォルトとしてfade=falseが維持されます。テキストを徐々に表示したい場合はfadeを追加し、アニメーションのコストを重視する場合は無効のままにします。Vue 3 の追加時フェードでは、安定したバッチ(200 ms、50 ms の結合ウィンドウ、テキストノードあたり最大 4 バッチ)が使用されます。後から追加した内容によって、先行するバッチが再開されることはありません。 - ストリーミングと履歴の復元:チャット UI では、同じ
MarkdownRenderがストリーミングを開始し、後からfinal=trueになると履歴表示に切り替わります。- ストリーミング:
mode="chat"とfinalから始めます。テキストを表示するにはfadeを追加し、カーソルを表示する場合にのみtypewriterを追加します。 - 復元後または完了済みのチャット履歴:
final=trueのときにレイアウト戦略が切り替わらないよう、同じチャット行でmode="chat"を維持します。:smooth-streaming="false"とtypewriter=falseを使用し、希望する表示開始/表示効果に応じてfadeを個別に選択します。意図した視覚的な方針でない限り、ストリーミング状態の反転値に連動させないでください。 - 軽量な非チャットの復元コンテンツには
mode="minimal"を使用します。mode="docs"はリッチなドキュメント表示領域にのみ使用し、既存のチャットメッセージを確定するためには使用しません。
- ストリーミング:
- アプリでカスタム AST 制御、ワーカーによる事前解析、またはペース調整を超える構造更新が必要な場合にのみ、
nodesとfinalに切り替えます。 html-policyのデフォルトがsafeになったこと、およびmermaid-propsによって Mermaid の strict モードがデフォルトで有効になったことに留意してください。
- AI チャットや SSE 出力には
- 長い AI の会話履歴や既存のメッセージ仮想化機能には、仮想スクロールの経路を選択します。
- アプリでタイムラインの仮想化をすでに管理していない場合は、
MarkstreamVirtualTimelineを優先します。 - アプリですでに
vue-virtual-scrollerのDynamicScrollerを使用している場合は、useMarkstreamVirtualAdapter()を使い、Markdown の項目にadapter.markdownProps(item, index)をバインドします。 - 行の装飾も項目の高さに含めるため、タイムラインの外側の行に
adapter.measureItem(item, index, el)を設定します。 - レンダラー要素の現在の
offsetHeightではなく、Markstream が報告する論理高さ(アダプター/仮想化機能を通じたmetrics.totalHeight)を使用します。Markdown ノードの仮想化では、表示中のウィンドウのみがマウントされる場合があるためです。 - スレッドを切り替える際は、スクローラーのキャッシュとともに
adapter.captureThreadState()を保存します。Markstream のアンカーを復元する前に、スクローラーのキャッシュを復元します。
- アプリでタイムラインの仮想化をすでに管理していない場合は、
- ローカルでオーバーライドするには
custom-idとスコープを限定したsetCustomComponents(...)を使用します。リポジトリにアプリレベルのプラグインエントリがすでにある場合は、markstream-vueから{ VueRendererMarkdown }をインポートして登録します。 - 必要最小限の開発、ビルド、または型チェックのコマンドで検証します。
デフォルトの判断
- Vue 3 アプリでは、デフォルトで
contentを使用します。低レベルのレンダリング用 props を細かく調整する前に、modeを選択してください。 - リッチなドキュメント向けのデフォルト設定を使用する場合に限り、
modeを省略してください。 - スムーズなストリーミング(
smooth-streaming="auto")は、typewriterまたはmax-live-nodes <= 0の場合にデフォルトで有効です。ペース調整の対象はcontentの経路のみで、nodesモードには影響しません。 nodesで手動のペース調整を行うには、useSmoothMarkdownStreamを直接使用します。チャンクをenqueue()し、完了時にfinish()を呼び出し、visibleからレンダリングして、最終解析の前にcaughtUpを待ちます。- ストリーミング出力に追従させる非仮想化のチャットスクローラーでは、
markstream-vue/utilsからuseStickToBottomをインポートし、Vue が新しいコンテンツを反映した後にscheduleScrollToBottom()を呼び出します。書き込みをまとめて処理し、手動でのスクロールバックを維持します。トークンごとにscrollIntoView({ behavior: 'smooth' })を実行しないでください。長い混在タイムラインには、代わりにstick-to-bottom="auto"を指定したMarkstreamVirtualTimelineを使用します。 - ストリーミングと履歴の復元では、同じチャット行に対して同じレンダラーモードを維持します。完了済みの履歴では、ペース調整やカーソルを無効にできます。フェードは独立した視覚的な選択肢で、ストリーミング中も完了後も有効にしておけます。コンテンツを別のリッチドキュメント用サーフェスに移す場合に限り、
mode="docs"に切り替えてください。例についてはdocs/guide/ai-chat-streaming.mdを参照してください。 - リポジトリですでに共有プラグインのエントリーポイントを使用している場合を除き、コンポーネントはローカルで登録することを推奨します。
- Vue 3 アプリですでにメッセージを仮想化している場合は、外側の仮想化機能に処理を任せ、大きな Markdown メッセージに限り
virtual-scrollを有効にしてください。 vue-virtual-scrollerでは、sessionKeyをコンテンツの識別情報(thread:item:revision)に、measurementKeyを幅、テーマ、フォント、密度などのレイアウトの識別情報に関連付けてください。- 強化されたコードブロックでアプリレベルの事前読み込みが必要な場合は、
preloadCodeBlockRuntimeを使用してください。意図的に低レベルのコントローラーを使用する場合は、stream-diffsから高度な API を直接インポートしてください。markstream-vueの raw-runtime getter には依存しないでください。 - Vue 3 の強化コード用サーフェスでは
stream-diffsのみを使用します。stream-monacoはインストールしないでください。 - Vue 3 で大きなコードブロック(数万行)を扱う場合は、
markstream-vueのsetStreamDiffsWorkerPool(...)を使い、上流の@pierre/diffsのWorkerPoolManagerを注入して、Shiki のトークン化を Web Worker に委譲してください。ホスト側で独自のバンドラーを使ってプールを構築し(@pierre/diffs/worker/worker.js?worker)、@pierre/diffsを直接の依存関係に追加します。markstream-vue はこれをランタイムオプションworkerManagerとして転送し、アクティブなisDark/theme/themesのテーマが変更されるたびにプールと同期します。注入がない場合、またはプールが利用不可と報告した場合、ハイライト処理はメインスレッドで行われます(動作に変更はありません)。ライブラリ内でワーカーをバンドルしたり起動したりしないでください。 - 組み込みサーフェスは、トップレベルの
code-block-optionsまたは直接のCodeBlockNode.codeBlockOptionsで設定します。ヘッダー/ツールバーの props はcode-block-propsに維持してください。Markstream はテーマ、コード/言語、ストリーミングのライフサイクル、ヘッダー、マウント/表示のタイミング、および破棄の管理を担います。 - タスクで信頼済みのレガシー動作を明示的に維持する場合を除き、
html-policy="safe"と Mermaid の strict モードを維持してください。 - 信頼済みのサーフェスで強化前の動作が必要な場合は、
html-policy="trusted"と:mermaid-props="{ isStrict: false }"をローカルで指定してオプトアウトし、最終引き継ぎ時に信頼境界を明記してください。 - ホストが実際に Nuxt の場合、SSR 固有の設定は
markstream-nuxtに任せてください。
参考にするドキュメント
docs/guide/quick-start.mddocs/guide/installation.mddocs/guide/usage.mddocs/guide/ai-chat-streaming.mddocs/guide/performance.mddocs/guide/component-overrides.mddocs/guide/code-block-runtime.md
コメント
Markdown 対応