对 Electron 中的主进程和渲染进程有个初步的认知,在后续的学习中,Electron 的主进程和渲染进程将会是学习的重点内容。“Electron 的主进程”、“Electron 的渲染进程”这两组字眼,在接下来的学习中,会不断地被提及。本视频中提及的内容,仅仅是做一个初步的简单介绍罢了。
目标:
- 知道如何判断 Electron 应用的主进程
- 理解 Electron 的渲染进程(Web 页面)和我们传统的在浏览器端开发的 Web 页面有何区别
- 对 Electron 的主进程和渲染进程有个初步的认知
Electron 中的进程
在 Electron 中,进程模型主要包含两类进程:
- 主进程
- 渲染进程
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、remote、ipcRenderer、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