在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`, {})
}
load.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。当我尝试测试这个时,我会得到不一致的结果,我只想从比我更明智的人那里得到一些解释。
由于网站的变化,testGlobal
将被垃圾收集。 global.mainState
不会被删除,但是当你打电话给testGlobal.settings = 'test value'
时它也不会改变,因为remote.getGlobal()
只给你一份mainState
而不是参考。
我建议你使用ipcMain和ipcRenderer自己同步全局变量。
@RoyalBingBong是正确的,“remote.getGlobal()
只给你一份mainState
而不是参考。”
看起来你可能正在改变全局变量的值,但事实并非如此。因此,例如,当我刷新Electron浏览器窗口时,该全局变量的值将恢复到原来的状态。
我发现正确改变全局变量值的唯一方法是使用ipcMain
和ipcRenderer
(冗长的方式)。
main.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
。我没有测试当值发生变化时这是否会导致问题并且未更新此值。如果是这种情况,我可能不得不回到这个答案,并使用另一个ipcMain
和ipcRenderer
来手动读取全局变量。