我的应用程序创建了一个带有需要启用节点集成的本地页面的窗口。
单击此页面上的按钮后,我将导航到第三方页面。
因为我希望在此第三方页面中禁用节点,并且无法在 BrowserWindow
中切换节点集成,我将这个第三方页面加载到沙盒中 BrowserView
它嵌入在窗口内部并被拉伸(stretch)以适应整个屏幕。
现在这样做会导航嵌入 View ,但 BrowserWindow
卡在指向不再相关的旧本地页面。
为了防止这个额外的页面出现在后台,我浏览了我的 BrowserWindow
至"about:blank"
有效地清除它并为 BrowserView
腾出空间.
我现在意识到,虽然这“清除”了旧页面,但它使与之关联的渲染器进程保持事件状态。来自 here :
Chromium creates a renderer process for each instance of a site the user visits
可以理解的是,导航到
"about:blank"
不会向 Electron 发出它应该杀死另一个进程的信号。我想摆脱这个渲染器进程,所以当我与窗口交互时,它不会不必要地坐在那里并使用 CPU 和内存。
有两件事起作用:
我删除了到
"about:blank"
的额外导航。因为我们现在正在终止进程并且:1) 当我的渲染器中的按钮向主进程发送一条消息,告诉它创建一个
BrowserView
并导航到新站点,我执行 process.exit();
.我想我的一部分对进程退出会干扰排队等待主要的消息感到紧张,尽管它似乎工作正常。2) 我没有从渲染器中终止进程,而是创建并导航了我的
BrowserView
然后跑了一点browserWindow.webContents.executeJavascript("process.exit()");
.我觉得这更丑陋,尽管它确实通过#1 中的上述担忧减轻了。没有
webcontents.destroy()
类型的方法,我不知道有一种方法可以向 Electron 发出信号,表明它需要破坏这个不必要的过程。我想我可能有一个非常独特的案例,但是有没有比明确执行
process.exit()
更好的方法(或更标准的方法)来处理这个问题? ?
最佳答案
现在有一个 WebContents::forcefullyCrashRenderer()
完成此操作的 API(由 this PR 引入):
Forcefully terminates the renderer process that is currently hosting this
webContents
. This will cause therender-process-gone event
to be emitted with thereason=killed || reason=crashed
. Please note that some webContents share renderer processes and therefore calling this method may also crash the host process for other webContents as well.
关于process - Electron 是否有杀死无用渲染器进程的标准方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60661917/