这里先插个题外话,什么是进程,为何要分主进程子进程?首先进程是资源分配的单位,是运行的程序,一个进程天然只能表明一个程序,多道程序天然而然就产生了多进程的概念。进程中经过CreateProcess()函数去建立一个子进程,子进程在所有处理过程当中只对父进程地址空间中的相关数据进行访问,从而能够保护父进程地址空间中与当前子进程执行任务无关的所有数据。对于这种状况,子进程所体现出来的做用同函数和线程比较类似,能够当作是父进程在运行期间的一个过程为此,须要由父进程来掌握子进程的启动、执行和退出。建立子进程才能多道程序并发执行。同一个进程之间的资源是共享的,子进程可使用主进程共享的数据。javascript
在electron中分主进程(ipcMain)与渲染进程(ipcRenderer),渲染进程主要负责渲染页面,html
一、从主进程到渲染进程的异步通讯。java
// 在主进程中 const {ipcMain} = require('electron') ipcMain.on('asynchronous-message', (event, arg) => { //主进程接收渲染进程的请求事件 console.log(arg) // prints "ping" //获取参数 ..... //处理事件的过程 event.sender.send('asynchronous-reply', 'pong') //将事件处理结果在以另外一个响应返给渲染进程 }) //在渲染器进程 (网页) 中 const {ipcRenderer} = require('electron') ipcRenderer.on('asynchronous-reply', (event, arg) => { //渲染进程接收主进程响应回来的处理结果 console.log(arg) // prints "pong" }) ipcRenderer.send('asynchronous-message', 'ping')//向主进程请求事件,携带参数
该种通信必须渲染进程先请求主进程,不然主进程没法主动响应渲染竟成数据;node
二、页面嵌入webview,页面与webview里面的页面之间的通讯git
使用 webview
标签在Electron 应用中嵌入 "外来" 内容 (如 网页)。外来"内容包含在 webview
容器中显示,src所传入的地址能够是本程序内的也能够本程序的外的。github
与 iframe
不一样, webview
在与应用程序不一样的进程中运行。它与您的网页没有相同的权限, 应用程序和嵌入内容之间的全部交互都将是异步的。web
这将保证你的应用对于嵌入的内容的安全性。api
<webview id="foo" src="https://www.github.com/" nodeintegration style="display:inline-flex; width:640px; height:480px"></webview>
当有nodeintegration此属性时, webview
中的访客页(guest page)将具备Node集成, 而且可使用像 require
和 process
这样的node APIs 去访问低层系统资源const webview = document.querySelector('webview')安全
webview.addEventListener('dom-ready', () => { webview.openDevTools()//webview加载完成,能够处理一些事件了 webview.send('ping') //向webview嵌套的页面响应事件 }) webview.addEventListener('ipc-message', (event) => { console.log(event.channel) // Prints "pong" 在此监听事件中接收webview嵌套页面所响应的事件 }) //嵌套页面 const {ipcRenderer} = require('electron') ipcRenderer.on('ping', (e) => { //接收响应 console.log(e) }) ipcRenderer.sendToHost('pong')//向webview所在页面的进程传达消息
这样二者之间就能够在本项目中之间相互嵌套资源了,webview也能够释放所嵌套页面占用的资源。并发