首页 > 解决方案 > 在 Electron 中,如何通过 preload.js 中定义的全局变量使 ipcRenderer 可用于多个渲染器进程?

问题描述

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

const electron = require('electron');

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

然后,ipcRenderer可以直接在我的(主)渲染器进程中使用:

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

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

标签: javascriptnode.jselectron

解决方案


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

如果第二个渲染器进程ipcRenderer也使用相同的preload.js. 我认为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()
  })
}

推荐阅读