扩展宿主
扩展主机负责运行扩展。
扩展主机配置
根据 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 和内存。