上下文桥中未定义电子对话框



平台

  • 电子-12.0.8
  • 平台–macOS10.15.7

描述

我正在尝试显示来自Electron渲染器进程的文件对话框。我想我可以像通过contextBridge引用ipcRenderer一样引用dialog对象。

// preload.ts
const { contextBridge, ipcRenderer, dialog } = require('electron');
import type { IpcRendererEvent } from 'electron';
contextBridge.exposeInMainWorld(
'ipc',
{
send: (channel: string, data: string[]) => {
ipcRenderer.send(channel, data);
},
on: (channel: string, func: (evt: IpcRendererEvent, args: any) => void) => {
ipcRenderer.on(channel, func);
},
chooseFile: (title: string) => dialog.showOpenDialogSync({
title, properties: ['openFile']})
}
)

但当我调用window.ipc.chooseFile('Some Title')时,我收到一个错误:

无法读取未定义的属性"showOpenDialogSync">

这似乎表明dialog引用未通过CCD_ 8代理。然而,传达ipcRenderer的前两个功能发挥了作用。exposeInMainWorld文档警告我们,并不是每种类型都可以代理。

备注

  1. 我理解示例中三个函数的通用性破坏了上下文隔离的安全目的。我只是想在之前确定什么是有效的我花了太多时间设计详细的消息传递方案。

  2. 我知道我可以在主进程中实现这个函数,并通过IPC调用它。我对此很满意。我只是好奇为什么ipcRenderer引用通过contextBridge成功代理,而dialog却没有。

问题不是通过contextBridge进行代理,而是在渲染器进程中可以使用其中一个Electron API。不幸的是,dialog不是其中之一(请注意其页面上的"Process:Main"(,因此即使在预加载期间,也无法在渲染器过程中直接引用它。旧的remoteAPI使用渲染器进程中的主要进程模块仍然可用,但它正确地警告您

remote模块已弃用。使用ipcRendereripcMain代替remote

所以,是的,注释(2(中的解决方案就是预期的解决方案。

最新更新