转自:主进程与渲染进程
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. 通过IPCRender和IPCMain, 主进程和渲染进程之间通过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。
网友评论