vscode是一个多进程架构的软件,进程间由于都是独立的,所以提供一个完整的功能时就需要进程之间的通信。
举个例子,我们安装一个插件时,处理UI交互的部分发生在Renderer Process中(比如安装按钮点击,以及检查适合的插件版本),但是实际的安装过程,是在Shared Process中处理的(比如下载插件包,以及解压插件),这里就涉及到Renderer Process怎么通知到Shared Process的问题了。
这里先提一下,vscode通信的一个特点,就是客户端-服务器模式,在上面的例子中,Renderer Process(渲染进程)就是客户端,它会发送请求;而Shared Process(共享进程)就是服务端,他会接收并响应。我们这里就直接看渲染进程和共享进程两边发送与接收的源码吧,我们先简化代码进行理解,然后再由浅入深把全局说明了
我们可以发现,客户端这边用于发送请求的是IChannel,而服务端接收数据的是IChannelServer,channel就是进程间通信的核心概念之一,他帮我们实现了进程间功能的对应
代码文件路径是 src\vs\platform\extensionManagement\common\extensionManagementIpc.ts
// 渲染进程发送
export class ExtensionManagementChannelClient extends Disposable implements IExtensionManagementService {
// 重点在构造方法中的channel,我们可以看到发送安装请求时候是调用this.channel.call
constructor(private readonly channel: IChannel) {
}
install(vsix: URI, options?: InstallVSIXOptions): Promise<ILocalExtension> {
return Promise.resolve(this.channel.call<ILocalExtension>('install', [vsix, options])).then(local => transformIncomingExtension(local, null));
}
}
// 共享进程接收
// 重点在它实现了IServerChannel这个接口
export class ExtensionManagementChannel implements IServerChannel {
<