electron 桌面端通信 (三)

之前,我们知道了如何快速将一个web项目转化为桌面端应用,同时也知道了针对某些行业如何添加副屏。不过,在有些场景下,可能需要通过Electron获取一些桌面端(系统)信息,传递给网页,或者副屏需要需要接收主屏传过来的数据等等场景,此时,我们就需要通过通信解决。

1、以前

以前,通过 Electron 构建的构建的项目,会在网页环境中提供 require 函数,用来加载 electron 的一些模块,进而解决一些问题,不过后面统一改成使用 IPC 通道(也保留了原有方式,不过需要简单配置下,这里不在叙述) 去实现通信。

2、理解

之前我们说过,electron 是分为主进程渲染进程,可以简单这样理解,渲染进程就是类似浏览器,帮你渲染你指定的网页地址,主进程则是 electron 相关代码。

假设,网页需要通过 electron 获取电脑mac地址,从而完成登录,那么问题可以分为两步:

1、网页告诉主进程,我要获取mac地址
2、主进程接收到信息,获取mac地址,并返回它

也就是 渲染进程----->主进程的过程

3、渲染进程----->主进程的过程

// ======================electron 中====================================
// =========preload.js中=======

const { contextBridge, ipcRenderer } = require('electron')
// 这一步,会在 window 环境下,注册一个 testElectronAPI 对象,里面就放着你写的通信api
contextBridge.exposeInMainWorld('testElectronAPI',{
  getMacInfo: () => ipcRenderer.invoke('get-mac')
})

// =========main.js中=======
app.whenReady().then(() => {
  // 添加处理函数
  ipcMain.handle('get-mac', async function () {
  	const os = require("os")
  	const macRegex = /(?:[a-z0-9]{1,2}[:-]){5}[a-z0-9]{1,2}/i
	const zeroRegex = /(?:[0]{1,2}[:-]){5}[0]{1,2}/

  	let info = {
        mac: []
    }
    
    const list = os.networkInterfaces()
    for (const [key, parts] of Object.entries(list)) {
            if (!parts) continue
            for (const part of parts) {
                if (zeroRegex.test(part.mac) === false) {
                    info.mac.indexOf(part.mac) == -1 ? info.mac.push(part.mac) : ''
                }
            }
     }
    return info
  })
 ...
})

// 这一步,就完成了在主进程中,事件的注册,那么接下来就是在渲染进程中触发了

// ======================网页中====================================

btn.addEventListener('click', async () => {
  const res = await window.electronAPI.getMacInfo()
 ....
})

上述是比较推荐的做法,在Electron 7 之前,也可以采用 sendsendSync两种方式,不过这两种性能不是很好,尤其是 sendSync 同步方法,必须等到返回信息,如果一直没返回,容易造成卡死

4、假如我是要与副屏通信呢?

上面我们是解决了 渲染进程----->主进程 的问题,对于副屏这种问题其实就是 渲染进程(主) ----> 主进程----->渲染进程(副),人话就是:

1、主屏告诉 electron,我这里有个副屏的快递,我先给你
2、electron 拿到快递,告诉副屏,你的快递
3、副屏,拿到快递了

上面这个例子可以知道,相当于 electron 只是在充当了一次中转的角色,把主屏的内容,交给了副屏

这里可以联合运用
渲染器进程到主进程(单向)+ 主进程到渲染器进程

以下为,将主屏中的购物车信息,同步到副屏中

// 实现 渲染器进程到主进程(单向)

// =========== 老规矩 electron 中 ===========
// preload.js
const { contextBridge, ipcRenderer } = require('electron')
contextBridge.exposeInMainWorld('mainScreen', {
    setViceGoods: (data) => ipcRenderer.send('set-goods', data)
})
// main.js
ipcMain.on('set-goods', (event, data) => {
	// viceWindow 为副屏窗口
    viceWindow.webContents.send('update-goods-msg', data)
 })
 // 主屏传递
 window.mainScreen.setViceGoods(goodsData)


// 副屏注册事件 
// 副屏的 preload.js 
const { contextBridge, ipcRenderer } = require('electron')
contextBridge.exposeInMainWorld('viceScreen', {
    onGoods: (callback) => ipcRenderer.on('update-goods-msg', callback)
})

// 副屏网页中
// 可以理解为注册了一个回调函数
window.viceScreen.onGoods((event, data) => {
    console.log('传递过来的数据',data)
})

简单介绍了常用的几种通信方式,如有更多需求,可参考文档(链接

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Electron是一个开源的框架,用于构建跨平台的桌面应用程序。它基于Web技术栈,使用HTML、CSS和JavaScript来构建应用界面,并使用Node.js来处理底层系统功能。 以下是一些使用Electron构建的知名桌面应用程序的例子: 1. Visual Studio Code:这是一款由微软开发的轻量级代码编辑器,支持多种编程语言和丰富的插件生态系统。 2. Slack:这是一款流行的团队协作工具,用于实时通信、文件共享和项目管理等。 3. Discord:这是一款针对游戏社区设计的语音、视频和文本聊天应用程序。 4. Atom:这是GitHub开发的另一款代码编辑器,具有高度可定制性和丰富的插件生态系统。 5. Skype:这是一款广泛使用的即时通讯和语音通话应用程序,支持跨平台使用。 6. Postman:这是一款用于测试和调试API的工具,提供了强大的请求构建和响应分析功能。 7. Trello:这是一款流行的项目管理工具,用于组织任务、跟踪进度和协作团队。 8. Slack:这是一款流行的团队协作工具,用于实时通信、文件共享和项目管理等。 9. Figma:这是一款基于云的设计工具,用于创建和共享用户界面设计和原型。 10. WordPress Desktop:这是WordPress官方提供的桌面应用程序,用于管理和发布WordPress网站。 这些例子展示了Electron在不同领域的应用,从代码编辑器到团队协作工具,再到设计工具和项目管理工具等。通过使用Electron,开发者可以利用Web技术栈构建功能强大且跨平台的桌面应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值