Electron JS не работает дочерний(renderer) процесс
Я новичок в JavaScript и фреймворке Electron, однако он кажется не таким уж сложным , но возникла очень неприятная проблема. Заключается она в том , что не работает дочерний процесс. Никаких ошибок или предупреждений , он просто не работает. Данный процесс отвечает за создание и функционирование контекстного меню . По типу File , Edit и так далее. Электрон по сути сам создает такое меню просто как шаблон , но оно без функций и просто не соответствует моим требованиям. Поэтому я начал создавать свое ,но писать все это в главном процессе , идея конечно рабочая , но потом читать код и выпускать его на гит , идея сомнительная.
И так
Вот код главного файла - main.js
//Constants for menu and requirements
const {app , BrowserWindow , Menu , dialog , ipcMain} = require('electron' , 'fs');
function createWindow() {
const win = new BrowserWindow({
width: 1024,
height: 768,
webPreferences: {
nodeIntegration: true,
enableRemoteModule: true
}
});
win.loadFile('index.html');
//win.webContents.openDevTools();
}
app.whenReady().then(createWindow);
app.on('window-all-closed', ()=>{
if(process.platform !== 'darwin') {
app.quit();
}
});
app.on('activate' , ()=> {
if(BrowserWindow.getAllWindows().length === 0) {
createWindow();
}
});
Вот код дочернего процесса
actions.js
const remote = require('electron').remote;
const wnd = remote.getCurrentWindow();
const Template = [
{
label: "File",
submenu: [
{
label: "Open"
},
{
label: "Save"
},
{
role: "close"
}
]
}
];
const menu = remote.buildFromTemplate(Template);
remote.Menu.setApplicationMenu(menu);
Ответы (1 шт):
Чтобы работал require добавьте contextIsolation в webPreferences.
const win = new BrowserWindow({
width: 1024,
height: 768,
webPreferences: {
contextIsolation: false,
nodeIntegration: true,
enableRemoteModule: true
}
});
Еще если я не ошибаюсь, то с 14го электрона remote является отдельным модулем его нужно отдельно импортировать и еще инициализировать.
const remoteMain = require("@electron/remote/main");
remoteMain.initialize();
Так же при открытии окна нужно "разрешать" использовать этому окну remote
function createWindow() {
const win = new BrowserWindow({
width: 1024,
height: 768,
webPreferences: {
contextIsolation: false,
nodeIntegration: true,
enableRemoteModule: true
}
});
win.loadFile('index.html');
// Включаем его для окна
remoteMain.enable(win.webContents);
}
Итого: main.js
//Constants for menu and requirements
const {app , BrowserWindow} = require('electron');
// Импортируем remote
const remoteMain = require("@electron/remote/main");
// Инициализируем
remoteMain.initialize();
function createWindow() {
const win = new BrowserWindow({
width: 1024,
height: 768,
webPreferences: {
contextIsolation: false,
nodeIntegration: true,
enableRemoteModule: true
}
});
win.loadFile('index.html');
// Включаем его для окна
remoteMain.enable(win.webContents);
// win.webContents.openDevTools();
}
app.whenReady().then(createWindow);
app.on('window-all-closed', ()=>{
if(process.platform !== 'darwin') {
app.quit();
}
});
app.on('activate' , ()=> {
if(BrowserWindow.getAllWindows().length === 0) {
createWindow();
}
});
action.js
const electronRemote = require('@electron/remote');
const curWin = electronRemote.getCurrentWindow();
const Menu = electronRemote.Menu;
const Template = [
{
label: "File",
submenu: [
{ label: "Open" },
{ label: "Save" },
{ role: "close" }
]
}
];
const menu = Menu.buildFromTemplate(Template);
curWin.setMenu(menu); // Для определенного окна
// Menu.setApplicationMenu(menu); // Одинаковое для всех окно