gpt4 book ai didi

contextBridge 中未定义的 Electron 对话框

转载 作者:行者123 更新时间:2023-12-04 07:35:19 27 4
gpt4 key购买 nike

平台

  • Electron - 12.0.8
  • 平台 – macOS 10.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') 时,我收到一个错误:

Cannot read property 'showOpenDialogSync' of undefined

这似乎表明 dialog 引用没有通过contextBridge 代理。然而,传送 ipcRenderer 的前两个函数起作用了。 exposeInMainWorld documentation警告我们并非所有类型都可以被代理。

注意事项

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

  2. 我明白我可以在主进程中实现这个功能并通过IPC调用它。我没意见。我很好奇为什么 ipcRenderer 引用可以通过 contextBridge 成功代理,但 dialog 却没有。

最佳答案

问题不在于通过 contextBridge 进行代理,而是渲染器进程中完全可用的 Electron API 之一。不幸的是,dialog 不是其中之一 (note "Process: Main" on its page),因此即使在预加载期间也不能在渲染器进程中直接引用它。老remote API使用来自渲染器进程的主进程模块仍然可用,但它正确地警告你

The remote module is deprecated. Instead of remote, use ipcRenderer and ipcMain.

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

关于contextBridge 中未定义的 Electron 对话框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67779084/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com