实现electron项目打开子窗口引用html并实现通讯

944 阅读2分钟

       最近公司有个新项目是基于electron-vue开发,途中也遇到了不少的坑,现在记述一下最新遇到的一个问题。

需求是这样的,点击主窗口A的按钮,打开一个子窗口B,子窗口里面引入html页面C。然后需要实现AC之间的通讯。

一开始想的这还不简单,直接用ipcRender通讯不就行了么,首先设置contextIsolation:false,取消上下文隔离,使得渲染进程也就是我们的页面能访问到electron实例,然后再html页面中通过require引入ipcRender,分分钟搞定。但是,后面的开发中就遇到问题了,因为后面需要用到一些nodejs模块的内容 但是html页面无法直接使用nodejs模块。所以这条路不行了。

后来又想到既然直接通讯不行,那么在组件中用ifame引入html然后通过postmessage来和组件通讯,然后把nodejs模块需要的功能配置在组件上呢。说干就干。

先写一个组件页面引入目标html页面

其中 top.html就是需要引入的html页面 放在public文件夹下的top文件夹里

publicPath就是当前运行环境下的url 这个大家都懂 = =

然后组件需要监听iframe中的消息并转发给主进程 同时也需要监听主进程的消息并传给iframe这里我偷懒了 直接调用iframe的方法把内容传递进去了

然后再top页面的配置

其实就是实现两个方法一个是postmessage用于发送消息 一个是setmessage用于接受信息

最后是子窗口的配置

这里重点讲一下loadURL的配置

这个url和我们正常项目的url是一样的,要指定子窗口加载什么页面就用什么url,我的子组件router名字就是TopHtmlWindow 所以配置成这样。

潜水多年,第一次写,有点简陋,希望大家不要嫌弃。哈哈哈哈哈哈