问题描述
我正试图使电子进入此HTML文件,但是require
未定义:
<script>
const electron = require("electron");
const {icpRenderer} = electron;
const form = document.querySelector("form");
form.addEventListener("submit",submitForm);
function submitForm(e){
e.preventDefault();
const item = document.querySelector("#item").value;
}
</script>
对于网络偏好设置,我将nodeIntegration
设置为True,将contextIsolation
设置为True,用于防止安全警告。如何通过此文件获取require
?
Guide Video Adding Script tags
在main.js
中:
function createAddWindow(){
addWindow = new browserWindow({
width: 300,height: 200,title: "Add Inventory Item",webPreferences: {
nodeIntegration: true,worldSafeExecuteJavaScript: true,contextIsolation: true
}
});
addWindow.loadURL(url.format({
pathname: path.join(__dirname,"addWindow.html"),protocol: "file",slashes: true
}));
addWindow.on("close",function(){
addWindow = null;
})
}
解决方法
我遇到的主要问题是启用了contextIsolation
后就无法使用require
。
要在启用ipcRenderer
的情况下访问contextIsolation
,请将预加载文件与contextBridge
一起使用,以公开ipcRenderer
中的某些功能:
preload.js
const { contextBridge,ipcRenderer } = require("electron");
contextBridge.exposeInMainWorld("myAPI",{
ipcSend: (...args) => ipcRenderer.send(...args),ipcOn: (key,handler) => ipcRenderer.on(key,(event,...args) => handler(...args))
});
main.js
function createAddWindow(){
subWindowOpen = true;
addWindow = new BrowserWindow({
width: 400,height: 300,title: "Add Inventory Item",webPreferences: {
worldSafeExecuteJavaScript: true,contextIsolation: true,preload: path.join(__dirname,"preload.js")
}
});
addWindow.loadURL(url.format({
pathname: path.join(__dirname,"addWindow.html"),protocol: "file",slashes: true
}));
}
addWindow.html
<script>
myAPI.ipcSend("item:add",item);
</script>
在不启用nodeIntegration
的情况下,可以使用 contextIsolation
代替,但这被认为是不安全的。最好只公开某些功能,而不要公开整个对象。