扩展宿主

扩展宿主(Extension Host)负责运行插件。

扩展宿主配置

根据 VS Code 的配置,会有多个扩展宿主在运行,它们具有不同的运行时,位于不同的位置。

  • local – 本地运行的 Node.js 扩展宿主,与用户界面在同一台机器上。
  • web – 在浏览器中或本地运行的 Web 扩展宿主,与用户界面在同一台机器上。
  • remote – 在容器或远程位置运行的 Node.js 扩展宿主。

下表展示了在各种 VS Code 配置中可用的扩展宿主:

配置 本地扩展宿主 Web 扩展宿主 远程扩展宿主
桌面版 VS Code ✔️ ✔️
使用远程开发的 VS Code (容器、SSH、WSL、GitHub Codespace、隧道) ✔️ ✔️ ✔️
网页版 VS Code (vscode.dev, github.dev) ✔️
带 Codespaces 的网页版 VS Code ✔️ ✔️

扩展宿主运行时

  • Node.js - 扩展在 Node.js 运行时中运行。由本地和远程扩展宿主使用。扩展需要一个 main 入口文件才能在其中运行。
  • Browser - 扩展在 Browser WebWorker 运行时中运行。由 Web 扩展宿主使用。扩展需要一个 browser 入口文件才能在其中运行。有关更多详细信息,请参阅 Web 扩展指南

首选扩展位置

扩展加载所在的扩展宿主取决于:

  • VS Code 配置所提供的可用扩展宿主。
  • 扩展的能力:它能否在 Node.js 和/或 Web 中运行?如果没有指明,它提供了哪些贡献点?
  • 扩展安装的位置:在本地机器上、远程机器上,还是两者都有。
  • 扩展的首选位置:extensionKind 属性。

extensionKind扩展清单(extension manifest)中的一个属性。它允许扩展指定首选的运行位置。可以是拥有工作区的机器(workspace),也可以是用户界面(ui)。如果扩展可以在两者上运行,它可以指定优先级顺序。

  • "extensionKind": ["workspace"] — 表示扩展需要访问工作区内容,因此需要在工作区所在的位置运行。这可以在本地机器、远程机器或 Codespace 上。大多数扩展属于这一类。
  • "extensionKind": ["ui", "workspace"] — 表示扩展倾向于作为 UI 扩展运行,但在本地资产、设备或功能上没有任何硬性要求。使用 VS Code 时,如果存在本地扩展宿主,扩展将在该宿主中运行,这意味着用户不必在远程端安装该扩展。否则,扩展将在 VS Code 的工作区扩展宿主中运行(如果存在)。当使用带 Codespaces 的网页版 VS Code 时,它将始终在远程扩展宿主中运行(因为没有可用的本地扩展宿主)。
  • "extensionKind": ["workspace", "ui"] — 表示扩展倾向于作为工作区扩展运行,但在访问工作区内容方面没有任何硬性要求。使用 VS Code 时,如果存在远程工作区,扩展将在 VS Code 的工作区扩展宿主中运行;否则,如果存在本地扩展宿主,则在本地运行。当使用带 Codespaces 的网页版 VS Code 时,它将始终在远程扩展宿主中运行(因为没有可用的本地扩展宿主)。
  • "extensionKind": ["ui"] — 表示扩展必须在 UI 附近运行,因为它需要访问本地资产、设备或功能,或者因为需要低延迟。在带 Codespaces 的网页版 VS Code 的情况下(没有可用的本地扩展宿主),除非它是 Web 扩展,否则此类扩展无法加载。届时它将在 Web 扩展宿主中加载,并受到无法实例化 Web Worker 的限制。

注意:较早的 VS Code 版本(<1.40)允许扩展将单个位置指定为字符串,但这种方式已被弃用,建议改为使用数组指定多个位置。

如果一个扩展既能在 Node.js 中运行,也能在浏览器中运行,那么在可用情况下将优先选择 Node.js 扩展宿主。有一个例外:当配置为“带 Codespaces 的网页版 VS Code”且 extensionKind 设置为 ui 时,Web 扩展宿主的优先级高于远程扩展宿主。

如果一个扩展仅限于 Web,无论 extensionKind 设置如何,它都将始终在 Web 扩展宿主中运行。在这种情况下,我们建议不要定义 extensionKind

稳定性和性能

VS Code 旨在为用户提供稳定且高性能的编辑器,表现不佳的扩展不应影响用户体验。VS Code 中的扩展宿主可以防止扩展:

  • 影响启动性能
  • 拖慢 UI 操作
  • 修改 UI

此外,VS Code 允许扩展声明其 激活事件(Activation Events) 并进行延迟加载。例如,Markdown 扩展应该仅在用户打开 Markdown 文件时加载。这确保了扩展不会消耗不必要的 CPU 和内存。

© . This site is unofficial and not affiliated with Microsoft.