Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

146
Views
Enviar mensajes a través del canal principal de Electron IPC a la instancia de vue solo funciona de una manera

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?

about 4 years ago · Juan Pablo Isaza
2 answers
Answer question

0

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); });
about 4 years ago · Juan Pablo Isaza Report

0

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) });
about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!