首页 文章

电子渲染器和主要过程之间的区别

提问于
浏览
27

我原本以为Electron中的渲染器进程是在类似chrome的环境中进行沙盒化,这意味着你所能做的就是搞乱DOM了 . 但是,我最近了解到您可以访问文件系统,运行子进程并获取其输出,并导入所需的任何其他节点模块 .

如果是这种情况,主进程和渲染器进程之间的区别到底是什么?这不是一个艰难的分离?主进程中有哪些代码以及渲染器进程中的代码类型?

如果有人对Electron app架构进行了深入的阅读/演示,我也很乐意看到它;可能有助于消除一些混乱

1 回答

  • 34

    主要/渲染器进程的区别是从Chromium继承的(这里是Chromium 's architecture and the reasoning behind it). This is the architecture that Chrome uses for performance and stability reasons. Each webContents instance runs in it'自己进程的一个article(一个"renderer"进程) . 主进程(只能有其中一个)管理webContents实例等等 .

    关于两者之间的差异,有一个good discussion here .

    有些API只能在一个进程或另一个进程中使用,这可以帮助您了解逻辑在哪里 . 例如,通知(使用HTML5界面但实现为本机通知)只能从渲染器进程创建 . Menu class只能在主进程中调用 . 阅读Electron模块的API文档,了解其中的内容 . 您可以使用IPCremote module或electron-remote来协调两个进程(您使用的进程取决于您的用例) .

    我会说这是一个“硬”分离 . 它们都是独立的过程,因此不共享任何资源或状态 . 对于我认为的大多数JS开发者来说,这是一种范式转变(至少对我而言) . 例如,如果我有一个有状态模块,我在主进程中设置了一些状态,然后我在渲染器中需要该模块,那个状态将不存在 . 它们是该模块的两个完全不同的实例 . 这样的共享状态在主进程中可能是最好的,然后使用上述方法之一在渲染器进程之间共享该状态 .

    这是real life appssome sample apps.的列表

    Shawn Rakowski说得很好(在下面的评论中):“在主流程和特定于应用程序的代码中放置代码处理平台基础架构代码(即创建窗口,注册全局快捷方式等)可能是一个很好的规则(你的应用程序是什么)实际上是在渲染过程中 . “

    [我的应用程序的功能是它]解析一些文件,然后将信息呈现到屏幕上

    您可以在Electron中使用许多方法,因为在渲染器过程中可以使用 fs 模块(以及所有node.js模块) .

    如果您只处理一个浏览器窗口实例而不进行CPU密集型解析,我会说在该渲染器流程实例中运行所有 fs 相关代码 . 这是最简单的方法 .

    如果您想要锁定UI,这意味着您可以在主处执行此操作(这将锁定您的所有渲染器!) . 所以我会调查像electron-remote之类的东西,或创建一个运行繁重的隐形浏览器窗口实例 .

    这篇关于main and renderer processes的文章更深入地讨论了这些话题(披露:我写的那篇) .

相关问题