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

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

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

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

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