在Electron中使用ipc从渲染器设置全局变量

T M*_*ack 2 html javascript node.js electron

renderer.js

ipcRenderer.sendSync('setGlobal', 'globalVarName').varInner.varInner2 = 'result';
Run Code Online (Sandbox Code Playgroud)

main.js

global.globalVarName = {
  varInner: {
    varInner2: ''
  },
  iWontChange: 'hi'
};

ipcMain.on('setGlobal', (event, arg) => {
  console.log(arg) // should print "result"
  // what goes here?
})

console.log(varInner2) // should print "result"
Run Code Online (Sandbox Code Playgroud)

是这样的可能,即设置varInner2globalVarName这种方式?其次,有没有一种方法可以优化此过程,这样我们就不必为每个全局变量重写此过程(即使用动态变量名称执行此操作的某种方法)?

感谢您提出任何想法或解决方案,如果这是一个常识性问题,我们深表歉意。

Jos*_*ter 5

使用IPC设置全局值。

getGlobal当您仅对读取全局变量的值感兴趣时,使用效果很好。但是,我发现尝试分配或更改其使用的值getGlobal是有问题的。

就我而言,我发现Main进程上的全局变量并没有实际更改。具体来说,当刷新开发中的Electron窗口时,全局变量将重新设置为其原始值。这使得恢复开发状态成为一个问题。

不知道这是否还会在生产中发生,但我想会发生,因此,依赖于全局变量的最新值来拆分新流程将是有问题的。

相反,我最终使用了ipcMain和的更详细的方法ipcRenderer

main.js

const { ipcMain } = require( "electron" );

ipcMain.on( "setMyGlobalVariable", ( event, myGlobalVariableValue ) => {
  global.myGlobalVariable = myGlobalVariableValue;
} );
Run Code Online (Sandbox Code Playgroud)

renderer.js

const { ipcRenderer, remote } = require( "electron" );

// Set MyGlobalVariable.
ipcRenderer.send( "setMyGlobalVariable", "Hi There!" );

// Read MyGlobalVariable.
remote.getGlobal( "MyGlobalVariable" ); // => "Hi There!"
Run Code Online (Sandbox Code Playgroud)