远程场景下读文件、起进程、弹网页分别发生在哪?
结论
工作区侧插件读文件、起进程,发生在远端。网页视图的界面永远画在本地渲染进程里。界面侧插件如果去读工作区路径,读到的是用户自己的电脑,不是远端仓库。
展开
以 SSH 远程为例,插件声明为 workspace:
workspace.fs和当前文档都在远端工作区语义下,读到的是远端文件child_process起的语言服务器、npm、编译器跑在远端storageUri在远端的插件存储位置- Webview 的 HTML 由远端扩展宿主准备,真正的页面在本地编辑器里显示。
postMessage会跨这层边界送回来
插件如果声明为 ui:
- 代码跑在本地
child_process起在用户电脑上- 要用
workspace.fs才能透过虚拟文件系统碰远端文件 - 用
uri.fsPath加 Nodefs会把远端路径误当成本地路径
弹窗 showInformationMessage 总是出现在用户眼前的那块界面上。无论哪一侧调用,用户都能看见。所以远程时不要两侧同时弹。
终端也有位置。工作区侧创建的终端默认在远端 shell,这通常才是用户想编译项目的地方。
容易讲错的点
- Webview 在本地,不代表它可以随便读本地磁盘。资源仍要
asWebviewUri,策略照旧。 - 远端没有图形界面。语言服务器如果偷偷打开原生窗口,在 SSH 上会失败。
- 调试器适配进程也应该在有二进制和符号的那一侧,一般是远端。