Electron 电子对话框在contextBridge中未定义 站台 电子-12.0.8 平台–macOS10.15.7 描述
我试图显示一个电子渲染器进程中的文件对话框。我想我可以引用Electron 电子对话框在contextBridge中未定义 站台 电子-12.0.8 平台–macOS10.15.7 描述,electron,Electron,我试图显示一个电子渲染器进程中的文件对话框。我想我可以引用对话框对象,就像我通过上下文桥引用对象一样 //preload.ts const{contextBridge,ipcRenderer,dialog}=require('electron'); 从“electron”导入类型{IPCrenderEvent}; contextBridge.exposeInMainWorld( “ipc”, { 发送:(频道:字符串,数据:字符串[])=>{ 发送(通道、数据); }, on:(通道:字符串,f
对话框
对象,就像我通过上下文桥
引用对象一样
//preload.ts
const{contextBridge,ipcRenderer,dialog}=require('electron');
从“electron”导入类型{IPCrenderEvent};
contextBridge.exposeInMainWorld(
“ipc”,
{
发送:(频道:字符串,数据:字符串[])=>{
发送(通道、数据);
},
on:(通道:字符串,func:(evt:IPCrenderEvent,args:any)=>void)=>{
IPCC.on(频道,功能);
},
选择文件:(标题:字符串)=>dialog.showOpenDialogSync({
标题、属性:['openFile']})
}
)
但是当我调用window.ipc.chooseFile('Some Title')
时,我收到一个错误:
无法读取未定义的属性“showOpenDialogSync”
这似乎表明对话框
引用未通过
contextBridge
代理。然而,前两个传递ipc
的函数是有效的。警告我们,不是每种类型都可以代理
笔记
我理解在我的示例中,这三个函数的通用性破坏了上下文隔离的安全目的。在我花太多时间设计一个详细的消息传递方案之前,我只是想确定什么是有效的
我知道我可以在主进程中实现此功能,并通过IPC调用它。我同意。我只是好奇为什么通过contextBridge
成功地代理了ipcrederer
引用,但是对话框却没有
问题不在于通过contextBridge
代理,而在于渲染器进程中提供了哪些Electron API。不幸的是,dialog
并不是其中之一(),因此它不能在渲染器过程中直接引用,即使在预加载期间也是如此。用于使用渲染器进程中的主进程模块的旧版本仍然可用,但它正确地警告您
远程
模块已弃用。使用ipcdrenderer
和ipcMain
代替remote
因此,是的,注释(2)中的解决方案就是预期的解决方案。谢谢。我知道我只需要被打一巴掌。这就是为什么对话框API列在文档页面的主流程模块下的原因。