为什么网页视图在本地,语言服务器通常在远端?
结论
网页视图是界面,必须画在用户正在看的那台机器上。语言服务器要读源码、调用远端的编译器和依赖,所以跟工作区走,远程开发时在远端。
展开
远程窗口的屏幕、键盘、Webview、树视图渲染都在本地 UI。把一个 iframe 放到没有显示器的服务器上没有意义,所以 Webview 由本地渲染进程承载。扩展即使在远端激活,也只是通过编辑器把 HTML 和消息送到本地页面。
语言服务器的工作是看项目:读 node_modules、跑 tsc、调用语言自带的编译器。这些东西安装在远端工作区。如果把服务器起在本地:
- 本地没有那份依赖和工具链
- 要把整个远端仓库同步下来,延迟和正确性都差
- 路径、换行和文件监视都会和用户在远端终端里看到的不一致
因此客户端跟着工作区扩展宿主,在远端 fork 服务器。协议消息再由编辑器转给本地的补全界面。用户感觉补全是本地出现的,计算发生在远端。
这也解释了分进程:界面卡不卡取决于消息是否及时,不取决于服务器是不是和渲染进程在同一台机器。服务器算得久,取消令牌仍然要有。
容易讲错的点
- 「Webview 在本地」不等于「插件主入口在本地」。工作区插件的
activate在远端。 - 不要为了让网页直接读服务器内存而把语言服务器塞进网页。中间仍然是消息。
- 本地 UI 插件如果确实要起一个只服务本机的进程,那个进程不应该拿来分析远端仓库。