vue与electron实现进程间的通信详情

目录
  • 一、配置内容
    • 1.进程间的通信
      • 第一种方式引入ipcRenderer
      • 第二种方式引入ipcRenderer
    • 2.渲染进程常用配置
    • 3.将ipcMain封装到一个js中统一处理
  • 三、总结

前言:

本文主要介绍electron渲染进程和主进程间的通信,以及在渲染进程和主进程中常用的配置项。

一、配置内容

1.进程间的通信

渲染进程和主进程间的通信主要通过ipcRendereripcMain这两个模块实现的,其中ipcRenderer是在渲染进程中使用,ipcMain在主进程中使用。

其中,渲染进程使用ipcRenderer有两种方式

第一种方式引入ipcRenderer

这种方式主要是通过Electron窗口的preload方法实现的,以下是实现步骤

首先我们创建一个preload.js文件,把文件放入到public文件中

// preload.js
window.ipcRenderer = require('electron').ipcRenderer;

之后在主进程中引入:

import { BrowserWindow, ipcMain } from 'electron'
let win = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      contextIsolation: false,
      // eslint-disable-next-line no-undef
      preload: __static + '/preload.js'
    }
})
// 顺便这里放一个主进程的监听
ipcMain.on('pong', (e, args) => {
    console.log('这里是主进程pong', args)
    e.sender.send('ping', '你好 我是主进程')
})

这样我们就可以再渲染进程直接使用window.ipcRenderer,去监听或发送事件了。

// App.vue

// 渲染进程的监听
window.ipcRenderer.on('pang', (e, arg) => {
  console.log('渲染进程===我收到啦', arg)
})
// 渲染进程发送事件===这个可以放到一个点击事件里面去触发
window.ipcRenderer.send('ping', '你好呀,我是渲染进程')

实验结果如下,这里注意主进程的打印是在终端里面输出的:

第二种方式引入ipcRenderer

首先我们需要先安装一个插件,这是由于在webpack5中移除了nodejs核心模块的polyfill自动引入,所以需要手动引入,这里我的脚手架version是5.0.8

npm install node-polyfill-webpack-plugin
// or
yarn add node-polyfill-webpack-plugin

之后在vue.config.js中引入

// vue.config.js

const NodePolyfillPlugin = require('node-polyfill-webpack-plugin')

module.exports = defineConfig({
  ...
  configureWebpack: {
    plugins: [new NodePolyfillPlugin()],
  }
})

在主进程文件中,创建窗口时这样设置

const win = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      nodeIntegration: true,
      contextIsolation: false
    }
  })

最后我们在渲染进程的入口文件main.js引入ipcRenderer

// main.js

window.ipcRenderer = window.require('electron').ipcRenderer

实验方式和结果同方法一相同。

这里再给大家说,要使用window.require('electron').ipcRenderer这种方式。

是因为直接window.ipcRenderer = require('electron').ipcRenderer这样引入会报错,如下:

出现这个错误的原因主要是因为:nodejs运行时的require与编译时webpack的require是不同的。默认情况下,window是全局的,然而在webpack编译时会忽略window。 具体情况可以点击查看

以上我们就可以实现渲染进程和主进程的相互通信。

2.渲染进程常用配置

接下来我们就统一引入下在渲染进程中常用的配置,其中ipcRenderer用于渲染进程与主进程通信或渲染进程与渲染进程间通信; $remote用于获取当前主窗口的一些信息;$shell用于将连接用默认浏览器打开或者启动默认应用之类的。

// 判断是否是electron环境
window.$isElectron = window?.process?.versions.electron !== undefined
// 判断是否是macOS系统
window.$isMac = /macintosh|mac os x/i.test(navigator.userAgent)
// 将渲染进程通信实例挂载到window上
window.ipcRenderer = window.require('electron').ipcRenderer
// `remote`模块为渲染进程(web页面)和主进程通信(IPC)提供了一种简单方法。
window.$remote = window.require('electron').remote
// 将使用默认应用程序管理文件和 url实例挂载到window上
window.$shell = window.require('electron').shell

这些配置可以用上面两种任意方式引入渲染进程都可以。

这里要注意 remote 模块在 Electron 12 废弃,并将在 Electron 14 被移除. 由@electronic/remote模块替代。

当前我们的版本是electron13,所以我们还可以正常使用remote 模块就行。

如果使用remote 模块,我们需要在创建窗口实例中加入一项配置enableRemoteModule: true 

如下所示:

const win = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      nodeIntegration: true,
      contextIsolation: false,
      enableRemoteModule: true
    }
  })

以下附上关于@electronic/remote的官网讲解的注意事项

Note:  Since this is requiring a module through npm rather than a built-in module, if you're using remote from a sandboxed process, you'll need to configure your bundler appropriately to package the code of @electron/remote in the preload script. Of course, using @electron/remote makes the sandbox much less effective.

