Skip to content

Kokoro-js/Eventure

Repository files navigation

Eventure

Eventure:一个现代的事件库,提供丰富的监听器添加方式与触发机制,优化微任务调度性能,看看 性能测试。你可以在 tests 中查看详细用法示例,包括不限于 waitFor / 触发端控制中断 / 监听端控制中断 / 带前置条件once/many 移除监听器。

NPM 版本 测试状态

🚀 快速开始

📥 安装

# 使用 bun
bun install eventure

# 或使用 npm/yarn/pnpm
npm install eventure
yarn add eventure
pnpm i eventure

🚀 性能测试

Eventure vs EventEmitter3 vs EventEmitter2 vs mitt (每次测轮跑 ×10⁵ 次)
该测试可复现,请查看 tinybench,考虑到小于 5% 的误差在实际应用中完全可以忽略, 我们并不想夸大性能优势,Eventure 的目的是保证功能正确的同时保持第一梯队的性能,EE3 缺乏功能,EE2 混乱且难维护,这便是 Eventure 存在的意义。
关于性能主要来源(例如:不可变快照语义避免每次 emit 的 slice()、降低 GC 压力的策略等),见 PERFORMANCE.md

# Task name Throughput avg (×10⁵ ops/s) Throughput med (×10⁵ ops/s) Latency avg (ns) Latency med (ns) Samples
0 Eventure — pure sync 541 ± 2.47% 564 ± 20 19.14 ± 5.85% 17.73 ± 0.061 105
1 EventEmitter3 — pure sync 448 ± 2.85% 466 ± 14 23.12 ± 5.84% 21.46 ± 0.061 87
2 EventEmitter2 — pure sync 416 ± 4.68% 447 ± 46 25.74 ± 7.84% 22.39 ± 0.218 78
3 mitt — pure sync 249 ± 3.42% 244 ± 22 40.83 ± 3.83% 40.97 ± 0.368 50
# Task name Throughput avg (×10⁵ ops/s) Throughput med (×10⁵ ops/s) Latency avg (ns) Latency med (ns) Samples
0 Eventure — async end-to-end 35 ± 9.43% 37 ± 3 292.66 ± 10.05% 273.38 ± 2.060 10
1 EventEmitter3 — async end-to-end 33 ± 9.84% 35 ± 3 306.00 ± 10.63% 282.48 ± 2.320 10
2 EventEmitter2 — async end-to-end 35 ± 9.77% 35 ± 4 294.56 ± 10.17% 288.25 ± 2.905 10
3 mitt — async end-to-end 27 ± 6.63% 27 ± 2 376.48 ± 7.00% 368.45 ± 2.496 10

🧪 示例用法

import { Eventure } from "eventure"

interface MyEvents {
  foo: [string];                         // 等价于 (arg1: string) => void
  bar: [number, number];                // (arg1: number, arg2: number) => void
  test: (a: number, b: number) => number
  numEvent: (value: number, next: (value: number) => number) => number;
}

const emitter = new Eventure<MyEvents>()

emitter.on("foo", (message) => {
  console.log(message)
})

emitter.emit("foo", "你好,世界")

更多用法请查看: tests/

🔧 进阶

  • onAt(event, { at, signal? }, listener):按指定位置插入监听器(at 可为 number 或 (ctx) => number
  • emitAll(event, ...args):并发执行所有监听器,任一抛错/拒绝/返回 Error 会 reject(行为类似 Promise.all
  • emitSettled(event, ...args):返回 { fn, status, value|reason }[],永不 throw(行为类似 Promise.allSettled
  • listenersUnsafe(event):返回内部监听器数组引用(零拷贝,不要 mutate;仅用于高级/性能场景)

🤝 贡献指南

欢迎任何形式的贡献!如果你有改进建议或发现了问题,请提交 Pull Request 🙌。

About

现代的 javascript 事件库,支持 hook (next 样式)

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors