拡張機能ホスト
Extension Host(拡張機能ホスト)は、拡張機能を実行するためのプロセスです。
Extension Host の構成
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 | ✔️ | ✔️ |
Extension Host のランタイム
- Node.js - 拡張機能が Node.js ランタイムで実行されます。ローカルおよびリモートの拡張機能ホストで使用されます。実行するには、拡張機能に
mainエントリファイルが必要です。 - Browser - 拡張機能が ブラウザ WebWorker ランタイムで実行されます。Web 拡張機能ホストで使用されます。実行するには、拡張機能に
browserエントリファイルが必要です。詳細は Web 拡張機能ガイド を参照してください。
優先される拡張機能の場所
拡張機能が読み込まれる場所は、以下に依存します。
- VS Code の構成によって提供される利用可能な拡張機能ホスト。
- 拡張機能の機能:Node.js や Web で実行可能か、あるいは(明示されていない場合)どのような貢献(contributions)を提供するか。
- 拡張機能のインストール場所:ローカルマシン、リモートマシン、あるいはその両方。
- 拡張機能が優先する場所:
extensionKindプロパティ。
extensionKind は extension manifest(拡張機能マニフェスト) 内のプロパティです。これにより、拡張機能は実行したい優先場所を指定できます。場所には、ワークスペースが存在するマシン(workspace)またはユーザーインターフェース(ui)を指定できます。両方で実行可能な場合は、優先順位を指定することも可能です。
"extensionKind": ["workspace"]— 拡張機能がワークスペースの内容へのアクセスを必要とし、そのためワークスペースがある場所で実行する必要があることを示します。これはローカルマシン、リモートマシン、Codespace のいずれかになります。ほとんどの拡張機能はこのカテゴリに分類されます。"extensionKind": ["ui", "workspace"]— 拡張機能が UI 拡張機能として実行されることを優先しますが、ローカルのアセット、デバイス、機能に対する厳密な要件はないことを示します。通常、この拡張機能は VS Code のローカル拡張機能ホスト(存在する場合)で実行されるため、ユーザーはリモート側に拡張機能をインストールする必要がありません。そうでなければ、ワークスペース拡張機能ホストで実行されます。Codespaces を使用した Web 版 VS Code では、常にリモート拡張機能ホストで実行されます(ローカル拡張機能ホストが存在しないため)。"extensionKind": ["workspace", "ui"]— 拡張機能がワークスペース拡張機能として実行されることを優先しますが、ワークスペースの内容へのアクセスに対する厳密な要件はないことを示します。通常、この拡張機能は VS Code のワークスペース拡張機能ホスト(リモートワークスペースに存在する場合)で実行され、それ以外の場合はローカル拡張機能ホストで実行されます。Codespaces を使用した Web 版 VS Code では、常にリモート拡張機能ホストで実行されます。"extensionKind": ["ui"]— ローカルのアセットやデバイスへのアクセスが必要、あるいは低レイテンシが必要なため、UI に近い場所で実行しなければならないことを示します。ローカル拡張機能ホストが存在しない「Codespaces を使用した Web 版 VS Code」の場合、このような拡張機能は Web 拡張機能 でない限り読み込むことができません。Web 拡張機能である場合は Web 拡張機能ホストに読み込まれますが、Web Worker をインスタンス化できないという制限がかかります。
注: VS Code の以前のリリース(1.40 未満)では、単一の場所を文字列として指定できましたが、現在は非推奨となっており、配列形式で複数の場所を指定することが推奨されています。
拡張機能が Node.js とブラウザの両方で実行可能な場合、利用可能であれば Node.js 拡張機能ホストが選択されます。ただし、例外として「Codespaces を使用した Web 版 VS Code」かつ extensionKind が ui に設定されている場合は、リモート拡張機能ホストよりも Web 拡張機能ホストが優先されます。
Web 専用の拡張機能である場合、extensionKind の設定に関わらず常に Web 拡張機能ホストで実行されます。その場合、extensionKind を定義しないことを推奨します。
安定性とパフォーマンス
VS Code はユーザーに安定した高性能なエディタを提供することを目指しており、動作の悪い拡張機能がユーザー体験に影響を与えないようにしています。VS Code の Extension Host は、拡張機能が以下のことを行わないように防ぎます。
- 起動パフォーマンスへの影響
- UI 操作の遅延
- UI の改変
さらに、VS Code では拡張機能が自身の Activation Events(アクティベーションイベント) を宣言し、遅延読み込み(レイジーロード)を行うことが可能です。例えば、Markdown 拡張機能はユーザーが Markdown ファイルを開いたときにのみ読み込まれるべきです。これにより、拡張機能が不必要に CPU やメモリを消費することを防ぎます。