【问题标题】:In Electron, how to make ipcRenderer available to multiple renderer processes via global variable defined in preload.js?在 Electron 中,如何通过 preload.js 中定义的全局变量使 ipcRenderer 可用于多个渲染器进程?
【发布时间】:2021-05-01 21:33:03
【问题描述】:

为了维护contextIsolation: false 的安全性,我通常通过在preload.js 中创建一个全局变量来使ipcRenderer 可用于渲染器进程,如下所示:

const electron = require('electron');

process.once('loaded', () => {
  global.ipcRenderer = electron.ipcRenderer;
});

那么,ipcRenderer就可以直接用在我的(主)渲染器进程中了:

<script>
...
ipcRenderer.send(...)
...
</script>

但是,当我打开第二个窗口(即,我正在创建第二个渲染器进程)时,ipcRenderer 未定义。为什么第二个渲染器进程不能访问我的全局变量?我该如何解决这个问题?非常感谢您的帮助!

【问题讨论】:

  • edit您的问题并附上您用来打开both BrowserWindows、第一个和第二个的代码。谢谢!
  • 非常感谢您的评论!我想,我自己找到了答案(通过尝试很多不同的方法)。我会把我的答案写在下面,如果你能告诉我我的答案是否正确(或至少有意义),我将不胜感激。

标签: javascript node.js electron


【解决方案1】:

我尝试了很多事情,我认为我已经找到了解决方案。但是,我不知道这是否是“最佳实践”的方式。社区的任何意见都将受到高度赞赏。

如果第二个渲染器进程也使用相同的preload.js,则它可以访问全局变量ipcRenderer。我认为再次使用preload.js 会有些多余甚至是错误的,但它解决了问题。这是有效的代码:

function openModal() {
  let modalWin = new BrowserWindow({
    parent: win,
    modal: true,
    width: 400,
    height: 300,
    show: false,
    webPreferences: {
      preload: path.join(__dirname, 'preload.js'),
      contextIsolation: false
    }
  })

  modalWin.loadFile('modal.html');
  modalWin.once('ready-to-show', () => {
    modalWin.show()
  })
}

【讨论】:

  • 这并不理想,因为它暴露了整个 ipcRenderer 并禁用了 ContextIsolation。如果您根本不加载任何远程内容,您应该是安全的,但最好还是使用更安全的方法,以防万一。这个答案更安全,因为它只公开所需的功能和渠道:stackoverflow.com/a/59675116/13752696
猜你喜欢
  • 2018-09-17
  • 2020-06-07
  • 2020-10-09
  • 2021-04-26
  • 2020-11-20
  • 2017-07-08
  • 2016-12-08
  • 2020-04-09
  • 2022-01-27
相关资源
最近更新 更多