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 maocat 127 天前 via Android 额,试试加个异步? |
![]() | 2 xiaolingxinna OP @maocat 天然支持异步? |
![]() | 3 xiaolingxinna OP 咦,现在 V2EX 不支持附言了?刚刚写了一下相比其他库的优势: - rxjs - 面向对象:需要你创建一个 Observable/Subject 对象。 - 包体积很大: [email protected] 本身就有 4.29MB ,而这个库只有 12.5KB (未来可能会更小)。 - mitt - 需要你写事件名:`emitter.on('xxx'...` - 不返回取消订阅方法。 - 不支持获取当前值。 |
4 Lush 126 天前 支持字符串事件名不是更通用吗,大部分需要发布订阅的场景都是为了解耦,如果一个事件一个变量不就又要 import ,模块之间又耦合了 |
![]() | 5 zthxxx 126 天前 @xiaolingxinna 发包名字太长了影响传播,建议换个名字 |
![]() | 6 akirarika 126 天前 已 star~ |
![]() | 7 nzbin 126 天前 @xiaolingxinna RxJS 4M 那是 npm 包的体积,不是代码引入的大小,你应该看看 dist 目录里面的 esm 包,而且 RxJS 不只是做事件驱动,而是完整的异步解决方案 |
![]() | 8 3085570450tt 126 天前 nanoevents: https://github.com/ai/nanoevents, 都有你提到的功能,同时体积还比你小? |
![]() | 9 xiaolingxinna OP @3085570450tt 一次创建一整个 emitter ,引入额外的复杂性;不返回 unbind 函数; |
![]() | 10 xiaolingxinna OP @Lush 类型不友好,除非你写的时候就用 ts 规定好能传入哪些字符串,但这样又和一个事件一个变量的编码工作量没多大区别了。如果不在乎类型那大可以继续用 nodejs 的 event emitter. |
![]() | 11 xiaolingxinna OP @nzbin 是,有点夸大宣传了。不过我又看了一眼,subject 好像没有一个函数即可 unsub 的功能? |
![]() | 12 xiaolingxinna OP @akirarika 感谢,发布的时候没想到能引起一些讨论和认可,觉得可能就只是石沉大海自己用 |
![]() | 13 xiaolingxinna OP 现在感觉还挺有信心的,起码 npm 下载量不都是机器人下载的 |