Electron Affinity是一个开源库,它使用Electron IPC与调用本地函数一样无缝。该库利用TypeScript和JavaScript的神奇特性,从远程定义函数的类型签名动态构造可调用的客户端函数。本文将解释这些神奇的特性,并试图展示TypeScript的一些强大功能。
什么是进程间通信(IPC)?
作为web开发人员,我们熟悉使用HTTP get或post在浏览器和web服务器之间交换信息。一个进程运行在浏览器上,另一个运行在服务器上,当它们共享数据时——voilà!-我们有进程间通信。在这种情况下,这两个进程通常驻留在不同的计算机上,但它们也可以位于同一台计算机上。
基础知识
在Electron中,两个进程都在同一台计算机上。Electron是一个框架,它允许我们将浏览器和网站捆绑到一个由单一可执行文件组成的桌面应用程序中。通过使用Chrome浏览器作为前端,Node.js作为后端,Electron将web开发转变为跨平台的桌面应用开发
但是Electron在浏览器和Node.js之间不使用HTTP,这可能是因为HTTP对于驻留在同一台计算机上的进程之间的IPC来说是一个效率低下的解决方案。相反,Electron提供了一种通过命名IPC通道侦听和发送消息的机制
Electron IPC的改进
为在Electron中使用IPC提供简单的RPC机制。Electron允许浏览器将IPC消息发送给Node.js,而Node.js将IPC消息发送给浏览器,因此任何一方都可以是调用方或被调用方。在RPC术语中,调用方是“客户端”,被调用方是“服务器”,不管哪一方进行调用。
每个浏览器窗口都运行自己的进程,所以我们称它们为“窗口进程”,Electron称Node.js进程为“主进程”,所以这也是我们要做的
远程过程调用(RPC)
在标准RPC体系结构下,开发人员创建可远程调用的函数,包括它们的类型签名,然后运行一个特殊的程序来从类型签名生成存根。这些存根被链接到客户机和服务器程序中,以便远程访问这些函数。
一个存根是客户机存根,另一个是服务器存根。它们使远程函数调用分别在客户机和服务器上显示为本地调用。
客户端存根是远程函数的代理。它将函数的参数打包,以便通过低级IPC层传输到服务器进程。服务器存根是调用者的代理。它解包从IPC层接收到的数据,并将参数传递给预期的远程函数。这些函数的返回值遵循相反的过程,从服务器存根到IPC层再到客户机存根,最后返回调用对象。
远程绑定协议
除了使用导入类型来获取类型信息之外,摆脱进退两难的方法是实现远程绑定协议。在远程绑定协议中,客户机使用基本IPC从服务器获取关于远程可调用对象的信息。它从接收到的信息构建客户端存根,从而将每个客户端存根“绑定”到其远程对象。该解决方案使用导入类型信息来对客户机进程随后对这些绑定的客户机存根进行类型检查函数调用。
Electron Affinity为窗口到主进程的调用实现了一个远程绑定协议,并为主进程到窗口进程的调用实现了一个略有不同的绑定协议。该库将每个远程可调用对象称为“API”,即“应用程序接口”。每个API实际上是一个实现API的类的实例,类的名称就是API的名称。API的方法是可远程调用的函数。在进行远程调用时,客户端同时指示一个API和一个方法。
定义远程API
如果远程可调用方法的签名在客户机和服务器上是相同的,那么它就不能只是任何函数。虽然方法可以快速运行并在服务器上返回,但客户机必须等待参数到达服务器,然后等待返回值返回到客户机。幸运的是,如果我们要求远程方法返回承诺,相同的签名允许方法在服务器上是同步的,在客户机上是异步的。
类型PublicProperty包含以下形式的两个表达式,一个嵌套在另一个中:
A extends B ? C : D
这是三元运算符的类型模拟。