源码共读 mitt、tiny-emitter 发布订阅

94 阅读2分钟

我正在参与掘金会员专属活动-源码共读第一期,点击参与

前言

从易到难开始学习源码。学习源码不是为了面试,只是想揭开别人造的轮子背后的神秘面纱。同时也希望在此过程中提升自己的能力和开拓视野。

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语法。关于发布订阅模式其实是一种一对多的关系,多个对象(订阅者)同时监听一个对象(发布者)的数据状态变化,当发布者变化的时候,会通知所有的订阅者。