Note:  In electron >= 14.0.0, you must use the new enable API to enable the remote module for each desired WebContents separately: require("@electron/remote/main").enable(webContents).

In electron < 14.0.0@electron/remote respects the enableRemoteModule WebPreferences value. You must pass { webPreferences: { enableRemoteModule: true } } to the constructor of BrowserWindows that should be granted permission to use @electron/remote.

这里给大家展示下关于remote和shell的常用方法,如下:

// remote --- 获取当前窗口实例,之后可以调用窗口的放大缩小关闭等方法
window.$remote.getCurrentWindow()
// shell --- 用默认浏览器打开这个链接
window.shell.openExternal(url)

3.将ipcMain封装到一个js中统一处理

创建一个IpcMainEvent.js文件,之后再background中引入,这样便于管理

import { ipcMain } from 'electron'
export const IpcMainEvent = (win) => {
  // 监听登录成功
  ipcMain.on('login', (event, arg) => {
       // ....
  })
}
import { IpcMainEvent } from './IpcMainEvent'
// win为窗口实例
IpcMainEvent(win)

三、总结

以上关于electron+vue的项目的一些基础配置我们就算是完成了。接下来就可以搭建项目的业务部分了。后续会继续给大家介绍关于electron窗口相关的配置等,完善桌面应用。

