我的一些代码需要打开
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>
标签导入的。
提前致谢。
该 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>
查看Electron的文档。对于新版本的 Electron 来说,关闭 contextIsolation 是一个禁忌。您真正想要的是通过 contextBridge 公开 MY_API 并设置 ipcRenderer 来来回发送信号处理。
我在此代码段中添加了将我的预加载脚本转换为 contextIsolation: true
const contextBridge = {
exposeInMainWorld: (windowKey, obj) => {
window[windowKey] = obj
}
}
(来自@customcommander的回答https://stackoverflow.com/a/71920418/2077884)