对 Electron 中的主进程和渲染进程有个初步的认知,在后续的学习中,Electron 的主进程和渲染进程将会是学习的重点内容。“Electron 的主进程”、“Electron 的渲染进程”这两组字眼,在接下来的学习中,会不断地被提及。本视频中提及的内容,仅仅是做一个初步的简单介绍罢了。

目标:

  • 知道如何判断 Electron 应用的主进程
  • 理解 Electron 的渲染进程(Web 页面)和我们传统的在浏览器端开发的 Web 页面有何区别
  • 对 Electron 的主进程和渲染进程有个初步的认知

Electron 中的进程

在 Electron 中,进程模型主要包含两类进程:

  1. 主进程
  2. 渲染进程

Electron 架构图(From 极客时间)

Electron 官网:https://www.electronjs.org/

主进程

Electron 的主进程是负责创建 GUI 窗口,管理应用程序事件和处理系统操作的进程,它可以调用 Electron 提供的 大部分 原生 API。

渲染进程

Electron 的渲染进程是运行在 BrowserWindow 实例中,负责渲染加载的 web 页面的进程,它只能使用 一小部分 Electron API,对于需要系统权限的操作,需通过 IPC 与主进程进行通信。

  • 每个 BrowserWindow 实例对应一个渲染进程,当 BrowserWindow 实例被销毁后,渲染进程也跟着终结
  • 这些渲染进程独立运行,互不影响

主进程 VS 渲染进程

数量

  • 主进程:一个 Electron 应用只有 一个 主进程
  • 渲染进程:一个 Electron 应用可以有 多个 渲染进程(一个应用可以有多个页面)

作用

主进程

  • 负责管理所有的窗口及其对应的渲染进程
  • 控制应用生命周期(app)
  • 管理原生 GUI,典型的窗口(BrowserWindow、Tray、Dock、Menu)

渲染进程

  • 负责渲染在 BrowserWindow 中加载(展示)的 Web 页面
  • 通过 Node.js、Electron 提供的 API 可以跟系统底层打交道

可用模块

注意:以下的分类并不是绝对的,某些模块可能在主进程和渲染进程中的功能并不完全相同,或者在不同的环境或版本中能够访问的 API 可能有所不同。在实际使用时,我们应该参考 Electron 的官方文档以获取最准确的信息。

主进程

app、autoUpdater、BrowserView、BrowserWindow、clipboard、contentTracing、crashReporter、desktopCapturer、dialog、globalShortcut、inAppPurchase、ipcMain、Menu、MessageChannelMain、MessagePortMain、nativeImage、nativeTheme、net、netLog、Notification、parentPort、powerMonitor、powerSaveBlocker、process、protocol、pushNotifications、safeStorage、screen、session、ShareMenu、shell、systemPreferences、TouchBar、Tray、utilityProcess、webContents、webFrameMain

这些模块通常用于实现 Electron 应用的核心功能,如:

  • 进行进程间通信(ipcMain)
  • 创建窗口(BrowserWindow、BrowserView)
  • 管理应用程序生命周期(app)
  • 实现网络功能(net、netLog)
  • 管理可交互的通知(Notification)
  • 获取屏幕信息(screen)
  • 实现系统偏好设置功能(systemPreferences)
  • 原生 GUI(Menu、Tray、MenulItem)
  • 加载我们具体的页面(webContents)
  • 用来实现更新的模块(autoUpdater)
  • 用来设置全局的一个快捷键(globalShortcut)
  • ……

这些模块通常需要更多的系统权限,因此只能在主进程中使用。

渲染进程

clipboard、contextBridge、crashReporter、remoteipcRenderer、nativeImage、webFrame

这些模块主要用于在渲染进程中实现特定功能,如:

  • 进行进程间通信(ipcRenderer)
  • 远程调用主进程中的方法(remote)
  • 修改网页的布局和样式(webFrame)
  • ……

这些模块主要用于处理和渲染 Web 内容,因此只能在渲染进程中使用。

公用的模块

clipboard、crashReporter、nativeImage

这些模块可以在主进程和渲染进程中使用,主要提供一些基础和公用的功能,如:

  • 模块访问剪贴板(clipboard)
  • 报告崩溃信息(crashReporter)
  • 创建原生图像(nativeImage)
  • ……

因为这些功能在主进程和渲染进程中都可能需要,所以这些模块被设计为可以在两种进程中使用。

问:如何判断哪个文件是入口文件,哪个文件是主进程?

主进程就是 package.json 中的 main 字段标识的文件,它是整个程序的入口,也是 Electron 的主进程。

问:Electron 中的渲染进程也是网页,那么它和我们在浏览器中开发的网页有何区别?

相较而言,Electron 中的页面,能做事儿更多

  • 浏览器中的网页:浏览器中的 Web 页面是运行在 沙盒环境 中的,没法无法访问操作系统的原生资源
  • Electron 中的网页:Electron 可以让我们使用 Node.js 的 API,享用 Node.js 的丰富生态库,并且可以访问系统的 Native API,调用系统的原生 GUI