I have an Electron app that can open different windows.
On app launch the app open a set of window(s) (that load the same HTML and JS files) but with params to change each window displayed infos.
Example :
app.on('ready', async () => {
...
// open window for stuff 1
win1 = new BrowserWindow({
width: 1024,
height: 728
});
win1.loadURL(`file://${__dirname}/app/app.html?id=1`);
// open window for stuff 2
win2 = new BrowserWindow({
width: 1024,
height: 728
});
win2.loadURL(`file://${__dirname}/app/app.html?id=2`);
Obviously passing params in file:// path doesn't work. I can't find a clear solution in Electron documentation or elsewhere on Internet to condition my rendered window to a param.
I can probably use IPC communication after window ready but it seems a little bit too complicated until I just want pass a variable to my child view.
P.S. : to be totally honest my application is built with React/Redux and the param I want to pass to view is the redux store key to listen for this view.
A few methods:
The query string method others have posted seems to work fine. It might even be the easiest.
Electron's documentation says additionalArguments
is:
Useful for passing small bits of data down to renderer process preload scripts.
Main
const win = new BrowserWindow({
width: 800,
height: 600,
backgroundColor: '#000000'
webPreferences: {
additionalArguments: ["myvarvalue", "secondvarvalue", "--another=something"]
}
});
Renderer
window.process.argv
is going to look something like:
["--num-raster-threads=2",
"--enable-gpu-memory-buffer-compositor-resources",
"--enable-gpu-async-worker-context",
...
"--renderer-client-id=4",
"myvarvalue",
"secondvarvalue",
"--another=something"]
It will append an array of strings. You could do something window.process.argv.slice(-3)
to grab the last items in the array.
Like you said, it seems complicated for what you are trying to do, but maybe this helps:
Main
const { ipcMain } = require('electron');
var mainProcessVars = {
somevar: "name",
anothervar: 33
}
ipcMain.on('variable-request', function (event, arg) {
event.sender.send('variable-reply', [mainProcessVars[arg[0]], mainProcessVars[arg[1]]]);
});
Renderer
const { ipcRenderer } = electron;
electron.ipcRenderer.send('variable-request', ['somevar', 'anothervar']);
ipcRenderer.on('variable-reply', function (event, args) {
console.log(args[0]); // "name"
console.log(args[1]); // 33
});
This way allows you to send data besides strings.
According atom source code the query string method is a reliable way to do that very simply, especially when we only need to pass a unique string param:
// main process
win1.loadURL(`file://${__dirname}/app/app.html?id=${id}`);
// rendered process
console.log(global.location.search);
https://github.com/electron/electron/issues/6504
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With