界面扩展宿主和工作区扩展宿主有什么差别?
结论
界面扩展宿主永远在用户本机,负责贴近 UI 的那一份代码。工作区扩展宿主跟工作区走,远程开发时跑在远端,能直接看到远端文件和工具链。extensionKind 决定插件进哪一个宿主。
展开
本地打开文件夹时,两个宿主都在本机,差别不明显。一旦用 SSH、容器或 WSL,窗口里就有:
- 本地的界面宿主:Webview 所在的渲染进程旁边,能碰本机密钥界面、系统对话框
- 远端的工作区宿主:和远端工作区文件、远端 Node、远端编译器在一起
extensionKind:
ui:只在界面宿主激活workspace:只在工作区宿主激活。这是大多数语言、任务、文件类插件的正确位置["ui", "workspace"]:远程时两边各激活一次,两份activate,两套globalState并不共享
怎么知道自己在哪:
vscode.env.remoteName:本地是undefined,远程是ssh-remote、wsl、dev-container等vscode.env.uiKind:桌面还是网页context.extension.extensionKind:这一份实例是UI还是Workspace
两边不能共享内存。要协作就走命令或专门的消息,不要把文件内容当成本地变量传给另一侧的对象。
只在某一侧有意义的逻辑要判断后再跑。例如起语言服务器只在工作区侧,弹一个必须用本机浏览器的登录可以在界面侧。两边都弹窗是这个模型下最常见的事故。
容易讲错的点
- 远程开发不是把整个 VS Code 搬到远端。界面仍在本地,工作区扩展宿主在远端。
ui插件用 Nodefs只能读本机,读不到远端工作区。- 写成两种 kind 却没有区分实例,远程窗口会把后台任务跑两遍。