我原本以为Electron中的渲染器进程是在类似chrome的环境中进行沙盒化,这意味着你所能做的只是弄乱DOM。但是,我最近了解到您可以访问文件系统,运行子进程并获取其输出,并导入所需的任何其他节点模块。
如果是这种情况,主进程和渲染器进程之间的区别究竟是什么?这不是一个艰难的分离?主进程中有哪些代码以及渲染器进程中的代码类型?
如果有人对Electron app架构进行了深入的阅读/演示,我也很乐意看到它;可能有助于消除一些混乱
答案 0 :(得分:35)
主/渲染器过程的区别实际上并不是电子概念本身 - 它继承自Chromium(这里是Chromium架构中的article和它背后的原因)。这是Chrome出于性能和稳定性原因而使用的架构。每个webContents实例都在其自己的进程(一个"渲染器"进程)中运行。主进程(只能有其中一个)管理webContents实例等。
对于两者之间的差异,有一个good discussion here。
某些API仅在一个进程或另一个进程中可用,这可以帮助您了解逻辑在哪里。例如,通知(使用HTML5界面但实现为本机通知)只能从渲染器进程创建。 Menu class只能在主进程中调用。仔细阅读电子模块' API文档,看看会发生什么。您可以使用IPC,remote模块或electron-remote来协调两个进程(您使用的进程取决于您的用例)。
我会说这是一个很难的"分离。他们是所有单独的流程,因此不会共享任何资源或状态。对于我认为的大多数JS开发者来说,这是一种范式转变(至少对我而言)。例如,如果我有一个有状态的模块,我在主进程中设置了一些状态,然后我在渲染器中需要该模块,那个状态就不会存在。他们是该模块的两个完全不同的实例。像这样的共享状态在主进程中可能是最好的,然后使用上述方法之一在渲染器进程之间共享该状态。
以下是real life apps和some sample apps.
的列表Shawn Rakowski说得很好(在下面的评论中):"在主流程和应用程序中放置代码处理平台基础架构代码(即创建窗口,注册全局快捷方式等)可能是一个很好的规则特定代码(您的应用实际上在做什么)在渲染器进程中。"
[我的应用程序的功能是它]解析一些文件,然后将信息呈现到屏幕
您可以在Electron中采用许多方法,因为在渲染器过程中可以使用fs
模块(以及所有node.js模块)。
如果您只处理一个浏览器窗口实例而不进行CPU密集型解析,我会说在该呈现器流程实例中运行所有fs
相关代码。这是最简单的方法。
如果你正在对这些文件进行CPU密集型工作,那么你不想锁定用户界面,这意味着你无法处理浏览器窗口渲染器,你可以&#39 ; t在main中执行(这将锁定所有渲染器!)。所以我会研究electron-remote之类的东西,或创建一个运行繁重的不可见的浏览器窗口实例。
本文关于main and renderer processes更深入地讨论这些主题(披露:我写过)。