返回顶部
首页 > 资讯 > 前端开发 > JavaScript >vue与electron实现进程间的通信详情
  • 456
分享到

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

2024-04-02 19:04:59 456人浏览 八月长安
摘要

目录一、配置内容1.进程间的通信第一种方式引入ipcRenderer第二种方式引入ipcRenderer2.渲染进程常用配置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通信内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: vue与electron实现进程间的通信详情

本文链接: https://lsjlt.com/news/167124.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • vue与electron实现进程间的通信详情
    目录一、配置内容1.进程间的通信第一种方式引入ipcRenderer第二种方式引入ipcRenderer2.渲染进程常用配置3.将ipcMain封装到一个js中统一处理三、总结前言:...
    99+
    2024-04-02
  • Electron进程间通信的实现
    目录主进程与渲染进程之间通信ipc模块 + window.webContentsremote模块渲染进程之间通信使用Electron开发出来的桌面应用都是多进程的,其中包含了一个主进...
    99+
    2024-04-02
  • Electron进程间通信如何实现
    今天小编给大家分享一下Electron进程间通信如何实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。使用Electron开...
    99+
    2023-06-30
  • Python通过队列实现进程间通信详情
    目录一、前言二、队列简介三、多进程队列的使用四、使用队列在进程间通信一、前言 在多进程中,每个进程之间是什么关系呢?其实每个进程都有自己的地址空间、内存、数据栈以及其他记录其运行状态...
    99+
    2024-04-02
  • 详谈java线程与线程、进程与进程间通信
    线程与线程间通信一、基本概念以及线程与进程之间的区别联系:关于进程和线程,首先从定义上理解就有所不同1、进程是什么?是具有一定独立功能的程序、它是系统进行资源分配和调度的一个独立单位,重点在系统调度和单独的单位,也就是说进程是可以独 立运行...
    99+
    2023-05-31
    进程 线程 通信
  • Android 通过Messager与Service实现进程间双向通信案例详解
    目录Messenger使用步骤Service代码客户端代码分析结果注意事项Android中的Service和其调用者既可以在同一个App中,也可以在不同的App。如果Service在...
    99+
    2024-04-02
  • vue+electron实现创建多窗口及窗口间的通信(实施方案)
    目录一、前言二、实施方案1.创建多窗口2.多窗口间的通信三、后记一、前言 对于一个桌面应用来说,有时候单独一个窗口用户使用起来会不太方便,比方说写日报或者查看文件等,若是在同一窗口内...
    99+
    2024-04-02
  • python多进程实现进程间通信实例
    python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程。Python提供了非常好用的多进程包multiprocessing,只需要定义一个...
    99+
    2022-06-04
    进程 实例 通信
  • Python的进程间通信详解
    目录进程概述队列简介多进程队列的使用使用队列在进程间通信总结进程概述 ​ 进程(Process)是计算机中已运行程序的实体。进程与程序不同,程序本身只是指令、数据及器组织形式的描述,...
    99+
    2024-04-02
  • 详解Android 进程间通信的几种实现方式
    一、概述 由于应用程序之间不能共享内存。在不同应用程序之间交互数据(跨进程通讯),在Android SDK中提供了4种用于跨进程通讯的方式。 这4种方式正好对应于android...
    99+
    2022-06-06
    进程 进程间通信 通信 Android
  • golang进程间通信怎么实现
    在Go语言中,有多种方式可以实现进程间通信。以下是一些常见的方法: 使用管道(Pipe):管道是进程间通信的一种简单而有效的方式...
    99+
    2023-10-25
    golang
  • Linux进程间通信怎么实现
    这篇文章主要讲解了“Linux进程间通信怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Linux进程间通信怎么实现”吧!共享内存共享内存可以说是最有用的进程间通信方式,也是最快的IP...
    99+
    2023-07-05
  • Node.js和Electron是怎么做进程通信的
    这篇文章主要讲解了“Node.js和Electron是怎么做进程通信的”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Node.js和Electron是怎么做...
    99+
    2024-04-02
  • 进程间的通信
      使用 multiprocessing 里的 Queue() import multiprocessing def download_from_web(q): """下载数据""" # 模拟从网上下载的数据 ...
    99+
    2023-01-30
    进程 通信
  • Node中的进程间通信怎么实现
    这篇“Node中的进程间通信怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Node...
    99+
    2024-04-02
  • Linux消息队列实现进程间通信实例详解
    Linux消息队列实现进程间通信实例详解 一、什么是消息队列 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法。 每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构...
    99+
    2022-06-04
    队列 详解 实例
  • Android AIDL实现进程间通信探索
    前言:       前面总结了程序间共享数据,可以使用ContentProvider也可以使用SharedPreferenc...
    99+
    2022-06-06
    进程 aidl 进程间通信 通信 Android
  • Android Messenger实现进程间双向通信
    简介 Messenger是安卓进程间通信 (IPC) 最为简单的方式,可以实现进程间双向通信。详见官网介绍 代码实现 服务端应用实现 MessengerService接收客户端发送的...
    99+
    2024-04-02
  • Android中怎么实现进程间通信
    这篇文章给大家介绍Android中怎么实现进程间通信,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。由于android系统中应用程序之间不能共享内存。因此,在不同应用程序之间交互数据(跨进程通讯)就稍微麻烦一些。进程间通...
    99+
    2023-06-04
  • Android Activity与Service通信(不同进程之间)详解
    在Android中,Activity主要负责前台页面的展示,Service主要负责需要长期运行的任务,所以在我们实际开发中,就会常常遇到Activity与Service之间的通...
    99+
    2022-06-06
    程之 service 进程 activity Android
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作