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

Posted

技术标签:

【中文标题】在 Electron 中使用 ipc 从渲染器设置全局变量【英文标题】:Using ipc in Electron to set global variable from renderer 【发布时间】:2018-09-17 20:15:04 【问题描述】:

renderer.js

ipcRenderer.sendSync('setGlobal', 'globalVarName').varInner.varInner2 = 'result';

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"

这样的事情是否可能,即以这种方式设置globalVarNamevarInner2?其次,有没有办法对此进行优化,这样我们就不必为每个全局变量重写这个过程(即使用动态变量名的某种方式)?

感谢任何想法或解决方案,如果这是一个常识性问题,请见谅。

【问题讨论】:

你确定你绝对需要这些变量是全局的吗?通常,您可以使用事件来完成所有这些操作,因为它是一种消息传递形式,可以替代通过这些全局变量共享内存,因此也许可以找到一个更简洁、架构更好的解决方案。 @T Mack:你有没有为此想出一个不依赖getGlobal的好解决方案以及无法实际更改全局值的问题? 【参考方案1】:

使用IPC设置全局值。

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

在我的例子中,我发现主进程上的全局变量并没有真正改变。具体来说,在开发中刷新 Electron 窗口时,全局变量被设置回原来的值。这使得在发展中恢复状态成为一个问题。

不确定这是否也发生在生产中,但我想它会发生,因此建立依赖于全局变量最新值的新流程将是有问题的。

相反,我最终使用了更详细的方法ipcMainipcRenderer

ma​​in.js

const  ipcMain  = require( "electron" );

ipcMain.on( "setMyGlobalVariable", ( event, myGlobalVariableValue ) => 
  global.myGlobalVariable = myGlobalVariableValue;
 );

renderer.js

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

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

// Read MyGlobalVariable.
remote.getGlobal( "MyGlobalVariable" ); // => "Hi There!"

【讨论】:

对我来说ipcRenderer 为空。有什么想法吗?【参考方案2】:

回答有点晚了,但希望这会对我们未来的访客有所帮助。 因此,基于以下 IPC 方法,我能够创建、访问和更新全局变量的值:

1) 在 main.js 文件中添加这段代码:

   global.MyGlobalObject = 
      variable_1: '12345'
   

2) 在您的第一页上使用它来更新全局变量值:

require('electron').remote.getGlobal('MyGlobalObject').variable_1= '4567'

3) 最后,在第二页上使用类似这样的内容,您将在其中访问修改后的全局变量并打印它:

console.log(require('electron').remote.getGlobal('MyGlobalObject').variable_1)

你可以在electron的documentation找到同样的东西。

【讨论】:

以上是关于在 Electron 中使用 ipc 从渲染器设置全局变量的主要内容,如果未能解决你的问题,请参考以下文章

使用 ipc 渲染器从 mongodb 和 electron js 获取数据

Electron - 限制从主进程到渲染进程的消息流

从 Electron Container IPC Channel 接收数据时,Change Detection 会间歇性工作

Electron - 解决渲染器进程中的电子模块问题

Electron Renderer 进程:我啥时候应该清理 IPC 监听器

Electron(基于Vue)中使用IPC