markstream-nuxt について
SSR の境界が重要な Nuxt 3 または 4 アプリへの Markstream 統合を支援するスキルです。クライアント専用依存関係、CSS、描画モード、ストリーミング、SSR を考慮した検証を扱います。
主な機能
- 01Nuxt 3 と 4 の統合案内
- 02ブラウザー依存機能のクライアント境界
- 03Markstream CSS の明示的な設定
- 04描画モードとストリーミングの案内
- 05SSR を考慮した検証
活用シーン
- 01Nuxt アプリへの Markstream 導入
- 02ブラウザー専用依存関係のサーバー経路への混入防止
- 03ストリーミングチャット描画の設定
- 04SSR のハイドレーション問題の回避
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ simon-he95/ markstream-vue --skill markstream-nuxtインストール後、Claude Code で/markstream-nuxtを入力して読み込まれたか確認します。
同梱ファイルagents/openai.yaml
詳細
Markstream Nuxt
ホストアプリが Nuxt で、SSR の境界が重要な場合にこのスキルを使用します。
ワークフロー
- リポジトリが Nuxt 3 または 4 であることを確認します。
markstream-vueと、必要な機能に必要なオプションのピア依存関係のみをインストールします。- ブラウザー専用のピア依存関係は、クライアント専用の境界内に配置します。
<client-only>ラッパー、.clientプラグイン、またはガード付きのセットアップパスを優先します。
markstream-vue/index.cssを、クライアントセーフなアプリシェルまたはプラグインからインポートします。- ルートの JS インポートではスタイルは注入されません。
markstream-vue/index.cssまたはmarkstream-vue/index.px.cssを明示的に使用します。
- ルートの JS インポートではスタイルは注入されません。
contentから始め、表示面に応じてレンダラーモードを選び、UI でカスタム AST の制御が必要な場合にのみnodesとfinalに移行します。- AI チャットまたは SSE 出力には
mode="chat"を使用します。軽量なバッチ、fade=false、max-live-nodes=0が適用されます。smooth-streaming="auto"は、表示される出力の速度を調整します。 - リッチなドキュメント表示面には
mode="docs"を使用します。これがデフォルトで、大きなバッチ、ツールチップ、フェードが有効になります。 - 軽量な非チャット表示面には
mode="minimal"を使用します。 - 通常のフェンス付きコードには組み込みレンダラーが使われ、オプションのピア依存関係がインストールされている場合は
stream-diffsによって機能が強化されます。強制的にプレーンな表示にするにはrender-code-blocks-as-preを、スコープを限定したアプリ所有のレンダラーにはsetCustomComponents(customId, { code_block: ... })を使用します。 typewriterが制御するのは点滅カーソルのみで、デフォルトはfalseです。高頻度のチャットにはtypewriter="simple"を優先します。- 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を指定します。 - 復元するチャット履歴/完了済みのチャット履歴:同じチャット行で
mode="chat"を維持し、:smooth-streaming="false"とtypewriter=falseを使用します。fadeは、希望する表示開始時の効果に合わせて個別に選びます。視覚的な方針として意図している場合を除き、ストリーミング状態の反転に連動させないでください。 - 軽量な非チャットの復元コンテンツには
mode="minimal"を使用し、リッチなドキュメント表示面にのみmode="docs"を使用します。
- ストリーミング:
- SSR では、初回画面に表示されるコンテンツで
smooth-streaming="true"を避けます。auto内のマウント済みゲートが、ハイドレーションの不一致を防ぎます。 html-policyのデフォルトがsafeになり、Mermaid の厳格モードがmermaid-propsによってデフォルトで有効になっていることを忘れないでください。
- AI チャットまたは SSE 出力には
- 最小限の関連する Nuxt の開発、ビルド、または型チェックコマンドで検証します。
デフォルトの判断基準
- 機能の完全性よりも SSR の安全性を優先します。
- 対象のサーフェスでリッチドキュメントのデフォルト設定を使用する場合に限り、
modeを省略します。 - スムーズなストリーミングは、マウント時に制御されるため、
autoモード(デフォルト)では SSR に安全です。最初の画面に表示する SSR コンテンツでは、smooth-streaming="true"を使用しないでください。マウント済みかどうかの制御を迂回するため、ハイドレーションの不一致や空白のフラッシュが発生する可能性があります。 - 非仮想化チャットスクローラーでは、
markstream-vue/utilsからuseStickToBottomをインポートし、Vue が新しいコンテンツを反映した後にscheduleScrollToBottom()を呼び出します。このコンポーザブルはマウント後にブラウザーのリスナーを登録します。長い複合タイムラインには、stick-to-bottom="auto"を指定してMarkstreamVirtualTimelineを使用します。 - サーバーコードのパスから、インポート時にブラウザーのグローバル変数へアクセスすることは避けてください。
- 拡張コードランタイム、Mermaid ワーカーなど、負荷の大きいピア依存関係は、リポジトリですでに実証済みの SSR パターンがない限り、クライアント専用として扱います。
- 大きなコードブロックでは、オプションのオフスレッドハイライトプール(上流の
@pierre/diffsのWorkerPoolManagerを基盤とする、markstream-vueのsetStreamDiffsWorkerPool)もクライアント専用です。クライアント専用のプラグインまたはコンポーネントで注入し、サーバーコードのパスでは使用しないでください。 - すべての Markstream パッケージの拡張コードブロックでは
stream-diffsを使用します。stream-monacoはインストールしないでください。 - サポートされている組み込みのコードサーフェス設定には、トップレベルの
code-block-optionsを使用します。テーマ、コードと言語、ストリーミングのライフサイクル、ヘッダー、マウント、表示、破棄は Markstream の制御下に置いてください。 - 信頼できる従来のレンダリングを維持する場合を除き、
html-policy="safe"と Mermaid の厳格モードを維持してください。 - 信頼できるクライアント専用サーフェスで以前の動作が必要な場合は、
html-policy="trusted"と:mermaid-props="{ isStrict: false }"をローカルで指定してオプトアウトし、そのサーフェスが信頼できる理由を記載してください。
参考になるドキュメント
docs/nuxt-ssr.mddocs/guide/installation.mddocs/guide/usage.mddocs/guide/troubleshooting.md
コメント
Markdown 対応