前言

不是人机评论区扣1
本来写着玩够了,不打算摸索了,结果想着试试能不能实现本地伪终端?使用node-pty?害,看AI生成没看懂,复制粘贴复制粘贴,error error 的报错😭,还是再摸索一下控制器、业务层、单双向通信吧,回头还能删掉一些用不到的,心里有底一点。

本来想着跟着B站大学学习,结果没搜到教程。只能看文档摸索了

说明

用词不专业勿怪,可能描述的不清晰,分析的代码是官方的demo python分支

参考文档来源

官方文档说ipc等于electron官方的api,有些我就去electron文档找了

https://www.kaka996.com/pages/ae344a/#%E5%BA%9F%E5%BC%83-ipc-send-route-params

在这里插入图片描述

先说结论

双向通信

  1. 前端,监听 使用 ipc.on()
  2. 前端,通过ipc.send(‘通信频道’, 参数) 发送给控制器 (controller/xxx.js)
  3. 在控制器 或 业务层,使用 event.reply(‘通信频道’, 回复的内容) 回复前端,实现了双向通信
  4. 控制器 实现的时候,所有方法接受两个参数:args,event 。
    args 前端传递的参数, event: ipc通信时才有值。

单项通信

  1. 使用invoke.send(‘通信频道’, 参数).then(r =>{ r 是返回值}) - 是异步回调
  2. 使用 cons msg = ipc.invoke(‘通信频道’, 参数); 是异步

控制器 可以调用业务层 (service/xxxx.js)
控制器 可以调用任务 (jobs/xxx.js)
控制器 仅仅做一些简单的逻辑判断然后调用 业务层 (前面这是我依据测试后,以及看他的demo 推测的,你非要控制器那实现完整的处理应该也可以)

一、下载代码,切换分支, 安装依赖

https://www.kaka996.com/pages/479cf2/
在这里插入图片描述
在这里插入图片描述

二、注释掉加载数据库,用不到

预加载脚本里

electron-egg\electron\preload\index.js

在这里插入图片描述

三、启动运行,分析的是这个长消息,对应ipc应双向通信

在这里插入图片描述

四、阅读官方文档,看双向通信

https://www.kaka996.com/pages/ca6b30/#ipc

在这里插入图片描述
在这里插入图片描述

五、知道了双向通信,on和send配套的

什么意思,看着感觉,双向通信就多了个on,send 和 invoke有啥区别?然后我看到下一篇文档, 结合上面的,能分析出来的就是 on 和send 应该是配套使用的。

https://www.kaka996.com/pages/a28ece/
ipc.invoke(channel, param) - 发送异步消息(invoke/handle 模型)
ipc.on(channel, listener) - 监听 channel, 当新消息到达,调用 listener
ipc.send(channel, ...args) - 通过channel向主进程发送异步消息

在这里插入图片描述

六、定位前端源码ipc.vue

frontend\src\views\framework\socket\Ipc.vue

在这里插入图片描述

(一)、看到显示 {{messageString}}

在这里插入图片描述

(二)、定位这个messageString 的值怎么来的

可以看到是 init 执行,然后执行 ipc.on 时候得到的
在这里插入图片描述

(三)、看看这个init() 哪里被调用 - onMouted()

在组件已经被挂载后执行 init()
在这里插入图片描述

(四)、查看点击按钮后执行函数 sendMsgStart/Stop

传递参数

{
    type: 'start',
    content: '开始'
}
或
{
    type: 'end',
    content: ''
  }

在这里插入图片描述

(五)、ipc是哪里来的 -> ipcRenderer.js

在这里插入图片描述

frontend\src\utils\ipcRenderer.js

在这里插入图片描述

(六)、ipcRenderer.js 和业务层通信用的,那就先不管它了

https://www.kaka996.com/pages/3d5da0/#%E5%8F%AA%E9%9C%80%E4%B8%80%E4%B8%AA%E6%96%87%E4%BB%B6-ipcrenderer-js

在这里插入图片描述

(七)、ipc.send()、icp.on() 的参数

(1)、查阅官方文档

https://www.kaka996.com/pages/ae344a/#%E5%BA%9F%E5%BC%83-ipc-send-route-params

