扩展宿主与远程、网页
扩展宿主负责运行扩展。VS Code 会按安装方式同时存在多个宿主,运行时和地点都不一样。
三种宿主
| 宿主 | 运行时 | 在哪 |
|---|---|---|
| local | Node.js | 和界面同一台机器。入口是 main |
| remote | Node.js | 容器、SSH、WSL、Codespace、隧道里。入口是 main |
| web | 浏览器 Web Worker | 浏览器里,或桌面上的网页宿主。入口是 browser |
桌面 VS Code 有 local 和 web。加上远程后三种都有。纯 vscode.dev / github.dev 只有 web。网页版再加 Codespaces 时是 web 加 remote,没有 local。
宿主禁止扩展拖慢启动、拖慢界面操作、直接改 UI。再配合按激活事件懒加载,避免每个扩展都占着 CPU 和内存。
extensionKind
清单里的 extensionKind 表示更想靠近工作区还是靠近界面:
| 值 | 含义 |
|---|---|
["workspace"] | 要访问工作区内容,跟工作区走。多数扩展是这种 |
["ui"] | 必须靠近界面,因为要用本机设备或很低的延迟。网页加 Codespaces 时没有 local 宿主,这种扩展加载不了,除非它同时是网页扩展 |
["ui", "workspace"] | 优先界面侧,但没有硬性本机依赖 |
["workspace", "ui"] | 优先工作区侧 |
1.40 以前可以写成单个字符串,现已废弃,应写数组。
Node 和浏览器都能跑时,优先选 Node 宿主。例外是网页版加 Codespaces,且 extensionKind 为 ui:那时优先 web 宿主,而不是 remote。纯网页扩展永远在 web 宿主,官方建议这时不要再写 extensionKind。
远程时各事发生在哪
工作区扩展读文件、起进程,发生在远程机器。界面扩展弹窗口、访问本机,发生在 local。Webview 画在用户眼前的界面侧。语言服务器通常跟着工作区,跑在远程,这样它读得到源码。不要在界面扩展里用 Node fs 去读远程工作区路径。