我的工作内容有写网页游戏,游戏涉及到前后端通信,没找到顺手的通信包,所以手写了一个通用的 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 30 天前
看了下不知道怎么用
|
2
xiaoming1992 OP @humbass 在这边写使用方法的话内容太多了,估计没人会看完,所以只能简单介绍一下。
使用方法见 [README.md]( https://github.com/xiaomingTang/xiaoming/blob/master/%40zimi/remote/README.md) |
3
codehz 30 天前
感觉 js 间 rpc api 用起来不如 comlink 方便哈哈(
不过要自定义通道还有 jack works 的 async-call-rpc 这些库的优点是注册方法不需要一个个去注册,直接提供一个对象就可以了 |
4
xiaoming1992 OP @codehz 我去,跟我写的 remoteValue 好像。我知识面不够广,不知道有这么个东西。。。
不过我的包不限于 webworker ,只要对方能与 js 通信,就能用这个包,简便地调用远端的函数,使用远端的值。 |
5
Leon6868 29 天前
支持异步流式回复吗?
|
6
Leon6868 29 天前
很神奇,正好在昨天我用 Gemini 搓了一个用途几乎一样的库,用于前端页面通信
|
7
xiaoming1992 OP |
8
zangbianxuegu 29 天前
没太明白,降低通信成本主要是指什么?对于普通的浏览器-服务端 http 通信
|
9
xiaoming1992 OP @zangbianxuegu 普通的浏览器-服务端通信,倒降低不了什么成本,因为浏览器和服务器的通信,一般是单向的,且频率较低,所以成本本来就不高。
这个包的应用场合是,比如你有 main 页面和 iframe 页面,现在需要在 main 页面访问 iframe 中的一些函数,用了这个包,就可以在业务里写出诸如:`await remote._.xxx(anyData)`这样的代码,像使用本地函数一样,使用远端的函数,提高代码可读性,减少格式代码。 |
10
forty 19 天前
只能 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
HongXinss 14 天前
不知道我的理解对不对,和 RPC 异曲同工,和业务通信的模块只要有类似收发的模块,就可以自定义适配器,然后双方之间的调用方式从事件触发模式变成了调用本地方法模式,两端互相暴漏方法,那么另一方就能直接调用,主要提升了可维护性,不需要再通过双方各定义事件和处理逻辑,只需要写好自己的业务并暴漏即可。
|
13
xiaoming1992 OP @HongXinss 完全对的,这个包相当于只是提供了一个“从事件触发模式变成了调用本地方法模式”的封装,让业务代码能更方便地通过“调用本地方法模式“调用对方的方法。
|
14
HongXinss 12 天前
@xiaoming1992 #13 感谢解惑
|