Electron 进程之间的IPC通信思考

转自:主进程与渲染进程

Electron桌面程序中包含一个main主进程和N个renderer渲染进程

一、主进程和渲染进程

1、主进程Main

回顾以往的web开发,我们的代码,无论是HTML、CSS还是Javascript,都是运行在浏览器的沙盒中的,我们无法越过浏览器的权限访问系统本身的资源,代码的能力被限制在了浏览器中。浏览器之所以这么做,是为了安全的考虑。设想一下,我们在使用浏览器的时候,会打开各式各样不同来源的网站,如果JavaScript代码有能力访问并操作本地操作系统的资源,那将是多么可怕的事情。你在某天不小心打开了一个恶意的网站,可能你存储在硬盘上的文件就被偷走了(都用不着去修电脑)。

但我们要开发的是桌面应用程序,如果无法访问到本地的资源肯定是不行的。Electron将nodejs巧妙的融合了进来,让nodejs作为整个程序的管家。管家拥有较高的权限,可以访问和操作本地资源,使用原本在浏览器中不提供的高级API。同时管家也管理着渲染进程窗口的创建和销毁。所以,我们将这个管家称之为主进程。在使用Electron开发的程序中,会使用main.js作为程序的主入口,该文件内代码执行的内容,就是主进程中执行的内容。

2、渲染进程Renderer

Electron集成了Chromium来展示窗口界面,窗口中所看到的内容使用的都是HTML渲染出来的。 Chromium本身是多进程渲染页面的架构(在默认情况下,Chromium的默认策略是对每一个tab新开一个进程,以确保每个页面是独立且互不影响的。避免一个页面的崩溃导致全部页面无法使用),所以Electron在展示窗口时,也会使用到Chromium的多进程架构。而这种多进程渲染架构在Electron中,就被称之为渲染进程(render process)。

在Electron中,每创建一个新的窗口,都是一个独立的进程。

3、主进程于渲染进程的关系

主进程通过构造BrowserWindow实例来创建页面。每个BrowserWindow实例都在自己的渲染进程里运行页面。当一个BrowserWindow实例被销毁后,相应的渲染进程也会被终止。

主进程管理所有页面和与之对应的渲染进程。每个渲染进程都是相互隔离的,并且只知道运行在该进程里的页面。

在页面里调用本地GUI是不允许的,因为在Web页面里管理本地GUI资源是非常危险而且容易造成资源泄露。如果你想在网页里进行GUI操作,该页面的渲染进程必须与主进程进行通讯,请求主进程进行相关的 GUI 操作。

二、进程之间通信

主进程和渲染进程之间的通信方法:

1. 通过IPCRenderIPCMain, 主进程和渲染进程之间通过IPC 进行通信

2.通过remote模块在renderer进程里调用main主进程的模块:官方文档

三、渲染进程之间的通信

一般的项目中只需要渲染进程和主进程之间进行通信,工作中遇到渲染进程之间需要通信的问题。尝试了以下方法,假设渲染进程A和B需要通信:

1.从渲染进程A中引用渲染进程B中的代码,显然这是不行的,编译虽然没报错,但是运行起来抛出奇怪的异常。

2.渲染进程A和B之间共享一些变量,需要注意同步的问题,项目中由于一些原因不适合采用这种方法。

3.从渲染进程A中直接发IPC消息到渲染进程B,问题是渲染进程A如何获得渲染进程B的窗口或者进程消息?项目中渲染进程的窗口都是通过main创建的,方便管理,因为后面会使用到很多的渲染窗口。获取方法:

    a. 通过全局变量存储B的信息

    b.创建A或者B的时候主进程发送消息给A

    c...其他方法

然后IPC发送消息。这里介绍的不错:Electron 渲染进程之间通信

4.将main主进程作为中转站,A发送消息到main,然后main再把消息转发给B。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
禁止转载,如需转载请通过简信或评论联系作者。

推荐阅读更多精彩内容

友情链接更多精彩内容