到此这篇关于vue与electron实现进程间的通信详情的文章就介绍到这了,更多相关vue electron通信内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 用electron 打包发布集成vue2.0项目的操作过程

    手里有个老项目是基于element admin框架下的,之前写的时候没考虑到要打包成桌面端,后期需要打包成客户端,然后就开始了一些列版本操作,看着百度了都很简单,把electron 加入到自己项目中各种不兼容,升级版本,改代码各种百度,一个国庆假期就搞了这个事情,为了后面大家少踩点坑,打算详细的写写我的踩坑之路还有版本配置(版本配置真的很有必要,不要嫌麻烦,一步一步走哈) 1.大家比较关注的版本配置表 node.js v15.0.0 electron V14.2.9 vue 2.7.8 sass

  • vue+electron实现创建多窗口及窗口间的通信(实施方案)

    目录 一.前言 二.实施方案 1.创建多窗口 2.多窗口间的通信 三.后记 一.前言 对于一个桌面应用来说,有时候单独一个窗口用户使用起来会不太方便,比方说写日报或者查看文件等,若是在同一窗口内,我只能做一件事,不能边预览文件,边去查看聊天消息内容等.又或者是多个应用间相互关联的需要同步查看的事件,这都是极其不方便的.因此我们可以将某些集成到electron软件中的应用或者某些界面用单独的窗口打开(以下称为独立窗口). 二.实施方案 1.创建多窗口 首先我们从electron官网中找到创建窗口的

  • Vue electron零基础使用教程

    需求:给vue项目加一个外壳(electron),顾名思义也就是使用electron应用程序运行vue项目,直接将写好上线的vue项目在线地址放入electron程序中即可 操作步骤: 1.构建:构建应用程序首先要先安装electron相关依赖包以及搭建框架.在这里就不详细赘述了,直接上官网看文档https://www.electronjs.org/zh/docs/latest/tutorial/quick-start 2.打包:此时就到了重要的时候,官方指定的是使用脚手架打包-----Elec

  • vue electron实现无边框窗口示例详解

    目录 一.前言 二.实现方案 1.创建无边框窗口 2.创建windows窗口控件组件 三.后记 一.前言 无边框窗口是不带外壳(包括窗口边框.工具栏等),只含有网页内容的窗口.对于一个产品来讲,桌面应用带边框的很少,因为丑(我们的UI觉得--与我无关-.-).因此我们就来展开说下,在做无边框窗口时候需要注意的事项以及我踩过的坑. 二.实现方案 1.创建无边框窗口 要创建无边框窗口,只需在 BrowserWindow的 options 中将 frame 设置为 false: const { Bro

  • 关于electron-vue打包后运行白屏的解决方案

    目录 electron-vue打包后运行白屏的解决 electron-vue打包之后只有空白页问题 原因 electron-vue打包后运行白屏的解决 找到.electron-vue文件夹中的webpack.renderer.config.js文件,注释掉下面这段 然后再重新打包,问题解决. electron-vue打包之后只有空白页问题 原因 使用了history路由导致打包之后 只有空白页面,将路由改成hash之后就有显示了 以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们.

  • Vue electron前端开启局域网接口实现流程详细介绍

    目录 一.主要实现原理 二.获取本机局域网IP 三.开启服务器 四.关闭服务器 五.简单演示 六.整体代码 七.展望 一.主要实现原理 electron本身就集成了Nodejs,简直是不要太舒服.直接用最基本的http模块开接口即可,也可以用express,看个人喜好.下面演示的是http模块. 二.获取本机局域网IP 首先要获取本机局域网的IP,这就是接口的IP地址了. // 获取本机的局域网IP function getServerIp() { let interfaces = os.net

  • vue与electron实现进程间的通信详情

    目录 一.配置内容 1.进程间的通信 第一种方式引入ipcRenderer 第二种方式引入ipcRenderer 2.渲染进程常用配置 3.将ipcMain封装到一个js中统一处理 三.总结 前言: 本文主要介绍electron渲染进程和主进程间的通信,以及在渲染进程和主进程中常用的配置项. 一.配置内容 1.进程间的通信 渲染进程和主进程间的通信主要通过ipcRenderer和ipcMain这两个模块实现的,其中ipcRenderer是在渲染进程中使用,ipcMain在主进程中使用. 其中,渲

  • WCF实现进程间管道通信Demo分享

    一.代码结构: 二.数据实体类: using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.Text; using System.Threading.Tasks; namespace DataStruct { /// <summary> /// 测试数据实体类 /// </summary> [DataContr

  • Python进程间的通信一起来了解下

    目录 通信方式 Queue介绍: 生产者和消费者模型 为什么要使用生产者和消费者模式 什么是生产者消费者模式 实现方式一:Queue 实现方式二:利用JoinableQueue 总结 通信方式 进程彼此之间互相隔离,要实现进程间通信(IPC),multiprocessing模块主要通过队列方式 队列:队列类似于一条管道,元素先进先出 需要注意的一点是:队列都是在内存中操作,进程退出,队列清空,另外,队列也是一个阻塞的形态 Queue介绍: 创建队列的类(底层就是以管道和锁定的方式实现): Que

  • Android Studio创建AIDL文件并实现进程间通讯实例

    在Android系统中,跨进程通信是非常普遍的事情,它用到了Binder机制处理进程之间的交互.Binder机制会开放一些接口给Java层,供android开发工程师调用进程之间通信.这些接口android封装到了AIDL文件里,当我们项目用到跨进程通信时可以创建.aidl文件,.aidl文件可以协助我们达到跨进程的通信.下面简单介绍用AndroidStudio创建AIDL文件的过程. a.新建AIDL文件 1.项目文件夹右键---> new --->选择AIDL 2.自定义一个接口名称 3.

  • Android基于Aidl的跨进程间双向通信管理中心

    得益于最近有点时间和精力,我想起来了一件事.那就是在上家公司,公司要求做一个APP进程间的通信的功能,并不是APP对APP的直接跨进程通信,而是通过一个服务中心,做接收,然后,再转发,避免应用之间耦合性高,不然的话,新增一个APP,其他APP也要进行升级更新(类似于有服务中心的聊天室). 我就花几个小时写点东西吧,顺便记录一下 大家都知道在Android设备上,有很多方式,比如,广播,socket,共享内存,aidl等,其中广播和aidl都是基于android中iBinder机制 广播: 广播有

  • Python语法学习之进程间的通信方式

    目录 什么是进程的通信 队列的创建 - multiprocessing 进程之间通信的方法 进程间的通信 - 队列演示案例 批量给 send 函数加入数据 小节 进程间通信的其他方式 - 补充 什么是进程的通信 这里举一个例子接介绍通信的机制:通信 一词大家并不陌生,比如一个人要给他的女友打电话.当建立了通话之后,在这个通话的过程中就是建立了一条隐形的 队列 (记住这个词).此时这个人就会通过对话的方式不停的将信息告诉女友,而这个人的女友也是在倾听着.(嗯…我个人觉得大部分情况下可能是反着来的)

  • C语言中进程间通讯的方式详解

    目录 一.无名管道 1.1无名管道的原理 1.2功能 1.3无名管道通信特点 1.4无名管道的实例 二.有名管道 2.1有名管道的原理 2.2有名管道的特点 2.3有名管道实例 三.信号 3.1信号的概念 3.2发送信号的函数 3.3常用的信号 3.4实例 四.IPC进程间通信 4.1IPC进程间通信的种类 4.2查看IPC进程间通信的命令 4.3消息队列 4.4共享内存 4.5信号灯集合 一.无名管道 1.1无名管道的原理 无名管道只能用于亲缘间进程的通信,无名管道的大小是64K.无名管道是内

  • vue综合组件间的通信详解

    本文实例为大家分享了vue综合组件间的通信,供大家参考,具体内容如下 实现一个ToDoList. ①完成所有的组件的创建和使用 ②add 点击add按钮时候,将用户输入的内容(todoinput),显示在(todolist) 核心代码:兄弟组件间通信 步骤1:var bus = new Vue() 步骤2:在准备接受数据的组件 bus.$on('addEvent',function(){ }) 步骤3:触发事件 bus.$emit('addEvent',123) 将todolist中数组的元素

  • Vue 父子组件、组件间通信

    本人对Vue组件间通信不懂,搜索了很多关于Vue 父子组件间通信介绍,下面我来记录一下,有需要了解Vue 父子组件.组件间通信的朋友可参考.希望此文章对各位有所帮助. <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>组件</title> <meta name="viewport"

随机推荐