Reputation: 990
In Electron, I have my main process opening a BrowserWindow. The BrowserWindow loads one html page and then the same window eventually loads another html page.
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'
When main.js loads the second page (login.html), will the global variable be deleted/dereferenced? The docs say that if the renderer process dereferences a global variable then the variable will be gc'd. When I try to test this I get inconsistent results and I would just like some explanation from someone more wise than I.
Upvotes: 3
Views: 3352
Reputation: 47481
@RoyalBingBong is correct in that "remote.getGlobal()
just gives you a copy of mainState
and not a reference."
It might seems like you're changing the value of the global variable, but you're not. So, for example, when I refresh my Electron browser window, the value of that global variable would revert to what it was.
I found that the only way to properly change the value of the global variable was to use ipcMain
and ipcRenderer
(the verbose way).
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!"
Now, I can refresh my Electron window or spin up a new renderer process and value of the global variable will correctly be what I set it to, in this example, "Hi There!".
You can also see that for reading it, I use the simpler remote.getGlobal
. I haven't tested whether this will cause problems when the value changes and the value of this doesn't get updated. I might have to come back to this answer if that's the case and use another ipcMain
and ipcRenderer
to manually read the global variable.
Upvotes: 3
Reputation: 1129
testGlobal
will be garbage collected, since the site changes. global.mainState
will not be deleted, however it will also not change when you call testGlobal.settings = 'test value'
, because remote.getGlobal()
just gives you a copy of mainState
and not a reference.
I would suggest you use ipcMain and ipcRenderer to sync the global variable yourself.
Upvotes: 1