什么是主進(jìn)程
- electron項(xiàng)目啟動(dòng)的時(shí)候運(yùn)行main.js的進(jìn)程就是主進(jìn)程
- 一個(gè)項(xiàng)目有且只有一個(gè)主進(jìn)程
- 創(chuàng)建窗口等所有系統(tǒng)事件都要在主進(jìn)程中進(jìn)行
簡(jiǎn)單的說(shuō)就是我們的electron項(xiàng)目的主進(jìn)程只有一個(gè), 主進(jìn)程的執(zhí)行代碼需要寫到main.js中, 所有跟系統(tǒng)事件相關(guān)的代碼統(tǒng)統(tǒng)都要寫在這里
什么是渲染進(jìn)程
- 我們每創(chuàng)建一個(gè)web頁(yè)面都會(huì)創(chuàng)建一個(gè)渲染進(jìn)程
- 每個(gè)web頁(yè)面運(yùn)行在它自己的渲染進(jìn)程中
- 每個(gè)渲染進(jìn)程是獨(dú)立的, 它只關(guān)心它所運(yùn)行的頁(yè)面
簡(jiǎn)單理解就是一個(gè)web頁(yè)面一個(gè)渲染進(jìn)程
主進(jìn)程和渲染進(jìn)程的區(qū)別
- 主進(jìn)程通過(guò)BrowserWindow創(chuàng)建頁(yè)面
- 每個(gè)BrowserWindow實(shí)例都在自己的渲染進(jìn)程中運(yùn)行, 當(dāng)BrowserWindow實(shí)例被銷毀后, 相應(yīng)的渲染進(jìn)程也會(huì)被終止
主進(jìn)程和渲染進(jìn)程怎么通信
我們?nèi)绾卧谝粋€(gè)頁(yè)面打開另外一個(gè)頁(yè)面誓酒?我們的思路應(yīng)該是這樣的
- 從我們第一個(gè)頁(yè)面發(fā)出一個(gè)指令世舰,也就是說(shuō)從渲染進(jìn)程中發(fā)出一個(gè)指令
- 發(fā)送指令到主進(jìn)程,因?yàn)橹挥兄鬟M(jìn)程才可以創(chuàng)建新的頁(yè)面
這個(gè)時(shí)候我們就需要解決主進(jìn)程和渲染進(jìn)程之間通信的問題坎炼,怎么通信呢菠净?
官方為我們提供類多種實(shí)現(xiàn)方式禁舷,我們常用的是使用ipcRenderer
和ipcMain
模塊發(fā)送消息來(lái)解決通信問題
ipcRenderer和ipcMain怎么發(fā)送消息?看下面示例代碼
- 主進(jìn)程代碼
const { ipcMain } = require('electron')
// 監(jiān)聽渲染進(jìn)行發(fā)送的消息
ipcMain.on('renderer-msg', (event, arg) => {
console.log(arg) // prints "幫我創(chuàng)建一個(gè)新的頁(yè)面",
// 執(zhí)行創(chuàng)建頁(yè)面的操作
event.reply('main-msg', '好的'); // 給渲染進(jìn)程回復(fù)消息
})
- 渲染進(jìn)程代碼
const { ipcRenderer } = require('electron')毅往;
ipcRenderer.on('main-msg', (event, arg) => {
console.log(arg) // prints "好的"
})
ipcRenderer.send('renderer-msg', '幫我創(chuàng)建一個(gè)新的頁(yè)面')