本节我们来学习什么是主进程和渲染进程,主进程与渲染进程之间有什么区别,主进程和渲染进程之间的通信。下面我们先来看一下进程的概念。
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。
什么是主进程
在 Electron
中,启动项目时运行的 main.js
脚本就是我们说的主进程。在主进程运行的脚本可以以创建 web
页面的形式展示 GUI
。
一个 Electron
应用有且只有一个主进程。并且创建窗口等所有系统事件都要在主进程中进行。
什么是渲染进程
由于 Electron
使用 Chromium
来展示页面,所以 Chromium
的多进程结构也被充分利用。每个 Electron
的页面都在运行着自己的进程,这样的进程我们称之为渲染进程。
也就是说每创建一个 web
页面都会创建一个渲染进程。每个 web
页面都运行在它自己的渲染进程中。每个渲染进程是独立的,它只关心它所运行的页面。
主进程与渲染进程的区别
主进程使用 BrowserWindow
实例创建网页。每个 BrowserWindow
实例都在自己的渲染进程中运行。当一个 BrowserWindow
实例被销毁后,相应的渲染进程也会被终止。
主进程管理所有页面和与之对应的渲染进程。每个渲染进程都是相互独立的,并且只关心他们自己的网页。
使用Electron的API
Electron
在主进程和渲染进程中提供了大量 API
去帮助开发桌面应用程序, 在主进程和渲染进程中,可以通过require()
方法将其包含在模块中,以此获取 Electron
的 API
。
引入 electron
:
const electron = require('electron');
所有 Electron
的 API
都被指派给一种进程类型。许多 API
只能被用于主进程或渲染进程中,但其中一些 API
可以同时在上述两种进程中使用。 每一个 API
的文档都将声明我们可以在哪种进程中使用该 API
。
Electron
中的窗口是使用 BrowserWindow
类型创建的一个实例, 它只能在主进程中使用,如下所示:
const { BrowserWindow } = require('electron')
const win = new BrowserWindow()
主进程和渲染进程之间通信
Electron
的主进程是在后台运行,对应 main.js
文件。而渲染进程是前端看到的,对应 index.html
文件。这个两个进程之间的通信首选 ipc
方式,因为它会在完成时返回,而不会阻止同一进程中的其他操作。
异步通信
异步通信,在发送消息之后,不会阻止同一进程中程序的继续运行。下列示例渲染进程发送异步消息 ping
到主进程,然后主进程回答 pong
。
示例:
渲染器进程:
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 = `异步消息回复: ${arg}`
document.getElementById('async-reply').innerHTML = message
})
主进程:
const ipc = require('electron').ipcMain
ipc.on('asynchronous-message', function (event, arg) {
event.sender.send('asynchronous-reply', 'pong')
})
同步消息
除了以异步方式在进程之间发送消息,我们还可以使用 ipc
模块在进程之间发送同步消息,但是此方法的同步特性意味着它在完成任务时会阻止其他操作。
示例:
渲染器进程:
const ipc = require('electron').ipcRenderer
const syncMsgBtn = document.getElementById('sync-msg')
syncMsgBtn.addEventListener('click', function () {
const reply = ipc.sendSync('synchronous-message', 'ping')
const message = `同步消息回复: ${reply}`
document.getElementById('sync-reply').innerHTML = message
})
主进程:
const ipc = require('electron').ipcMain
ipc.on('synchronous-message', function (event, arg) {
event.returnValue = 'pong'
})
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。