扩展宿主
扩展宿主负责运行扩展。
扩展宿主配置
根据 VS Code 的配置,可能会运行多个扩展宿主,它们具有不同的运行时并位于不同的位置。
- 本地 – 运行在本地的 Node.js 扩展宿主,与用户界面位于同一机器上。
- Web – 运行在浏览器中或本地的 Web 扩展宿主,与用户界面位于同一机器上。
- 远程 – 运行在容器或远程位置的 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
入口文件才能在此运行时中运行。 - 浏览器 - 扩展运行在 浏览器 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,无论 extensionKind
设置如何,它都将始终在 Web 扩展宿主上运行。在这种情况下,我们建议不要定义 extensionKind
。
稳定性和性能
VS Code 致力于为用户提供稳定且高性能的编辑器,表现异常的扩展不应影响用户体验。VS Code 中的扩展宿主可防止扩展发生以下情况:
- 影响启动性能
- 减慢 UI 操作
- 修改 UI
此外,VS Code 允许扩展声明其激活事件并延迟加载它们。例如,Markdown 扩展只应在用户打开 Markdown 文件时加载。这确保扩展不会消耗不必要的 CPU 和内存。