跳到主要内容

远程场景下读文件、起进程、弹网页分别发生在哪?

结论​

工作区侧插件读文件、起进程,发生在远端。网页视图的界面永远画在本地渲染进程里。界面侧插件如果去读工作区路径,读到的是用户自己的电脑,不是远端仓库。

展开​

以 SSH 远程为例,插件声明为 workspace:

  • workspace.fs 和当前文档都在远端工作区语义下,读到的是远端文件
  • child_process 起的语言服务器、npm、编译器跑在远端
  • storageUri 在远端的插件存储位置
  • Webview 的 HTML 由远端扩展宿主准备,真正的页面在本地编辑器里显示。postMessage 会跨这层边界送回来

插件如果声明为 ui:

  • 代码跑在本地
  • child_process 起在用户电脑上
  • 要用 workspace.fs 才能透过虚拟文件系统碰远端文件
  • 用 uri.fsPath 加 Node fs 会把远端路径误当成本地路径

弹窗 showInformationMessage 总是出现在用户眼前的那块界面上。无论哪一侧调用,用户都能看见。所以远程时不要两侧同时弹。

终端也有位置。工作区侧创建的终端默认在远端 shell,这通常才是用户想编译项目的地方。

容易讲错的点​

  • Webview 在本地,不代表它可以随便读本地磁盘。资源仍要 asWebviewUri,策略照旧。
  • 远端没有图形界面。语言服务器如果偷偷打开原生窗口,在 SSH 上会失败。
  • 调试器适配进程也应该在有二进制和符号的那一侧,一般是远端。