我的工作内容有写网页游戏,游戏涉及到前后端通信,没找到顺手的通信包,所以手写了一个通用的 js 通信包:remote。
js
子集iframe
/ Java
服务器 等 // 远端 remote.register('something', async (params: Whatever) => { return WhatYouWant }) // 本地 // res === WhatYouWant const res = await remote._.something(xxx)
由于通信双方是平等的,所以 B 调用 A 的流程也是一样的
1 humbass 293 天前 看了下不知道怎么用 |
![]() | 2 xiaoming1992 OP @humbass 在这边写使用方法的话内容太多了,估计没人会看完,所以只能简单介绍一下。 使用方法见 [README.md]( https://github.com/xiaomingTang/xiaoming/blob/master/%40zimi/remote/README.md) |
![]() | 3 codehz 292 天前 感觉 js 间 rpc api 用起来不如 comlink 方便哈哈( 不过要自定义通道还有 jack works 的 async-call-rpc 这些库的优点是注册方法不需要一个个去注册,直接提供一个对象就可以了 |
![]() | 4 xiaoming1992 OP @codehz 我去,跟我写的 remoteValue 好像。我知识面不够广,不知道有这么个东西。。。 不过我的包不限于 webworker ,只要对方能与 js 通信,就能用这个包,简便地调用远端的函数,使用远端的值。 |
![]() | 5 Leon6868 292 天前 支持异步流式回复吗? |
![]() | 6 Leon6868 292 天前 很神奇,正好在昨天我用 Gemini 搓了一个用途几乎一样的库,用于前端页面通信 |
![]() | 7 xiaoming1992 OP |
![]() | 8 zangbianxuegu 291 天前 没太明白,降低通信成本主要是指什么?对于普通的浏览器-服务端 http 通信 |
![]() | 9 xiaoming1992 OP ![]() @zangbianxuegu 普通的浏览器-服务端通信,倒降低不了什么成本,因为浏览器和服务器的通信,一般是单向的,且频率较低,所以成本本来就不高。 这个包的应用场合是,比如你有 main 页面和 iframe 页面,现在需要在 main 页面访问 iframe 中的一些函数,用了这个包,就可以在业务里写出诸如:`await remote._.xxx(anyData)`这样的代码,像使用本地函数一样,使用远端的函数,提高代码可读性,减少格式代码。 |
![]() | 10 forty 281 天前 只能 1 对 1 ,没有广播方法?比如说,1 个调用端,N 个远端,调用端调用 1 次,由第 1 个注册了该接口的远端响应(有的远端未注册则自动忽略),或每个远端都响应,类似的逻辑。 |
![]() | 11 xiaoming1992 OP @forty 目前原则上是不欢迎广播的,只能指定一个 targetId 。但应该可以通过 hack 的方式,把 targetId 当成 groupId 来使用,在 onEmit 函数中针对 groupId 来做群发 这个库是比较底层的,你在业务上可以声明发送给哪个 id ,至于针对这个 id ,如何发送、实际发送给谁,是你自己在 onEmit 函数中自定义的,所以应该是可以实现的 但是,这样子没法处理群发后的响应,例如,你在业务上把 `1+1` 群发给 5 个远端,结果 3 个远端响应值为 `2`,另外 2 个远端抛错了,那业务上应该返回成功还是失败呢?不好处理。 |
![]() | 12 eWS2mq278TTzoj0O 276 天前 不知道我的理解对不对,和 RPC 异曲同工,和业务通信的模块只要有类似收发的模块,就可以自定义适配器,然后双方之间的调用方式从事件触发模式变成了调用本地方法模式,两端互相暴漏方法,那么另一方就能直接调用,主要提升了可维护性,不需要再通过双方各定义事件和处理逻辑,只需要写好自己的业务并暴漏即可。 |
![]() | 13 xiaoming1992 OP ![]() @HongXinss 完全对的,这个包相当于只是提供了一个“从事件触发模式变成了调用本地方法模式”的封装,让业务代码能更方便地通过“调用本地方法模式“调用对方的方法。 |
![]() | 14 eWS2mq278TTzoj0O 275 天前 @xiaoming1992 #13 感谢解惑 |