学习 Electron - 流程模型
Electron 流程模型
浏览器的职责极其复杂,除显示页面内容这个主要职责外,还有其他比如管理标签页和加载第三方扩展等职责。
早期,浏览器用单进程处理这些功能,虽然标签页打开时的消耗较少,但是在一个网站发生问题时会影响到整个浏览器。
因此,Chrome 让每个标签页在自己的进程中渲染,从而限制单个页面发生的问题导致的可能对整体的损害。然后用单个浏览器进程控制这些标签页进程,以及整个应用的生命周期。
Electron 的结构类似如此,有两种类型进程:主进程和渲染器进程。对应以上提到的浏览器和渲染器进程。
主进程
每个 Electron 应用都有的一个单一的主进程,作为应用入口。在 Node 中运行,因此具有 require 模块和 Node API 功能。
主进程主要作用是使用 BrowserWindow 模块创建和管理窗口。
该模块的每个实例创建一个应用窗口,并在单独渲染器进程中加载页面。
可从主进程用 window 的 webContent 对象与网页内容进行交互。
const { BrowserWindow } = require('electron')
const win = new BrowserWindow({ width: 800, height: 1500 })
win.loadURL('https://github.com')
const contents = win.webContents
console.log(contents)
渲染器进程是为 web embeds 创建的,如 BrowserView 模块。嵌入式网页可访问 webContents 对象。
因为 BrowserWindow 模块是一个 EventEmitter, 因此可以为各种事件进行处理。
当 BrowserWindow 实例被销毁时,相关渲染器进程也会被终止。
可以通过在 Electron 的 app 模块控制程序生命周期。
// main.js
const { app } = require('electron')
// 所有窗口关闭时
app.on('window-all-closed', () => {
// 如果不是 macOS 系统 则退出应用
if (process.platform !== 'darwin') app.quit()
})
渲染进程
Electron 会为每个打开的 BrowserWindow (及每个页面的嵌入)生成一个单独的渲染器进程用于负责渲染页面内容。
运行在渲染器进程的代码需要遵守网页标准,即,需要与在页面开发时使用相同的工具和规范。
因此,渲染器无权访问 require 及 其他 Node API。若需要使用 npm 模块,需要使用相关的打包工具,如 webpack 等。