发布订阅模式——分析mitt&tiny-emitter

1,112 阅读3分钟

背景

在前端开发中,我们经常会遇到需要在不同组件之间传递数据的情况。为了解决这个问题,我们可以使用发布订阅模式。发布订阅模式是一种消息传递机制,它通过一种事件系统来解耦发送者和接收者之间的关系。在本文中,我们将分析两个常用的发布订阅库——mitt和tiny-mitter的源码,并比较它们之间的差异。

mitt源码分析

mitt是一个小型的发布订阅库,它的代码非常简洁清晰。mitt使用了一个全局的Map对象来存储事件和对应的处理函数。当一个事件被触发时,mitt会遍历Map对象中对应事件的处理函数并执行。mitt还支持命名空间,可以方便地管理不同模块之间的事件。

代码分析:

以下是mitt的核心代码:

class Mitt {
  constructor() {
    this._events = Object.create(null);
  }

  on(type, handler) {
    (this._events[type] || (this._events[type] = [])).push(handler);
  }

  off(type, handler) {
    if (this._events[type]) {
      const index = this._events[type].indexOf(handler);
      if (index > -1) {
        this._events[type].splice(index, 1);
      }
    }
  }

  emit(type, ...args) {
    (this._events[type] || []).slice().forEach(handler => {
      handler(...args);
    });
  }
}

可以看到,Mitt类中有三个方法:on、off和emit。on方法用于注册事件,off方法用于取消注册,emit方法用于触发事件。Mitt类使用了一个_events对象来存储事件和对应的处理函数。当一个事件被触发时,emit方法会遍历_events对象中对应事件的处理函数并执行。

tiny-mitter源码分析

tiny-mitter是另一个小型的发布订阅库,它的代码也非常简洁。与mitt不同的是,tiny-mitter使用了一个数组来存储事件和对应的处理函数。当一个事件被触发时,tiny-mitter会遍历数组中对应事件的处理函数并执行。tiny-mitter还支持异步执行事件处理函数。

代码分析:

以下是tiny-mitter的核心代码:

class TinyEmitter {
  constructor() {
    this.events = {};
  }

  on(event, fn) {
    (this.events[event] || (this.events[event] = [])).push(fn);
    return this;
  }

  off(event, fn) {
    if (!this.events[event]) return this;
    const i = this.events[event].indexOf(fn);
    if (i > -1) this.events[event].splice(i, 1);
    return this;
  }

  emit(event, ...args) {
    const listeners = this.events[event];
    if (listeners) {
      listeners.forEach(listener => {
        setTimeout(() => listener.apply(this, args), 0);
      });
    }
    return this;
  }
}

可以看到,TinyEmitter类中有三个方法:on、off和emit。on方法用于注册事件,off方法用于取消注册,emit方法用于触发事件。TinyEmitter类使用了一个events对象来存储事件和对应的处理函数。当一个事件被触发时,emit方法会遍历events对象中对应事件的处理函数并执行。

两者比较

mitt和tiny-mitter都是非常小巧的发布订阅库,它们的代码都非常简洁清晰。两者最大的区别在于存储事件和对应处理函数的数据结构不同。mitt使用了一个Map对象来存储事件和对应处理函数,而tiny-mitter使用了一个数组来存储。此外,tiny-mitter还支持异步执行事件处理函数。

总结: 发布订阅模式是一种非常常用的消息传递机制。mitt和tiny-mitter都是非常小巧的发布订阅库,它们都非常适合在小型项目中使用。如果你需要更高级的功能,比如异步执行事件处理函数,那么你可以选择使用tiny-mitter。如果你只需要一个简单的发布订阅库,那么mitt就足够了。