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列在文档页面的主流程模块下的原因。