javascript - 无法将主进程中定义的变量传递给启用了 contextIsolation 的渲染器 BrowserView?

标签 javascript node.js electron

我正在尝试创建自定义菜单/标题栏,但我使用 BrowserView 将其添加到主 BrowserWindow,而不是仅使用 BrowserWindow.loadURL()方法(原因)。

但是,当启用上下文隔离时,这似乎会导致加载预加载脚本出现问题。

是)我有的:

main.js

const mainWindow = new BrowserWindow({
    frame: false,
    webPreferences: {
        nodeIntegration: false,
        contextIsolation: true,
        preload: path.join(__dirname, "preload.js")
    }
})

const bView = new BrowserView();
bView.setBounds(//set my bounds);
bView.webContext.loadURL(path.join(__dirname, "menu.html"));

mainWindow.setBrowserView(bView);

preload.js
const { remote } = require('electron')
window.mainWindow = remote.getCurrentWindow();

在渲染器脚本中:
console.log(window.mainWindow); // undefined

我想我理解为什么它是未定义的,但我不清楚如果可能的话,如何与渲染器进程共享主进程变量。

我已经尝试过提到的here (使用 webFrame.executeJavaScript() )但这似乎没有任何作用(我什至不确定 webFrame 应该是什么)。

如果我使用 mainWindow.loadURL(filePath) 加载 menu.html,一切正常但这不是我想做的。

最佳答案

contextBridge.exposeInMainWorld是启用上下文隔离时允许在预加载到渲染器上下文之间进行通信的接口(interface)。 https://www.electronjs.org/docs/api/context-bridge#contextbridgeexposeinmainworldapikey-api-experimental

但也应该注意它不能转发不可序列化的对象,也可能包括远程对象。同样,通过远程暴露整个对象是一个很大的安全漏洞,无论如何都会破坏上下文隔离,应该避免。您也可以引用有关远程模块的计划弃用讨论:https://github.com/electron/electron/issues/21408

关于javascript - 无法将主进程中定义的变量传递给启用了 contextIsolation 的渲染器 BrowserView?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59866014/

相关文章:

javascript - 导入 Electron 时,fs.existsSync 不是一个函数

javascript - 如何将特定 DOM 元素的编号记录到控制台中?

javascript - 在 Vue.js + Vite.js 中禁用代码拆分( block )

javascript - 随机报价按钮不起作用(简单)(HTML、JS、CSS)

node.js - 如何在不使用Auth0通用登录的情况下配置auth0认证/授权?

build - 如何使用 Electron 生成器更改应用程序图标

javascript - 修改react-big-calendar中的工具提示

mysql - Node.js - 从数据库 (mysql) 检索数据 - 延迟

node.js - 嵌套的循环从错误的数字开始

electron - 如何拆分 Electron 应用程序的 main.js?