在这里插入图片描述
在这里插入图片描述

(2)、ipc.send() 第一个参数 ipcApiRoute.framework.ipcSendMsg 是什么?

在这里插入图片描述

(3)、查找 ipcApiRouter,发现来自 api目录/index.js文件

在这里插入图片描述

(4)、index.js -> ipcApiRoute.xxx.xxx 是字符串(通信信频道,即路由)

前端 api/index.js 记录通信信道名称
在这里插入图片描述

(5)、on 两个参数,第二个是啥?回调函数

在这里插入图片描述
名字可不是我乱取的,官方文档里写着

https://www.kaka996.com/pages/ca6b30/#%E5%8F%8C%E5%90%91%E9%80%9A%E4%BF%A1

在这里插入图片描述

(6)、回调函数接一个 event 是什么

result 很好理解,是返回的结果,那 event是啥?问问AI
在这里插入图片描述
真的假的?看官方demo,确实event调用.sender,那它说的应该没错哈哈
在这里插入图片描述
后面发现官方文档:
当然,这个是控制器接受的参数,但是,大概率他们的event,都是同一个东西哈哈

https://www.kaka996.com/pages/9330c8/

在这里插入图片描述

(八)、ipc.send(),ipc.on() 的作用 (发送,监听)

https://www.kaka996.com/pages/ca6b30/#%E5%8F%8C%E5%90%91%E9%80%9A%E4%BF%A1

在这里插入图片描述

七、控制器、业务层

controller: 控制器
preload: 预加载,这个好理解,启动前加载的
service: 业务层
在这里插入图片描述

(一)、控制器接收前端的请求,调用业务层代码

https://www.kaka996.com/pages/9330c8/

在这里插入图片描述

分析代码

(1)、话接上会,前端通过它通信频道,互相通信

demo 写了,ipc通信频道,就可以证明,他们就是通过相同的频道名称来确定谁和谁通信
在这里插入图片描述
上面说了,控制器是接受前端的请求。
在这里插入图片描述

(2)、控制器 controller\framework.jsFrameworkControlleripcSendMsg 调用 -> 业务层frameworkService.bothWayMessage

在这里插入图片描述
在这里插入图片描述

(3)、fromeworkService 来自业务层的 frameworks.js

在这里插入图片描述
service\frameworks.js
在这里插入图片描述

(4)、前端,业务层,通过指定相同的通信频道联系

在这里插入图片描述

(5)、.reply() 和 channel 只能在控制器?只能在业务层? - 不是

这是业务层的代码,我试试删掉 this.myTimer 赋值操作
在这里插入图片描述
正常
在这里插入图片描述

把代码提取到控制器中,正常运行
在这里插入图片描述
在这里插入图片描述
这个代码也验证了我的猜想
在这里插入图片描述

(二)、控制器方法参数

(1)、所有方法接收两个参数 args、event

  • @param args 前端传的参数
  • @param event - 通信时才有值
https://www.kaka996.com/pages/9330c8/

在这里插入图片描述

在这里插入图片描述

(2)、但是看他的代码,说明用不到的时候可以不写。

在这里插入图片描述

八、单向通信

我看感觉但双向,最表层的区别是 双向使用 .reply() 回复前端
而单项没有这个

单项仅作异步回调、异步讨论,毕竟人家官方说了不推荐使用同步
在这里插入图片描述

(一)、分析代码

(1)、向控制器发送使用 invoke(‘通信频道’, 参数)

异步,异步回调 就不分析了
在这里插入图片描述

(2)、看控制器那的代码

在这里插入图片描述

(3)、好了,没啥好说的,单向就是,没有主动向前端发送信息吧,不像双向使用 reply()

九、jobs 任务

(一)、一直纳闷,这是啥东西,谁调用它,一开始没找到

在这里插入图片描述

(二)、看这里,看着是业务层调用jobs,不过我猜控制器也可以直接使用jobs下的,但是没人会这么干,控制器应该就是执行一些简单的逻辑,去调用对应的业务层代码

在这里插入图片描述
在这里插入图片描述

(三)、看一下官方文档:

没有理解哈哈哈,不管了

https://www.kaka996.com/pages/981bc4/
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