扩展宿主
扩展宿主负责运行扩展。
扩展宿主配置
根据 VS Code 的配置,存在多个扩展宿主在运行,具有不同的运行时环境,位于不同的位置。
- local – 本地 Node.js 扩展宿主,运行在与用户界面相同的机器上。
- web – Web 扩展宿主,运行在浏览器或与用户界面相同的机器上。
- remote – 远程 Node.js 扩展宿主,运行在容器或远程位置。
下表显示了在 VS Code 的各种配置中可用的扩展宿主
| 配置 | 本地扩展宿主 | Web 扩展宿主 | 远程扩展宿主 |
|---|---|---|---|
| 桌面上的 VS Code | ✔️ | ✔️ | |
| 具有远程功能的 VS Code (Container, SSH, WSL, GitHub Codespace, Tunnel) | ✔️ | ✔️ | ✔️ |
| Web 上的 VS Code (vscode.dev, github.dev) | ✔️ | ||
| 带有 Codespaces 的 Web 上的 VS Code | ✔️ | ✔️ |
扩展宿主运行时环境
- Node.js - 扩展在 Node.js 运行时环境中运行。本地和远程扩展宿主使用它。扩展需要一个
main入口文件才能在其中运行。 - Browser - 扩展在 Browser 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 附近运行,因为它需要访问本地资源、设备或功能,或者因为需要低延迟。在 Web 上的 VS Code 与 Codespaces 的情况下,如果没有可用的本地扩展宿主,则此类扩展无法加载,除非它也是一个 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 和内存。