Vue自定义事件高效分发依赖“轻量注册+精准遍历”:events对象按需创建键,$emit同步执行回调且不序列化参数;多次emit会累积查找与遍历开销,emits选项仅开发时校验,不影响运行时性能。

事件监听器存在哪儿?
每个 Vue 组件实例内部维护一个 events 对象,结构类似:{ "click": [fn1, fn2], "change": [fn3] }
键是事件名,值是回调函数数组。没有监听器时,对应 key 甚至不会被创建——不占内存,也不参与查找。
$emit 怎么做到“快”?
调用 this.$emit('change', value) 时,Vue 做三件事:
- 直接查
this.events['change']</li> <li>若数组存在,按顺序 <strong>同步执行每一个回调</strong>(不是异步队列,不进 event loop)</li> <li>参数以原样传递(对象传引用,基本类型传值),不做序列化或拷贝</li> </ul> <h3>为什么多次 $emit 反而拖慢性能?</h3> <p>每次 <code>$emit
都是一次独立查找 + 遍历操作。哪怕某个事件没人监听,Vue 仍要:- 检查
this.events[eventName]是否存在 - 确认数组长度(哪怕为 0)
- 进入循环体再退出
高频场景下(如输入框每敲一个键触发两个
$emit),这部分开销会叠加——不是单次明显,而是成百上千次累积可见。
vue-component-analyzer下载递归分析 Vue 项目组件依赖,从入口文件生成组件层级图,支持 Vue 2/3,输出组件名、文件路径和属性。适用于分析组件结构、排查依赖或了解项目架构。
Vue 3 的 emits 选项影响分发吗?
不影响运行时性能。
emits: ['change', 'focus']仅在开发模式下做校验和警告,编译后不参与事件分发逻辑。无论是否声明,$emit('xxx')都照常执行、照常遍历监听器。 - 检查

















