扩展主机

扩展主机负责运行扩展。

扩展主机配置

根据VS Code的配置,有多个扩展主机在不同的位置运行,使用不同的运行时。

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

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

Configuration local extension host web extension host remote extension host
VS Code on the desktop ✔️ ✔️
VS Code with remote (Container, SSH, WSL, GitHub Codespace, Tunnel) ✔️ ✔️ ✔️
VS Code for the Web (vscode.dev, github.dev) ✔️
VS Code for the Web with Codespaces ✔️ ✔️

扩展主机运行时

  • Node.js - 扩展在 Node.js 运行时中运行。由本地和远程扩展主机使用。扩展需要一个 main 入口文件来在其中运行。
  • 浏览器 - 扩展程序在浏览器 WebWorker 运行时中运行。由网页扩展主机使用。扩展程序需要一个 browser 入口文件来在其中运行。更多详情请参阅 网页扩展指南

首选扩展位置

扩展加载的扩展主机取决于:

  • 由VS Code配置提供的可用扩展主机。
  • 扩展的功能:它能否在Node.js和/或网络中运行,如果没有说明,它提供了哪些贡献?
  • 扩展安装在哪里:在本地机器上,在远程机器上,或者两者都有。
  • 扩展的首选位置:extensionKind 属性。

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

  • "extensionKind": ["workspace"] — 表示该扩展需要访问工作区内容,因此需要在工作区所在的位置运行。这可以在本地机器、远程机器或Codespace上运行。大多数扩展都属于这一类。
  • "extensionKind": ["ui", "workspace"] — 表示扩展偏好作为UI扩展运行,但对本地资源、设备或功能没有任何硬性要求。在使用VS Code时,如果本地存在扩展,它将在VS Code的本地扩展主机中运行,这意味着用户不必在远程安装扩展。否则,如果存在,扩展将在VS Code的工作区扩展主机中运行。在使用VS Code for the Web与Codespaces时,它将始终在远程扩展主机中运行(因为没有可用的本地扩展主机)。
  • "extensionKind": ["workspace", "ui"] — 表示扩展偏好作为工作区扩展运行,但对访问工作区内容没有任何硬性要求。在使用VS Code时,如果扩展存在于远程工作区中,则它将在VS Code的工作区扩展主机中运行,否则如果扩展存在于本地,则将在VS Code的本地扩展主机中运行。在使用带有Codespaces的VS Code for the Web时,它将始终在远程扩展主机中运行(因为没有可用的本地扩展主机)。
  • "extensionKind": ["ui"] — 表示扩展必须在靠近UI的地方运行,因为它需要访问本地资源、设备或功能,或者需要低延迟。在VS Code for the Web与Codespaces的情况下,由于没有本地扩展主机可用,这样的扩展无法加载,除非它也是一个web extension。然后它将在web扩展主机中加载,但有一个限制,即它不能实例化一个web worker。

注意: 之前的 VS Code 版本(<1.40)允许扩展指定单个位置作为字符串,但现在已弃用,推荐使用多个位置作为数组。

如果一个扩展可以在Node.js和浏览器中运行,如果有可用的Node.js扩展主机,将会选择它。有一个例外,当配置是用于Web的VS Code与Codespaces,并且extensionKind设置为ui时,那么Web扩展主机将优先于远程扩展主机。

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

稳定性和性能

VS Code 旨在为用户提供一个稳定且高性能的编辑器,行为不当的扩展不应影响用户体验。VS Code 中的扩展主机防止扩展执行以下操作:

  • 影响启动性能
  • 减慢用户界面操作
  • 修改用户界面

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