自荐一个 js 通信的包 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a Javascript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
Javascript 权威指南第 5 版
Closure: The Definitive Guide
xiaoming1992
V2EX    Javascript

自荐一个 js 通信的包

  •  
  •   xiaoming1992 293 天前 2479 次点击
    这是一个创建于 293 天前的主题,其中的信息可能已经有所发展或是发生改变。

    缘起

    我的工作内容有写网页游戏,游戏涉及到前后端通信,没找到顺手的通信包,所以手写了一个通用的 js 通信包remote

    feature

    • 本地可以是浏览器、服务器,甚至一些受限的 js 子集
    • 远端可以是任何终端,如 iframe / Java 服务器 等
      • 只要远端能跟 js 通信,就能使用该包
    • 对远端响应的数据格式也不严格限制(可以集中解析)
    • 已在公司游戏前后端通信中应用,极大地降低了通信成本(简化调用)
    • ts 类型严格

    调用示意

     // 远端 remote.register('something', async (params: Whatever) => { return WhatYouWant }) // 本地 // res === WhatYouWant const res = await remote._.something(xxx) 

    与 rpc 相比的优势

    • 不局限于与服务端的通信,无论对方是任何端,只要能与 js 通信,就能使用该包;
    • 相互通信,不存在“主从”的概念,通信双方是平等的;
    • 类型严格;
    • 包较底层,对项目整体的侵入较小,几乎不限制对方的响应的数据格式(因为可以自由解析对方的响应,即自由 emit );

    协议

    由于通信双方是平等的,所以 B 调用 A 的流程也是一样的

    protocol.png

    更多信息

    详见 @zimi/remote/README.md

    14 条回复    2025-01-09 08:44:26 +08:00
    humbass
        1
    humbass  
       293 天前
    看了下不知道怎么用
    xiaoming1992
        2
    xiaoming1992  
    OP
       293 天前
    @humbass 在这边写使用方法的话内容太多了,估计没人会看完,所以只能简单介绍一下。

    使用方法见 [README.md]( https://github.com/xiaomingTang/xiaoming/blob/master/%40zimi/remote/README.md)
    codehz
        3
    codehz  
       292 天前
    感觉 js 间 rpc api 用起来不如 comlink 方便哈哈(
    不过要自定义通道还有 jack works 的 async-call-rpc
    这些库的优点是注册方法不需要一个个去注册,直接提供一个对象就可以了
    xiaoming1992
        4
    xiaoming1992  
    OP
       292 天前 via Android
    @codehz 我去,跟我写的 remoteValue 好像。我知识面不够广,不知道有这么个东西。。。

    不过我的包不限于 webworker ,只要对方能与 js 通信,就能用这个包,简便地调用远端的函数,使用远端的值。
    Leon6868
        5
    Leon6868  
       292 天前
    支持异步流式回复吗?
    Leon6868
        6
    Leon6868  
       292 天前
    很神奇,正好在昨天我用 Gemini 搓了一个用途几乎一样的库,用于前端页面通信
    xiaoming1992
        7
    xiaoming1992  
    OP
       292 天前 via Android
    @Leon6868
    #5 我会封装调用者的原始数据,所以大概应该不支持流式吧。
    #6 叫什么名字?我学习学习
    zangbianxuegu
        8
    zangbianxuegu  
       291 天前
    没太明白,降低通信成本主要是指什么?对于普通的浏览器-服务端 http 通信
    xiaoming1992
        9
    xiaoming1992  
    OP
       291 天前 via Android   1
    @zangbianxuegu 普通的浏览器-服务端通信,倒降低不了什么成本,因为浏览器和服务器的通信,一般是单向的,且频率较低,所以成本本来就不高。

    这个包的应用场合是,比如你有 main 页面和 iframe 页面,现在需要在 main 页面访问 iframe 中的一些函数,用了这个包,就可以在业务里写出诸如:`await remote._.xxx(anyData)`这样的代码,像使用本地函数一样,使用远端的函数,提高代码可读性,减少格式代码。
    forty
        10
    forty  
       281 天前
    只能 1 对 1 ,没有广播方法?比如说,1 个调用端,N 个远端,调用端调用 1 次,由第 1 个注册了该接口的远端响应(有的远端未注册则自动忽略),或每个远端都响应,类似的逻辑。
    xiaoming1992
        11
    xiaoming1992  
    OP
       281 天前
    @forty 目前原则上是不欢迎广播的,只能指定一个 targetId 。但应该可以通过 hack 的方式,把 targetId 当成 groupId 来使用,在 onEmit 函数中针对 groupId 来做群发

    这个库是比较底层的,你在业务上可以声明发送给哪个 id ,至于针对这个 id ,如何发送、实际发送给谁,是你自己在 onEmit 函数中自定义的,所以应该是可以实现的

    但是,这样子没法处理群发后的响应,例如,你在业务上把 `1+1` 群发给 5 个远端,结果 3 个远端响应值为 `2`,另外 2 个远端抛错了,那业务上应该返回成功还是失败呢?不好处理。
    eWS2mq278TTzoj0O
        12
    eWS2mq278TTzoj0O  
       276 天前
    不知道我的理解对不对,和 RPC 异曲同工,和业务通信的模块只要有类似收发的模块,就可以自定义适配器,然后双方之间的调用方式从事件触发模式变成了调用本地方法模式,两端互相暴漏方法,那么另一方就能直接调用,主要提升了可维护性,不需要再通过双方各定义事件和处理逻辑,只需要写好自己的业务并暴漏即可。
    xiaoming1992
        13
    xiaoming1992  
    OP
       275 天前   1
    @HongXinss 完全对的,这个包相当于只是提供了一个“从事件触发模式变成了调用本地方法模式”的封装,让业务代码能更方便地通过“调用本地方法模式“调用对方的方法。
    eWS2mq278TTzoj0O
        14
    eWS2mq278TTzoj0O  
       275 天前
    @xiaoming1992 #13 感谢解惑
    关于     帮助文档     自助推广系统     博客     API     FAQ         6137 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 02:25 PVG 10:25 LAX 19:25 JFK 22:25
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86