# 手撕EventBus源码 **Repository Path**: leeyamaster/eventbus-source ## Basic Information - **Project Name**: 手撕EventBus源码 - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-03-12 - **Last Updated**: 2026-03-12 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## mini EventBus 源码学习示例 这是一个**非常小巧**的 EventBus 实现,只有一个核心类 `EventBus`,非常适合用来学习“事件总线 / 发布订阅”的基础原理。 ### 目录结构 - `src/EventBus.js`:核心实现 - `examples/basic.js`:简单的使用示例 - `package.json`:npm 配置(方便你运行示例) ### 快速使用 1. 在项目根目录执行: ```bash npm install ``` > 这个项目本身没有额外依赖,上面的命令只是让 `npm` 记录一下依赖信息,你也可以直接用 `node` 运行示例。 2. 运行示例: ```bash npm test ``` 或者直接: ```bash node examples/basic.js ``` ### EventBus 的核心设计 核心思想只有三点: - **用一个 Map 保存“事件名 => 监听器数组”** - **监听器其实就是函数(handler),再加上一个 `once` 标记** - **`emit` 时把对应事件的所有 handler 依次调用** 你可以直接阅读 `src/EventBus.js`,里面的注释会从以下几个维度帮助你理解: - **数据结构设计**:为什么用 `Map` - **API 行为**: - `on(event, handler)`:订阅 - `once(event, handler)`:只执行一次的订阅 - `off(event, handler?)`:取消订阅 - `emit(event, ...args)`:触发事件 - `listenerCount(event)`:调试用,方便看当前有多少监听器 - **边界情况处理**: - 在回调内部调用 `off` 时不会影响当前的遍历 - `once` 回调在第一次执行后会被自动移除 ### 建议的阅读顺序 1. 先跑一遍 `examples/basic.js`,看看输出 2. 打开 `src/EventBus.js`,从上到下读一遍: - 先理解构造函数中的 `_listeners` 是什么 - 再看 `on / once / off / emit` 各自如何读写 `_listeners` 3. 尝试自己扩展功能,例如: - 增加 `offAll()`:清空所有事件 - 增加 `onAny(handler)`:监听所有事件 - 增加异步事件队列(`emitAsync`) 如果你愿意,我也可以在这个基础上帮你一步步升级成一个更接近生产可用的 EventBus。