我正在参与掘金会员专属活动-源码共读第一期,点击参与
前言
从易到难开始学习源码。学习源码不是为了面试,只是想揭开别人造的轮子背后的神秘面纱。同时也希望在此过程中提升自己的能力和开拓视野。
Mitt 一个事件发布订阅库
mitt 是一个足够小(200bytes)的发布订阅库,支持全部事件的监听和批量移除,支持 IE9+ 以上的浏览器。
安装
npm install mitt
或
pnpm install mitt
使用
创建一个操作事件发布的文件 utils/mitt.js,这里我们直接导入 mitt,并获取实例化对象。
import mitt from 'mitt';
export const emitter = mitt();
// 订阅
export function emitterOnFoo() {
emitter.on("foo", (e) => console.log("foo", e));
}
// 发布
export function emitterEmitFoo() {
emitter.emit("foo", { a: "b" });
}
在我们的项目最好是将 mitt 调用一次,千万不要调用多次(特殊情况除外)。如果对象emitterA订阅了事件 foo,必须使用对象emitterA发布 foo 事件,如果是其他事件对象发布的话,会导致之前订阅的函数,不会收到消息。
总结
- on:订阅
- emit: 发布
- off: 移除订阅,在移除订阅时需要传入事件名称和回调函数
- clear:移除所有订阅(
emitter.all.clear())
最后说一下关于 mitt 的原理,就是在我们每次订阅的时候将订阅的事件名称和回调函数存储起来,然后在发布的时候找到对应的事件名称,然后执行其回调函数。
tiny-emitter
安装
npm install tiny-emitter
或
pnpm install tiny-emitter
使用
创建一个操作事件发布的文件 utils/tiny-emitter.js
const Emitter = require('tiny-emitter');
const emitter = new Emitter();
emitter.on('some-event', function (arg1, arg2, arg3) {
//
});
emitter.emit('some-event', 'arg1 value', 'arg2 value', 'arg3 value');
tiny-emitter在使用上与 mitt 稍稍有些语法上不同,其他都是一样
总结
- on:订阅事件
- once:订阅一次事件(在第一次触发事件成功之后会移除订阅)
- emit: 发布事件
- off: 移除订阅,在移除订阅时需要传入事件名称和回调函数
最后
mitt 和 tiny-emitter 两者都是发布订阅模式,mitt源码使用typeScript语法,tiny-emitter使用的JavaScript语法。关于发布订阅模式其实是一种一对多的关系,多个对象(订阅者)同时监听一个对象(发布者)的数据状态变化,当发布者变化的时候,会通知所有的订阅者。