跳到主要内容

界面扩展宿主和工作区扩展宿主有什么差别?

结论​

界面扩展宿主永远在用户本机,负责贴近 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 插件用 Node fs 只能读本机,读不到远端工作区。
  • 写成两种 kind 却没有区分实例,远程窗口会把后台任务跑两遍。