contextBridge.exposeInMainWorld
是 Electron 框架中的一个 API,用于在主进程(Main Process)和渲染进程(Renderer Process)之间安全地暴露 API。IPC
(Inter-Process Communication)是 Electron 中用于进程间通信的机制。
你遇到的问题是:在电子应用程序中,使用 TypeScript 和 contextBridge.exposeInMainWorld
时,出现了“无法读取未定义的属性 'send'”的错误。
这个错误通常是由于以下几种原因之一引起的:
send
方法。send
方法时,拼写错误或者路径不正确。send
方法。在主进程中,确保你已经正确设置了 IPC 通道。例如:
// main.ts
import { app, BrowserWindow, ipcMain } from 'electron';
const mainWindow = new BrowserWindow({
webPreferences: {
contextIsolation: true,
preload: path.join(__dirname, 'preload.js')
}
});
ipcMain.on('message-from-renderer', (event, arg) => {
console.log(arg);
event.sender.send('message-from-main', 'Hello from main process!');
});
contextBridge.exposeInMainWorld
在 preload.js
文件中,确保你正确使用了 contextBridge.exposeInMainWorld
:
// preload.js
import { contextBridge, ipcRenderer } from 'electron';
contextBridge.exposeInMainWorld('api', {
send: (channel, data) => {
// 允许的白名单通道
const validChannels = ['message-from-renderer'];
if (validChannels.includes(channel)) {
ipcRenderer.send(channel, data);
}
},
receive: (channel, func) => {
const validChannels = ['message-from-main'];
if (validChannels.includes(channel)) {
ipcRenderer.on(channel, (event, ...args) => func(...args));
}
}
});
确保你的 TypeScript 类型定义正确。例如:
// types.ts
declare global {
interface Window {
api: {
send: (channel: string, data: any) => void;
receive: (channel: string, func: (...args: any[]) => void) => void;
};
}
}
然后在你的渲染进程中使用这些 API:
// renderer.ts
window.api.send('message-from-renderer', 'Hello from renderer process!');
window.api.receive('message-from-main', (message) => {
console.log(message);
});
通过以上步骤,你应该能够解决“无法读取未定义的属性 'send'”的问题。如果问题仍然存在,请检查是否有其他配置或代码错误。
领取专属 10元无门槛券
手把手带您无忧上云