Estoy tratando de enviar mensajes de ida y vuelta entre el proceso de electrones principal y la instancia de vue. lo que tengo hasta ahora es
Precargar.js:
import { contextBridge, ipcRenderer } from 'electron' window.addEventListener('DOMContentLoaded', () => { const replaceText = (selector, text) => { const element = document.getElementById(selector) if (element) element.innerText = text } for (const dependency of ['chrome', 'node', 'electron']) { replaceText(`${dependency}-version`, process.versions[dependency]) } }) window.ipcRenderer = require('electron').ipcRenderer; contextBridge.exposeInMainWorld('ipcRenderer', { //Render (Vue) to main (Electron) send: (channel, data) => { let validChannels = ['clientMessage'] // <-- Array of all ipcRenderer Channels used in the client if (validChannels.includes(channel)) { ipcRenderer.send(channel, data) } }, //Main (Electron) to Render (Vue) on: (channel, func) => { let validChannels = ['electronMessage'] // <-- Array of all ipcMain Channels used in the electron if (validChannels.includes(channel)) { // Deliberately strip event as it includes `sender` ipcRenderer.on(channel, (event, ...args) => func(...args)) } } })Así que tengo 2 canales en la lista blanca en ipcRender, uno se llama 'clientMessage' para enviar mensajes desde la instancia de vue al proceso principal de electrones, el otro es 'electronMessage' para enviar mensajes desde el proceso principal de electrones a la instancia de vue.
En mi background.js tengo lo siguiente:
app.on('window-all-closed', () => { if (process.platform !== 'darwin') app.quit() }) ipcMain.on('clientMessage', (event, args) => { console.log('received a message from vue: '+args) event.sender.send('message','return Message from electron'+args); });Y en mi app.Vue tengo:
mounted () { window.ipcRenderer.on('electronMessage', (event, data) => { console.log('message from electron: '+data) }) }, methods: { sendMessage(){ window.ipcRenderer.send('clientMessage','testing') } }La aplicación funciona bien, y cuando llamo a la función sendMessage obtengo correctamente un registro de consola en la terminal de electrones que dice mensaje recibido. Entonces, claramente vue -> la mensajería electrónica ha funcionado, pero ¿por qué no funcionará al revés?
Sus "claves" contextBridge.exposeInMainWorld son ipcRenderer.send e ipcRenderer.receive .
Debe usar estas claves para acceder a sus métodos preload.js IPC definidos. IE: send y on .
Específicamente, para usar el ipcRender.on(...) , lo llamas con window.ipcRenderer.receive(...) .
app.Vue (proceso de procesamiento)
// To send a message from render thread to main thread. window.ipcRenderer.send('clientMessage','testing'); // Working // To receive a message from main thread to render thread. window.ipcRenderer.receive('electronMessage', (event, data) => { console.log('message from electron: ' + data); });Descubrí por qué, la forma de enviar mensajes desde el proceso principal de electrones a la instancia del renderizador no es la misma. Dado que solo hay un proceso principal de electrones ejecutándose en todo momento, podemos hacer simplemente window.ipcRenderer.send('', 'su mensaje') en la instancia del renderizador vue, pero dado que puede haber más de una instancia del renderizador ejecutándose, el El proceso principal de electrones necesita saber a qué proceso de procesamiento enviarlo.
Entonces, en su main.js/background.js, sea cual sea el .js, está ejecutando el proceso principal de electrones. hacer esto:
let win; async function createWindow() { // Create the browser window. win = new BrowserWindow({ width: 800, height: 600, webPreferences: { nodeIntegration: false, contextIsolation: true, enableRemoteModule: true, preload: path.join(__dirname, "preload.js") } }) . . .y luego para enviar un mensaje a la instancia de procesamiento:
win.webContents.send('<channelName>','your message')de esa manera lo envía al proceso de renderizado correcto. Así que mi código al final se ve así:
ipcMain.on('clientMessage', (event, args) => { console.log('received a message from vue: '+args) win.webContents.send('electronMessage','Reply from main process: '+args) });