Я потратил около часа на чтение gist после репо после публикации в блоге, но не могу понять, как это сделать.
У меня есть экземпляр BrowserWindow
загружающий URL-адрес (который я контролирую), с nodeIntegration: false
.
Из основного процесса я хотел бы общаться с отображаемым URL. Я путаюсь между preload
сценариями, BrowserWindow.send
и executeJavascript
парадигмами.
Данные, которые я хочу отправить, очень большие (например, загрузка файлов между 50 КБ и 10 МБ).
Какой лучший способ сделать это? Любые любые примеры/учебники, которые вы, возможно, знаете, были бы полезными. Спасибо!
// main.js
const path = require('path')
const electron = require('electron')
const { app, BrowserWindow, ipcMain } = electron
const window = new BrowserWindow({
minWidth: 1200,
minHeight: 700,
autoHideMenuBar: true,
resizable: true,
show: false,
scrollBounce: true,
webPreferences: {
preload: path.join(__dirname, 'preload.js'),
}
})
window.webContents.loadURL('https://xxx.xxx.com') // load your web page
ipcMain.on('ping', (event, msg) => {
console.log(msg) // msg from web page
window.webContents.send('pong', 'hi') // send to web page
})
// preload.js
const { ipcRenderer } = require('electron');
function init() {
// add global variables to your web page
window.isElectron = true
window.ipcRenderer = ipcRenderer
}
init();
// your web page
<script>
if (window.isElectron) {
window.ipcRenderrer.send('ping', 'hello')
window.ipcRenderrer.on('pong', (event, msg) => console.log(msg) )
}
</script>
Использование preload- скрипта должно работать. Вы можете использовать ipcRenderer
для связи с основным процессом и ipcRenderer
его с помощью простого API для окна визуализации. preload.js
может выглядеть так:
const { ipcRenderer } = require('electron');
let listener;
const bridge = {
send: data => ipcRenderer.send('from-renderer', data),
onMessage: callback => listener = callback
}
ipcRenderer.on('to-renderer', (event, arg) => {
if (listener) {
listener(arg);
} else {
console.warn('No listener');
}
});
window.bridge = bridge;
в рендерере
window.bridge.send('Data to main process');
window.bridge.onMessage(payload => console.log('Data received', payload))
Пожалуйста, ознакомьтесь с этим обсуждением, чтобы получить дополнительную информацию.