即使上下文隔离关闭,如何使 contextBridge 工作

问题描述 投票:0回答:3

我的一些代码需要打开

contextIsolation
,我的 preload.js 看起来像这样:

const { contextBridge } = require("electron");
const { ipcRenderer } = require("electron/renderer");

const API = {
    window: {
        close: () => ipcRenderer.send("app/close"),
        minimize: () => ipcRenderer.send("app/minimize"),
    }
}

contextBridge.exposeInMainWorld("app", API);

每次我启动应用程序时都会发送此错误:

Uncaught Error: contextBridge API can only be used when contextIsolation is enabled
    at node:electron/js2c/renderer_init:45:277
    at Object.exposeInMainWorld (node:electron/js2c/renderer_init:45:359)
    at preload.js:11:15

编辑:这是应该与预加载脚本交互的脚本:

const { ipcRenderer } = require("electron/renderer");
const MINUS = document.getElementById("minimizeApp");
const CLOSE = document.getElementById("closeApp");

MINUS.addEventListener("click", minimizeApp);
CLOSE.addEventListener("click", closeApp);

function closeApp() {
    app.window.close();
}
function minimizeApp() {
    app.window.minimize();
}

这是通过

<script>
标签导入的。

提前致谢。

javascript electron
3个回答
3
投票

该 API 的目的是在两个完全隔离的地方之间架起一座桥梁。如果您不隔离它们,您就没有理由使用它,因此会出现错误消息。

具有上下文隔离

由于预加载脚本将在不同的上下文中执行,因此您需要 Context Bridge API 将您的 API 公开给渲染器进程:

contextBridge.exposeInMainWorld('MY_API', {
  getAnswer() {
    return 42;
  }
});

没有上下文隔离

预加载脚本和渲染器进程共享相同的上下文。因此,在预加载脚本中,您只需将 API 直接附加到

window
对象即可。
window
将与渲染器进程中的相同:

// preload script
window.MY_API = {
  getAnswer() {
    return 42;
  }
}

📢   即此处无需使用 Context Bridge API ;)

无论如何,

MY_API
都可以从渲染器进程中的
window
对象获得:

<!-- renderer process -->
<body>
  <script>
    alert(window.MY_API.getAnswer());
  </script>
</body>

0
投票

查看Electron的文档。对于新版本的 Electron 来说,关闭 contextIsolation 是一个禁忌。您真正想要的是通过 contextBridge 公开 MY_API 并设置 ipcRenderer 来来回发送信号处理。


0
投票

我在此代码段中添加了将我的预加载脚本转换为 contextIsolation: true

const contextBridge = {
  exposeInMainWorld: (windowKey, obj) => {
    window[windowKey] = obj
  }
}

(来自@customcommander的回答https://stackoverflow.com/a/71920418/2077884

© www.soinside.com 2019 - 2024. All rights reserved.