Electron 主進(jìn)程和渲染進(jìn)程

本節(jié)我們來學(xué)習(xí)什么是主進(jìn)程和渲染進(jìn)程,主進(jìn)程與渲染進(jìn)程之間有什么區(qū)別,主進(jìn)程和渲染進(jìn)程之間的通信。下面我們先來看一下進(jìn)程的概念。

進(jìn)程(Process)是計(jì)算機(jī)中的程序關(guān)于某數(shù)據(jù)集合上的一次運(yùn)行活動(dòng),是系統(tǒng)進(jìn)行資源分配和調(diào)度的基本單位,是操作系統(tǒng)結(jié)構(gòu)的基礎(chǔ)。

什么是主進(jìn)程

Electron 中,啟動(dòng)項(xiàng)目時(shí)運(yùn)行的 main.js 腳本就是我們說的主進(jìn)程。在主進(jìn)程運(yùn)行的腳本可以以創(chuàng)建 web 頁面的形式展示 GUI

一個(gè) Electron 應(yīng)用有且只有一個(gè)主進(jìn)程。并且創(chuàng)建窗口等所有系統(tǒng)事件都要在主進(jìn)程中進(jìn)行。

什么是渲染進(jìn)程

由于 Electron 使用 Chromium 來展示頁面,所以 Chromium 的多進(jìn)程結(jié)構(gòu)也被充分利用。每個(gè) Electron 的頁面都在運(yùn)行著自己的進(jìn)程,這樣的進(jìn)程我們稱之為渲染進(jìn)程。

也就是說每創(chuàng)建一個(gè) web 頁面都會(huì)創(chuàng)建一個(gè)渲染進(jìn)程。每個(gè) web 頁面都運(yùn)行在它自己的渲染進(jìn)程中。每個(gè)渲染進(jìn)程是獨(dú)立的,它只關(guān)心它所運(yùn)行的頁面。

主進(jìn)程與渲染進(jìn)程的區(qū)別

主進(jìn)程使用 BrowserWindow 實(shí)例創(chuàng)建網(wǎng)頁。每個(gè) BrowserWindow 實(shí)例都在自己的渲染進(jìn)程中運(yùn)行。當(dāng)一個(gè) BrowserWindow 實(shí)例被銷毀后,相應(yīng)的渲染進(jìn)程也會(huì)被終止。

主進(jìn)程管理所有頁面和與之對(duì)應(yīng)的渲染進(jìn)程。每個(gè)渲染進(jìn)程都是相互獨(dú)立的,并且只關(guān)心他們自己的網(wǎng)頁。

使用Electron的API

Electron 在主進(jìn)程和渲染進(jìn)程中提供了大量 API 去幫助開發(fā)桌面應(yīng)用程序, 在主進(jìn)程和渲染進(jìn)程中,可以通過require() 方法將其包含在模塊中,以此獲取 ElectronAPI。

引入 electron

const electron = require('electron');

所有 ElectronAPI 都被指派給一種進(jìn)程類型。許多 API 只能被用于主進(jìn)程或渲染進(jìn)程中,但其中一些 API 可以同時(shí)在上述兩種進(jìn)程中使用。 每一個(gè) API 的文檔都將聲明我們可以在哪種進(jìn)程中使用該 API

Electron 中的窗口是使用 BrowserWindow 類型創(chuàng)建的一個(gè)實(shí)例, 它只能在主進(jìn)程中使用,如下所示:

const { BrowserWindow } = require('electron')
const win = new BrowserWindow()

主進(jìn)程和渲染進(jìn)程之間通信

Electron 的主進(jìn)程是在后臺(tái)運(yùn)行,對(duì)應(yīng) main.js 文件。而渲染進(jìn)程是前端看到的,對(duì)應(yīng) index.html 文件。這個(gè)兩個(gè)進(jìn)程之間的通信首選 ipc 方式,因?yàn)樗鼤?huì)在完成時(shí)返回,而不會(huì)阻止同一進(jìn)程中的其他操作。

異步通信

異步通信,在發(fā)送消息之后,不會(huì)阻止同一進(jìn)程中程序的繼續(xù)運(yùn)行。下列示例渲染進(jìn)程發(fā)送異步消息 ping 到主進(jìn)程,然后主進(jìn)程回答 pong。

示例:

渲染器進(jìn)程:

const ipc = require('electron').ipcRenderer

const asyncMsgBtn = document.getElementById('async-msg')

asyncMsgBtn.addEventListener('click', function () {
  ipc.send('asynchronous-message', 'ping')
})

ipc.on('asynchronous-reply', function (event, arg) {
  const message = `異步消息回復(fù): ${arg}`
  document.getElementById('async-reply').innerHTML = message
})

主進(jìn)程:

const ipc = require('electron').ipcMain

ipc.on('asynchronous-message', function (event, arg) {
  event.sender.send('asynchronous-reply', 'pong')
})

同步消息

除了以異步方式在進(jìn)程之間發(fā)送消息,我們還可以使用 ipc 模塊在進(jìn)程之間發(fā)送同步消息,但是此方法的同步特性意味著它在完成任務(wù)時(shí)會(huì)阻止其他操作。

示例:

渲染器進(jìn)程:

const ipc = require('electron').ipcRenderer

const syncMsgBtn = document.getElementById('sync-msg')

syncMsgBtn.addEventListener('click', function () {
  const reply = ipc.sendSync('synchronous-message', 'ping')
  const message = `同步消息回復(fù): ${reply}`
  document.getElementById('sync-reply').innerHTML = message
})

主進(jìn)程:

const ipc = require('electron').ipcMain

ipc.on('synchronous-message', function (event, arg) {
  event.returnValue = 'pong'
})

鏈接:https://www.9xkd.com/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容