做了一个函数式、带类型、超顺手的微型事件库,已发布到 npm - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xiaolingxinna
V2EX    Node.js

做了一个函数式、带类型、超顺手的微型事件库,已发布到 npm

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

    github: https://github.com/Misaka-0x447f/createTypedEvent
    npm: https://www.npmjs.com/package/@misaka17535/create-typed-event

    相比其他事件库,首先是带类型,让用户能知道 payload 的类型;其次是函数式,不再需要手敲事件名。然后是 sub 函数自动返回 unsub 函数,不再必须传入 sub 时的 listener:

    const misakaStateChange = createTypedEvent<{ selfDestructionInProgress: boolean }>() // returns unsub function without defining handler outside const unsub = misakaStateChange.sub((payload) => console.log(payload)) misakaStateChange.dispatch({selfDestructionInProgress: true}) unsub() 

    >>> { selfDestructionInProgress: true }

    另外还自带 react hook ,完美桥接 react 响应式变量,如果你想你也可以轻松写出其他响应式框架的版本。

    是新包,但是已经在各种内部项目里用了两三年了,用过的同事都说好。

    第 1 条附言    127 天前
    我又去看了一圈,依然确认绝大多数库都需要你手写一个事件名才能订阅,就像 emitter.on('xxx'... 这种模式。如果采用这种模式,还想要自动补全事件名,那就得额外创建一层“事件总线”,做不到一个变量名一个事件。
    至于 rxjs ,那人家确实支持。但这意味着你要把那么大一个家伙塞进自己的代码仓库里诶?还要费心做 treeshaking ?
    13 条回复    2025-06-15 19:29:39 +08:00
    maocat
        1
    maocat  
       127 天前 via Android
    额,试试加个异步?
    xiaolingxinna
        2
    xiaolingxinna  
    OP
       127 天前
    @maocat 天然支持异步?
    xiaolingxinna
        3
    xiaolingxinna  
    OP
       127 天前
    咦,现在 V2EX 不支持附言了?刚刚写了一下相比其他库的优势:

    - rxjs
    - 面向对象:需要你创建一个 Observable/Subject 对象。
    - 包体积很大: [email protected] 本身就有 4.29MB ,而这个库只有 12.5KB (未来可能会更小)。
    - mitt
    - 需要你写事件名:`emitter.on('xxx'...`
    - 不返回取消订阅方法。
    - 不支持获取当前值。
    Luh
        4
    Lush  
       126 天前
    支持字符串事件名不是更通用吗,大部分需要发布订阅的场景都是为了解耦,如果一个事件一个变量不就又要 import ,模块之间又耦合了
    zthxxx
        5
    zthxxx  
       126 天前
    @xiaolingxinna 发包名字太长了影响传播,建议换个名字
    akirarika
        6
    akirarika  
       126 天前
    已 star~
    nzbin
        7
    nzbin  
       126 天前
    @xiaolingxinna RxJS 4M 那是 npm 包的体积,不是代码引入的大小,你应该看看 dist 目录里面的 esm 包,而且 RxJS 不只是做事件驱动,而是完整的异步解决方案
    3085570450tt
        8
    3085570450tt  
       126 天前
    nanoevents: https://github.com/ai/nanoevents, 都有你提到的功能,同时体积还比你小?
    xiaolingxinna
        9
    xiaolingxinna  
    OP
       121 天前
    @3085570450tt 一次创建一整个 emitter ,引入额外的复杂性;不返回 unbind 函数;
    xiaolingxinna
        10
    xiaolingxinna  
    OP
       121 天前
    @Lush 类型不友好,除非你写的时候就用 ts 规定好能传入哪些字符串,但这样又和一个事件一个变量的编码工作量没多大区别了。如果不在乎类型那大可以继续用 nodejs 的 event emitter.
    xiaolingxinna
        11
    xiaolingxinna  
    OP
       121 天前
    @nzbin 是,有点夸大宣传了。不过我又看了一眼,subject 好像没有一个函数即可 unsub 的功能?
    xiaolingxinna
        12
    xiaolingxinna  
    OP
       121 天前
    @akirarika 感谢,发布的时候没想到能引起一些讨论和认可,觉得可能就只是石沉大海自己用
    xiaolingxinna
        13
    xiaolingxinna  
    OP
       116 天前
    现在感觉还挺有信心的,起码 npm 下载量不都是机器人下载的
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2812 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 13:36 PVG 21:36 LAX 06:36 JFK 09:36
    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