Электрон: Связь между BrowserWindow и отображаемым URL (nodeIntegration: false)

1

Я потратил около часа на чтение gist после репо после публикации в блоге, но не могу понять, как это сделать.

У меня есть экземпляр BrowserWindow загружающий URL-адрес (который я контролирую), с nodeIntegration: false.

Из основного процесса я хотел бы общаться с отображаемым URL. Я путаюсь между preload сценариями, BrowserWindow.send и executeJavascript парадигмами.

Данные, которые я хочу отправить, очень большие (например, загрузка файлов между 50 КБ и 10 МБ).

Какой лучший способ сделать это? Любые любые примеры/учебники, которые вы, возможно, знаете, были бы полезными. Спасибо!

Теги:
electron

2 ответа

2
Лучший ответ
// 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>
  • 0
    Спасибо за это. Я пошел по этому пути, и он отлично работает!
  • 0
    Это не считается безопасным, в соответствии с [ Electronjs.org/docs/tutorial/security] . Смотрите мой ответ здесь: stackoverflow.com/a/57656281/289203
1

Использование 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)) 

Пожалуйста, ознакомьтесь с этим обсуждением, чтобы получить дополнительную информацию.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню