跳到主要内容

扩展宿主与远程、网页

扩展宿主负责运行扩展。VS Code 会按安装方式同时存在多个宿主,运行时和地点都不一样。

三种宿主​

宿主运行时在哪
localNode.js和界面同一台机器。入口是 main
remoteNode.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 去读远程工作区路径。

参考​