Electron中渲染器和主进程的区别
Distinction between the renderer and main processes in Electron
我最初认为 Electron 中的渲染器进程被沙箱化在类似 chrome 的环境中,这意味着您所能做的就是弄乱 DOM。但是,我最近了解到您可以访问文件系统、运行 子进程并获取它们的输出,并导入您想要的任何其他节点模块。
如果是这样,那么主进程和渲染进程的区别到底是什么?这不是一个艰难的分离吗?什么样的代码进入主进程,什么样的代码进入渲染进程?
如果有人对 Electron 应用架构有很好的深入 reading/presentation,我也很想看看;可能有助于消除一些困惑
main/renderer 进程区别实际上并不是一个 Electron 概念本身——它是从 Chromium 继承的(这里是 article 关于 Chromium 的架构及其背后的原因)。这是 Chrome 出于性能和稳定性原因使用的体系结构。每个 webContents 实例 运行s 在它自己的进程中(一个 "renderer" 进程)。主进程(只能有其中之一)管理 webContents 实例等。
两者之间存在 good discussion here 差异。
一些 API 仅在一个进程或另一个进程中可用,这可以帮助您了解什么逻辑在哪里。例如,通知(使用 HTML5 接口但作为本机通知实现)只能从渲染器进程创建。 Menu class can only be called from within the main process. Read through the Electron modules' API docs and see what goes where. You can use IPC, remote module, or electron-remote 用于协调两个进程(您使用哪个取决于您的用例)。
我会说这是一个 "hard" 分离。它们都是独立的进程,因此不共享任何资源或状态。我认为这是大多数 JS 开发人员的范式转变(至少对我而言)。例如,如果我有一个有状态模块,我在主进程中设置了一些状态,然后我在渲染器中需要该模块,那么该状态将不存在。它们是该模块的两个完全不同的实例。在主进程中共享状态可能是最好的,然后使用上述方法之一在渲染器进程之间共享该状态。
这是real life apps and some sample apps.
的列表
Shawn Rakowski 说得好(在下面的评论中):"It may be a good rule to put code dealing with the platform infrastructure code (i.e. creating windows, registering global shortcuts, etc) in the Main process and application specific code (what your app is actually doing) in the Renderer processes."
[My app's functionality is it] parses some files and then renders the info to the screen
在 Electron 中,您可以采用多种方法来实现这一点,因为 fs
模块(以及所有 node.js 模块)在渲染器进程中可供您使用。
如果您只处理一个浏览器 window 实例而不进行 CPU 密集解析,我会说 运行 所有 fs
相关代码渲染器进程实例。这是最简单的方法。
如果您正在 CPU 对这些文件进行大量工作,您不想锁定 UI,这意味着您无法处理浏览器 window 渲染器,你不能在 main 中这样做(这会锁定你所有的渲染器!)。所以我会研究 electron-remote 之类的东西,或者创建一个不可见的浏览器 window 实例,运行 是繁重的工作。
这篇关于 main and renderer processes 的文章更深入地讨论了这些主题(披露:我写的)。
我最初认为 Electron 中的渲染器进程被沙箱化在类似 chrome 的环境中,这意味着您所能做的就是弄乱 DOM。但是,我最近了解到您可以访问文件系统、运行 子进程并获取它们的输出,并导入您想要的任何其他节点模块。
如果是这样,那么主进程和渲染进程的区别到底是什么?这不是一个艰难的分离吗?什么样的代码进入主进程,什么样的代码进入渲染进程?
如果有人对 Electron 应用架构有很好的深入 reading/presentation,我也很想看看;可能有助于消除一些困惑
main/renderer 进程区别实际上并不是一个 Electron 概念本身——它是从 Chromium 继承的(这里是 article 关于 Chromium 的架构及其背后的原因)。这是 Chrome 出于性能和稳定性原因使用的体系结构。每个 webContents 实例 运行s 在它自己的进程中(一个 "renderer" 进程)。主进程(只能有其中之一)管理 webContents 实例等。
两者之间存在 good discussion here 差异。
一些 API 仅在一个进程或另一个进程中可用,这可以帮助您了解什么逻辑在哪里。例如,通知(使用 HTML5 接口但作为本机通知实现)只能从渲染器进程创建。 Menu class can only be called from within the main process. Read through the Electron modules' API docs and see what goes where. You can use IPC, remote module, or electron-remote 用于协调两个进程(您使用哪个取决于您的用例)。
我会说这是一个 "hard" 分离。它们都是独立的进程,因此不共享任何资源或状态。我认为这是大多数 JS 开发人员的范式转变(至少对我而言)。例如,如果我有一个有状态模块,我在主进程中设置了一些状态,然后我在渲染器中需要该模块,那么该状态将不存在。它们是该模块的两个完全不同的实例。在主进程中共享状态可能是最好的,然后使用上述方法之一在渲染器进程之间共享该状态。
这是real life apps and some sample apps.
的列表Shawn Rakowski 说得好(在下面的评论中):"It may be a good rule to put code dealing with the platform infrastructure code (i.e. creating windows, registering global shortcuts, etc) in the Main process and application specific code (what your app is actually doing) in the Renderer processes."
[My app's functionality is it] parses some files and then renders the info to the screen
在 Electron 中,您可以采用多种方法来实现这一点,因为 fs
模块(以及所有 node.js 模块)在渲染器进程中可供您使用。
如果您只处理一个浏览器 window 实例而不进行 CPU 密集解析,我会说 运行 所有 fs
相关代码渲染器进程实例。这是最简单的方法。
如果您正在 CPU 对这些文件进行大量工作,您不想锁定 UI,这意味着您无法处理浏览器 window 渲染器,你不能在 main 中这样做(这会锁定你所有的渲染器!)。所以我会研究 electron-remote 之类的东西,或者创建一个不可见的浏览器 window 实例,运行 是繁重的工作。
这篇关于 main and renderer processes 的文章更深入地讨论了这些主题(披露:我写的)。