学习 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 等。


学习 Electron - 流程模型
http://localhost:8080/archives/5be2e442-cda9-4b35-bcf2-f38a6c121d8b
作者
inksha
发布于
2024年09月14日
许可协议