当前位置: 首页 > Web前端 > vue.js

electron(一)——webview与其loading页面的通信、渲染进程之间的通信、渲染进程与主进程的通信

时间:2023-04-01 00:49:28 vue.js

公司内部有一个基于electronvue编写的桌面软件,负责开发这个客户端一些daysago如果最后的人走了,我就临时接手文件优化。作为一个写vue但是第一次接触electron的人,花了几天时间浏览了electron的整体架构,electronvue官方文档,客户端代码。尽管如此,我在优化过程中还是遇到了很多麻烦。项目结束后,在此做一个总结。(1)webview所在窗口与其加载的页面之间的通信后台:在开发过程中,为了节省开发成本,不可避免地要使用webview在一个窗口中导入其他网页。但是这个导入的页面往往不尽如人意,会注入一些js和css来修改这个页面,包括添加事件,而webview所在的窗口需要知道事件被触发。加载到webview页面:在注入的js中使用ipcRenderer向窗口发送信息btnDom.addEventListener('click',(e)=>{e.stopPropagation()letipcRenderer=require('electron').ipcRenderervarparamsJSON=JSON.stringify({cellId:cellId,url:dom.url})ipcRenderer&&ipcRenderer.sendToHost(paramsJSON)},false)webview所在窗口:监听ipc-message接收信息webview.addEventListener('ipc-message',(event)=>{if(event.channel){letparams=JSON.parse(event.channel)}})(2)渲染进程之间的通信背景:一个渲染进程可能需要向另一个渲染进程传递参数;在渲染进程之间共享一些数据。(1)使用全局属性global在主进程全局属性中声明一个参数global.sharedObject={customerInfo:null}在渲染进程中修改这个参数require('electron').remote.getGlobal('sharedObject').customerInfo=windowParam读取参数require('electron').remote.getGlobal('sharedObject').customerInfo(2)使用ipcRenderer进行通信ipcRenderer.sendTo(webContentsId,channel,...args)官方文档ipcRenderer.sendTo:通过channel.ipcRenderer.sendTo(remote.getGlobal('assistantWindowId'),'cometCustomer',event.channel)向一个有webContentsId的窗口发送消息其中webContentsId可以在主进程中获取global.assistantWindowId=assistantWindow.webContentsassistantWindow中的.id:使用ipcRenderer.on监听channellipcRenderer.on('cometCustomer',(event,param)=>{})渲染进程与主进程的通信。渲染进程向主进程发送消息。渲染过程:ipcRenderer.send('showCreateCustomerWindow');主流程:ipcMain.on('showCreateCustomerWindow',(event,arg)=>{event.sender.send(channel,argResponse)//回复发送消息的渲染进程,渲染进程通过ipcRenderer.on(channel,(event,arg)=>{})接收回复消息})主进程回复消息还有其他方式:event.reply(channel,argResponse)\event.returnValue=argResponse