Webpack 使用Electron构建基于网页包的苗条应用程序时,如何使用require()?

Webpack 使用Electron构建基于网页包的苗条应用程序时,如何使用require()?,webpack,electron,svelte,Webpack,Electron,Svelte,我正试图从.svelte文件调用require('electron')。它没有定义。我正在使用带有目标的webpack:“electron渲染器” 如何从我的electron渲染器线程中包括或要求节点模块?要以这种方式从渲染器文件中要求electron,需要在主进程js文件中仔细检查BrowserWindow的webPreferences选项,它应该将这些道具设置为true: const mainWindow = new BrowserWindow({ //... webPreferen

我正试图从.svelte文件调用
require('electron')
。它没有定义。我正在使用带有
目标的webpack:“electron渲染器”


如何从我的electron渲染器线程中包括或要求节点模块?

要以这种方式从渲染器文件中要求electron,需要在主进程js文件中仔细检查
BrowserWindow
webPreferences
选项,它应该将这些道具设置为true:

const mainWindow = new BrowserWindow({
//...
    webPreferences: {
      enableRemoteModule: true, // <-- You probably want this but note this is going through a severe deprecation process
      nodeIntegration: true,
      contextIsolation: false,
      // ...
    }
});
const main window=新浏览器窗口({
//...
网络首选项:{
enablemotemodule:true,//我已经写过这方面的内容,所以您可能想看看。答案不是使用svelte,而是可以移植的

小结 Electron应用程序过去常常在渲染器进程中包括并建议使用
require
。但是,这会导致安全问题,因此团队一直在慢慢地从这一点过渡。新的更好的方法是
要求主进程中的所有内容,并且无论何时渲染器进程n需要一个
require
'd模块,它通过IPC与主进程进行通信。主进程的响应随后通过IPC发送回渲染器进程

这是一个粗略的例子,说明了它是如何工作的

main.js

const{
应用程序,
浏览器窗口,
伊普曼
}=要求(“电子”);
常量路径=要求(“路径”);
常数fs=要求(“fs”);
//保留窗口对象的全局引用,如果不保留,则窗口将
//当JavaScript对象被垃圾收集时,将自动关闭。
让我们赢;
异步函数createWindow(){
//创建浏览器窗口。
win=新浏览器窗口({
宽度:800,
身高:600,
网络首选项:{
nodeIntegration:false,//是Electron v5之后的默认值
contextIsolation:true,//防止原型污染
enableRemoteModule:false,//关闭远程
preload:path.join(\uu dirname,“preload.js”)//使用预加载脚本
}
});
//加载应用程序
加载文件(path.join(uu dirname,“dist/index.html”);
//代码的其余部分。。
}
应用程序打开(“就绪”,创建窗口);
ipcMain.on(“toMain”,(事件,参数)=>{
fs.readFile(“path/to/file”,(错误,数据)=>{
//对文件内容做些什么
//将结果发送回渲染器进程
win.webContents.send(“fromMain”,responseObj);
});
});
preload.js

const{
contextBridge,
IPC渲染器
}=要求(“电子”);
//公开允许渲染器进程使用的受保护方法
//在不公开整个对象的情况下使用IPC渲染器
contextBridge.exposeInMainWorld(
“api”{
发送:(频道、数据)=>{
//白名单频道
设validChannel=[“toMain”];
if(有效通道包括(通道)){
发送(通道、数据);
}
},
接收:(频道,函数)=>{
设validChannel=[“fromMain”];
if(有效通道包括(通道)){
//故意剥离事件,因为它包含“发件人”
on(channel,(event,…args)=>func(…args));
}
}
}
);
index.html


标题
window.api.receive(“fromMain”,(数据)=>{
log(`Received${data}来自主进程`);
});
send(“toMain”,“一些数据”);
免责声明
我是这本书的作者,它将此模式构建到一个很好的入门模板中,并内置了安全实践。(此示例源自此模板)。

尝试
从“electron”导入electron;
看看它是否有效