三、electron-egg - 记录学习 - 控制层、业务层、双向通信
本来写着玩够了,不打算摸索了,结果想着试试能不能实现本地伪终端?使用node-pty?害,看AI生成没看懂,复制粘贴复制粘贴,error error 的报错😭,还是再摸索一下控制器、业务层、单双向通信吧,回头还能删掉一些用不到的,心里有底一点。本来想着跟着B站大学学习,结果没搜到教程。只能看文档摸索了。
前言
不是人机评论区扣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
先说结论
双向通信
- 前端,监听 使用 ipc.on()
- 前端,通过ipc.send(‘通信频道’, 参数) 发送给控制器 (controller/xxx.js)
- 在控制器 或 业务层,使用 event.reply(‘通信频道’, 回复的内容) 回复前端,实现了双向通信
- 控制器 实现的时候,所有方法接受两个参数:args,event 。
args 前端传递的参数, event: ipc通信时才有值。
单项通信
- 使用invoke.send(‘通信频道’, 参数).then(r =>{ r 是返回值}) - 是异步回调
- 使用 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.js
中 FrameworkController
的 ipcSendMsg
调用 -> 业务层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/
更多推荐
所有评论(0)