拡張機能ホスト
拡張ホストは、拡張機能を実行する役割を担います。
拡張ホストの構成
VS Code の構成に応じて、異なるランタイムで、異なる場所に複数の拡張ホストが実行されます。
- local – ユーザーインターフェースと同じマシンでローカルに実行される Node.js 拡張ホスト。
- web – ブラウザまたはローカルで、ユーザーインターフェースと同じマシンで実行される Web 拡張ホスト。
- remote – コンテナまたはリモートの場所でリモートで実行される Node.js 拡張ホスト。
以下の表は、VS Code の様々な構成で利用できる拡張ホストを示しています。
| 設定 | ローカル拡張ホスト | Web 拡張ホスト | リモート拡張ホスト |
|---|---|---|---|
| デスクトップ版 VS Code | ✔️ | ✔️ | |
| リモート接続のある VS Code (コンテナ、SSH、WSL、GitHub Codespace、トンネル) | ✔️ | ✔️ | ✔️ |
| Web 用 VS Code (vscode.dev、github.dev) | ✔️ | ||
| Codespaces と連携した Web 用 VS Code | ✔️ | ✔️ |
拡張ホストのランタイム
- Node.js - 拡張機能は Node.js ランタイムで実行されます。ローカルおよびリモートの拡張ホストで使用されます。拡張機能は、実行するために
mainエントリファイルを必要とします。 - Browser - 拡張機能は ブラウザ WebWorker ランタイムで実行されます。Web 拡張ホストで使用されます。拡張機能は、実行するために
browserエントリファイルを必要とします。詳細については、Web 拡張機能ガイドを参照してください。
優先される拡張機能の場所
拡張機能がロードされる拡張ホストは、以下に依存します。
- VS Code の構成によって利用可能な拡張ホスト。
- 拡張機能の機能: Node.js および/または Web で実行できるか、あるいは指定されていない場合、どのようなコントリビューションを提供するのか?
- 拡張機能がどこにインストールされているか: ローカルマシン、リモートマシン、またはその両方。
- 拡張機能が優先する場所:
extensionKindプロパティ。
extensionKind は、拡張機能マニフェストのプロパティです。これにより、拡張機能は優先される実行場所を指定できます。これはワークスペースのあるマシン (workspace) またはユーザーインターフェース (ui) のいずれかです。拡張機能が両方で実行できる場合、優先順位を指定できます。
"extensionKind": ["workspace"]— 拡張機能がワークスペースのコンテンツへのアクセスを必要とし、したがってワークスペースが配置されている場所で実行する必要があることを示します。これはローカルマシン、リモートマシン、または Codespace のいずれかです。ほとんどの拡張機能はこのカテゴリに該当します。"extensionKind": ["ui", "workspace"]— 拡張機能が UI 拡張機能として実行することを優先するが、ローカルアセット、デバイス、または機能に関して厳密な要件がないことを示します。VS Code を使用する場合、拡張機能がローカルに存在すれば、VS Code のローカル拡張ホストで実行され、ユーザーがリモートに拡張機能をインストールする必要がなくなります。それ以外の場合、拡張機能がそこに存在すれば、VS Code のワークスペース拡張ホストで実行されます。Codespaces と連携した Web 用 VS Code を使用する場合、常にリモート拡張ホストで実行されます (ローカル拡張ホストが利用できないため)。"extensionKind": ["workspace", "ui"]— 拡張機能がワークスペース拡張機能として実行することを優先するが、ワークスペースのコンテンツへのアクセスに関して厳密な要件がないことを示します。VS Code を使用する場合、拡張機能がリモートワークスペースに存在すれば VS Code のワークスペース拡張ホストで実行され、そうでなければローカルに存在すれば VS Code のローカル拡張ホストで実行されます。Codespaces と連携した Web 用 VS Code を使用する場合、常にリモート拡張ホストで実行されます (ローカル拡張ホストが利用できないため)。"extensionKind": ["ui"]— 拡張機能がローカルアセット、デバイス、または機能へのアクセスを必要とするため、または低遅延が必要なため、UI に近い場所で実行する必要があることを示します。Codespaces と連携した Web 用 VS Code の場合、ローカル拡張ホストが利用できないため、このような拡張機能は、それがWeb 拡張機能でもある場合を除き、ロードできません。その場合、Web 拡張ホストでロードされますが、Web Worker をインスタンス化できないという制限があります。
注: 以前の VS Code リリース (<1.40) では、拡張機能が単一の場所を文字列として指定できましたが、これは配列として複数の場所を指定する形に非推奨化されました。
拡張機能が Node.js とブラウザの両方で実行できる場合、利用可能であれば Node.js 拡張ホストが選択されます。ただし、例外が1つあります。Codespaces と連携した Web 用 VS Code の構成で、extensionKind が ui に設定されている場合、Web 拡張ホストがリモート拡張ホストよりも優先されます。
拡張機能が Web 専用の場合、extensionKind の設定にかかわらず、常に Web 拡張ホストで実行されます。この場合、extensionKind を定義しないことをお勧めします。
安定性とパフォーマンス
VS Code は、ユーザーに安定した高性能なエディタを提供することを目指しており、動作の悪い拡張機能がユーザーエクスペリエンスに影響を与えるべきではありません。VS Code の拡張ホストは、拡張機能が以下を行うのを防ぎます。
- 起動パフォーマンスに影響を与える
- UI 操作を遅くする
- UI を変更する
さらに、VS Code は拡張機能にアクティベーションイベントを宣言させ、それらを遅延ロードします。例えば、Markdown 拡張機能は、ユーザーが Markdown ファイルを開いたときにのみロードされるべきです。これにより、拡張機能が不必要な CPU とメモリを消費しないことが保証されます。