【问题标题】:Electron global variable garbage collected if renderer process closes?如果渲染器进程关闭,将收集电子全局变量垃圾?
【发布时间】:2017-07-19 02:14:06
【问题描述】:

在 Electron 中,我的主要进程打开了一个 BrowserWindow。 BrowserWindow 会加载一个 html 页面,然后同一个窗口最终会加载另一个 html 页面。

main.js

var mainWindow;
global.mainState = {
  settings: {}
}
mainWindow = createWindow('main', {
  width: 1000,
  height: 800,
});
if (curState == 'load') {
  mainWindow.loadURL(`file://${__dirname}/interface/load.html`, {})
}
if (curState == 'login') {
  mainWindow.loadURL(`file://${__dirname}/interface/login.html`, {})
}

加载.html

const remote = require('electron').remote;
var testGlobal = remote.getGlobal('mainState')
testGlobal.settings = 'test value'
testGlobal.settings.inner = 'test value2'

main.js 加载第二个页面(login.html)时,全局变量会被删除/取消引用吗?文档说,如果渲染器进程取消引用全局变量,那么该变量将被 gc'd。当我尝试对此进行测试时,我得到了不一致的结果,我只想从比我更聪明的人那里得到一些解释。

【问题讨论】:

    标签: javascript html garbage-collection global-variables electron


    【解决方案1】:

    使用IPC设置全局值。

    @RoyalBingBong 是正确的,“remote.getGlobal() 只是给你一个mainState 的副本而不是参考。”

    您似乎正在更改全局变量的值,但实际上并没有。因此,例如,当我刷新 Electron 浏览器窗口时,该全局变量的值将恢复为原来的值。

    我发现正确更改全局变量值的唯一方法是使用ipcMainipcRenderer(详细方式)。

    ma​​in.js

    const { ipcMain } = require( "electron" );
    
    ipcMain.on( "setMyGlobalVariable", ( event, myGlobalVariable ) => {
      global.myGlobalVariable = myGlobalVariable;
    } );
    

    renderer.js

    const { ipcRenderer, remote } = require( "electron" );
    
    // Set MyGlobalVariable.
    ipcRenderer.send( "setMyGlobalVariable", "Hi There!" );
    
    // Read MyGlobalVariable.
    remote.getGlobal( "MyGlobalVariable" ); // => "Hi There!"
    

    现在,我可以刷新我的 Electron 窗口或启动一个新的渲染器进程,全局变量的值将正确地成为我设置的值,在本例中为“Hi There!”。

    您还可以看到,为了阅读它,我使用更简单的remote.getGlobal。我还没有测试过当值改变并且 this 的值没有更新时这是否会导致问题。如果是这种情况,我可能不得不回到这个答案,并使用另一个 ipcMainipcRenderer 手动读取全局变量。

    【讨论】:

      【解决方案2】:

      testGlobal 将被垃圾回收,因为站点发生了变化。 global.mainState 不会被删除,但是当你调用testGlobal.settings = 'test value' 时它也不会改变,因为remote.getGlobal() 只是给你一个mainState 的副本而不是参考。

      我建议你使用ipcMainipcRenderer 自己同步全局变量。

      【讨论】:

      • 感谢您的帮助。我开始使用您的想法,但是在同步变量时遇到了麻烦。现在我注意到,如果我从渲染器向 main 发送消息以更改变量,则在渲染器中的下一行执行时变量不会改变。如何同步两者以使值一致
      • 这就是异步函数在 javascript 中的工作方式。你可以使用ipcRenderer.sendSync,但这会完全阻塞你的渲染器。
      猜你喜欢
      • 1970-01-01
      • 2016-11-18
      • 2011-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-05
      • 2011-05-27
      • 1970-01-01
      相关资源
      最近更新 更多