V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xiaolingxinna
V2EX  ›  Node.js

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

  •  1
     
  •   xiaolingxinna · 1 天前 · 898 次点击

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

    - rxjs
    - 面向对象:需要你创建一个 Observable/Subject 对象。
    - 包体积很大: [email protected] 本身就有 4.29MB ,而这个库只有 12.5KB (未来可能会更小)。
    - mitt
    - 需要你写事件名:`emitter.on('xxx'...`
    - 不返回取消订阅方法。
    - 不支持获取当前值。
    Lush
        4
    Lush  
       1 天前
    支持字符串事件名不是更通用吗,大部分需要发布订阅的场景都是为了解耦,如果一个事件一个变量不就又要 import ,模块之间又耦合了
    zthxxx
        5
    zthxxx  
       1 天前
    @xiaolingxinna 发包名字太长了影响传播,建议换个名字
    akirarika
        6
    akirarika  
       1 天前
    已 star~
    nzbin
        7
    nzbin  
       1 天前
    @xiaolingxinna RxJS 4M 那是 npm 包的体积,不是代码引入的大小,你应该看看 dist 目录里面的 esm 包,而且 RxJS 不只是做事件驱动,而是完整的异步解决方案
    3085570450tt
        8
    3085570450tt  
       1 天前
    nanoevents: https://github.com/ai/nanoevents, 都有你提到的功能,同时体积还比你小?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2614 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 12:08 · PVG 20:08 · LAX 05:08 · JFK 08:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.