Электрон имеет два процесса: main
и render
.Основной процесс в основном заключается в том, где происходят все тяжелые работы и настройка самого приложения.С другой стороны, в процессе рендеринга происходит весь рендеринг HTML.Обычно у вас есть один основной процесс, и у каждого BrowserWindow, WebView, ... есть свой собственный процесс рендеринга.
А вот и подвох, основной процесс не осведомлен о DOM, который отображается.Однако вы можете связываться между основным процессом и процессом рендеринга с помощью сообщений IPC .
Для получения более подробной информации я настоятельно рекомендую документацию по архитектуре приложения https://electronjs.org/docs/tutorial/application-architecture
Вариант A:
В вашем случае, когда вы создаете меню из основного процесса, у вас нет доступа к DOM процессов рендеринга.Что вам нужно сделать в обработчике кликов, это отправить сообщение IPC в ваше BrowserWindow.Там вы прослушиваете вызов и запускаете funcao();
Модифицированный пример из документов:
// In main process.
const {ipcMain} = require('electron')
const mainWindow = ... // reference to the BrowserWindow
mainWindow.webContents.send('asynchronous-message', 'ping')
// In renderer process (web page).
const {ipcRenderer} = require('electron')
ipcRenderer.on('asynchronous-message', (event, arg) => {
console.log(arg) // prints "ping"
})
Опция B:
Просто создайте свое меню внутри процесса рендеринга, и вы получите доступ к объекту окна и всем остальным API-интерфейсам браузера.
С моей точки зрения, «лучшего» способа размещенияКод для создания меню в качестве основного и рендеринга имеет как положительные, так и отрицательные стороны.