Hook 编程到底解决什么问题
Hook 编程的本质是在既有流程的关键节点插入可复用逻辑,而不是重写整个流程。它把“某件事发生时顺便做什么”从业务代码里抽出来,形成独立单元。
在前端场景中,它常表现为状态逻辑复用;在通用开发中,它更像轻量级扩展点:请求前后、生命周期节点、事件回调。共同点是不改调用方结构,只增强行为。
常见类型与使用边界
状态型 Hook
把状态与更新逻辑打包,调用方只关心输入输出。优点是组合方便,风险是层级过深后数据流难追踪。
副作用型 Hook
负责订阅、定时器、请求等外部交互。关键是清理逻辑必须与注册逻辑成对出现,否则容易泄漏。
拦截型 Hook
在函数执行前后插入校验、日志或转换。适合横切关注点,但不宜承载核心业务判断,避免逻辑分散。
设计 Hook 的四个要点
- 单一职责:一个 Hook 只做一件事,命名直接体现能力。
- 显式依赖:把依赖作为参数传入,减少隐式全局状态。
- 可预测返回:返回值结构稳定,避免调用方猜测。
- 可测试:把纯逻辑与副作用分离,纯逻辑优先单测覆盖。
落地建议
先识别重复出现的逻辑片段,再抽象为 Hook,而不是提前设计。封装后保留逃生通道,允许调用方覆盖默认行为。对副作用型 Hook,统一约定清理时机;对拦截型 Hook,控制注册顺序并记录执行链。
Hook 编程的价值不在“用了 Hook”,而在让复用变得可控。克制封装粒度,明确依赖与清理责任,才能真正降低维护成本。