在 VS Code 中试用

扩展宿主

扩展宿主负责运行扩展。

扩展宿主配置

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

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

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

配置 本地扩展宿主 web 扩展宿主 远程扩展宿主
桌面版 VS Code ✔️ ✔️
使用远程的 VS Code (容器, SSH, WSL, GitHub Codespace, Tunnel) ✔️ ✔️ ✔️
Web 版 VS Code (vscode.dev, github.dev) ✔️
使用 Codespaces 的 Web 版 VS Code ✔️ ✔️

扩展宿主运行时

  • Node.js - 扩展在 Node.js 运行时中运行。本地和远程扩展宿主使用它。扩展需要一个 main 入口文件才能在其上运行。
  • 浏览器 - 扩展在 浏览器 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 扩展宿主。有一个例外,当配置为带有 Codespaces 的 Web 版 VS Code 并且 extensionKind 设置为 ui 时,web 扩展宿主将优先于远程扩展宿主。

如果扩展是仅限 web 的,它将始终在 web 扩展宿主上运行,无论 extensionKind 设置如何。在这种情况下,我们建议不定义 extensionKind

稳定性与性能

VS Code 旨在为用户提供稳定且高性能的编辑器,行为不当的扩展不应影响用户体验。VS Code 中的扩展宿主阻止扩展

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

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