Event-Driven Architecture Analysis¶
重要性:⭐⭐⭐ 目标读者:架构师 关联:analysis/architecture-history.md
1. 概览¶
本文档分析 Claude Code 的事件驱动架构。
5 主题: - 事件类型 - 事件流 - 订阅模式 - 实践 - 改进
2. 5 大事件类型¶
2.1 Hook 事件¶
PreToolUse | PostToolUse | SessionStart | SessionEnd
Notification | Stop | SubagentStop
UserPromptSubmit | PreCompact
9 种。
2.2 React 事件¶
UI 事件。
2.3 Stream 事件¶
type StreamEvent =
| { type: 'message_start' }
| { type: 'content_block_delta' }
| { type: 'message_stop' }
API 事件。
2.4 MCP 事件¶
MCP 事件。
2.5 Internal 事件¶
内部事件。
3. 事件流(5 阶段)¶
User 输入
↓ UserPromptSubmit event
Claude 处理
↓ content_block_delta events
Tool 调用
↓ PreToolUse event
↓ tool 执行
↓ PostToolUse event
Tool 结果
↓ content_block_delta
Stop
↓ Stop event
5 阶段。
4. 4 种订阅模式¶
4.1 Pub/Sub¶
// 简单 pub/sub
const eventBus = new EventTarget()
eventBus.addEventListener('tool:done', handler)
eventBus.dispatchEvent(new Event('tool:done'))
basic。
4.2 Observer¶
observer。
4.3 Promise/Async¶
promise。
4.4 Stream¶
stream。
5. Claude Code 的事件实现¶
5.1 Hook 系统¶
// 9 事件
type HookEventName = 'PreToolUse' | ...
// settings.json
{
"hooks": {
"PreToolUse": [
{ "matcher": "Bash", "hooks": [...] }
]
}
}
JSON 配置。
5.2 React + Ink 事件¶
useInput。
5.3 API Stream¶
const stream = await client.messages.create({ stream: true })
for await (const event of stream) {
// 5 种事件
}
5 事件。
5.4 MCP Progress¶
await server.notification({
method: 'notifications/progress',
params: { progressToken, progress, total }
})
progress。
5.5 zustand Store¶
zustand。
6. 5 个关键设计¶
6.1 Hook 解耦¶
decouple。
6.2 Stream 异步迭代¶
natural。
6.3 zustand 精确订阅¶
precise。
6.4 Event bus 全局¶
global。
6.5 Notification 协议¶
standard。
7. 5 个优点¶
7.1 解耦¶
decouple。
7.2 可扩展¶
extensible。
7.3 异步¶
async。
7.4 跨进程¶
cross。
7.5 类型安全¶
typed。
8. 5 个缺点¶
8.1 难调试¶
debug。
8.2 内存泄漏¶
leak。
8.3 顺序¶
order。
8.4 错误处理¶
error。
8.5 测试¶
test。
9. 5 个常见模式¶
9.1 Event Emitter¶
EE。
9.2 Promise 链¶
promise。
9.3 Async Iterator¶
iterator。
9.4 Subject (RxJS)¶
RxJS。
9.5 Emittery¶
// npm package
import Emittery from 'emittery'
const ee = new Emittery()
ee.on('event', handler)
await ee.emit('event', data)
emittery。
10. 5 个 Claude Code 模式¶
10.1 Hook 模式¶
config-driven。
10.2 useInput 模式¶
centralized。
10.3 Stream 模式¶
stream。
10.4 zustand 模式¶
state。
10.5 Notification 模式¶
push。
11. 5 个最佳实践¶
11.1 小事件¶
small。
11.2 类型化¶
typed。
11.3 命名¶
命名。
11.4 unsubscribe¶
cleanup。
11.5 错误隔离¶
isolated。
12. 5 个改进方向¶
12.1 统一事件总线¶
unified。
12.2 TypeScript discriminated union¶
type Event =
| { type: 'tool:start'; tool: string }
| { type: 'tool:done'; tool: string; result: any }
discriminated。
12.3 Event sourcing¶
sourcing。
12.4 Reactive stream¶
reactive。
12.5 Event bus + WebSocket¶
bus。
13. 5 个事件流案例¶
13.1 Tool 调用流¶
tool。
13.2 Session 启动流¶
session。
13.3 MCP 连接流¶
mcp。
13.4 Subagent 流¶
subagent。
13.5 Compact 流¶
compact。
14. 5 个 trade-off¶
5 维 trade-off。
15. 总结¶
Event-Driven Architecture = 5 事件类型 + 4 订阅模式。
核心: - 9 hook 事件 - 5 API stream 事件 - zustand 订阅 - MCP notifications - 5 模式
下一步: - 看 architecture-history.md - 统一事件总线 - 类型化