npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2025 – Pkg Stats / Ryan Hefner

@dao3fun/emitter

v1.0.0

Published

轻量级的、零依赖的事件总线,允许您在应用程序的不同部分之间进行解耦通信。

Readme

@dao3fun/emitter

轻量级的、零依赖的事件总线,允许您在应用程序的不同部分之间进行解耦通信。

安装

npm install @dao3fun/emitter

使用方法

导入

首先,从包中导入 Emitter 类:

import { Emitter } from "@dao3fun/emitter";

示例 1: 基本用法

下面是一个基本的使用示例,演示了如何注册监听器、触发事件和移除监听器。

// 定义一个类,它将监听事件
class MyListener {
  constructor() {
    // 注册一个名为 'my-event' 的事件监听器
    Emitter.register("my-event", this.onMyEvent, this);
    // 注册另一个名为 'data-loaded' 的事件监听器
    Emitter.register("data-loaded", this.onDataLoaded, this);
  }

  public onMyEvent(message: string): void {
    console.log(`MyListener 收到了 'my-event' 事件,消息是: ${message}`);
  }

  public onDataLoaded(data: { id: number; name: string }): void {
    console.log(`MyListener 收到了 'data-loaded' 事件,数据是:`, data);
  }

  public destroy(): void {
    // 在对象销毁时,移除所有相关的监听器以防止内存泄漏
    console.log("MyListener 正在移除监听器。");
    Emitter.remove("my-event", this);
    Emitter.remove("data-loaded", this);
  }
}

// 创建监听器实例
const listener = new MyListener();

// 触发事件
console.log("触发 'my-event'...");
Emitter.fire("my-event", "大家好!");

console.log("\n触发 'data-loaded'...");
Emitter.fire("data-loaded", { id: 1, name: "测试数据" });

// 销毁监听器实例并移除监听
console.log("\n销毁 listener...");
listener.destroy();

// 再次触发事件,监听器将不再响应
console.log("\n再次触发 'my-event'...");
Emitter.fire("my-event", "这次不会有输出了。");

示例 2: 多个监听器

同一个事件可以有多个监听器,它们会按照注册的顺序被调用。

class Logger {
  log(message: string) {
    console.log(`[Logger]: ${message}`);
  }
}

class Alerter {
  alert(message: string) {
    console.log(`[Alerter]: 准备弹窗显示 - ${message}`);
  }
}

const logger = new Logger();
const alerter = new Alerter();

// 为 'user-login' 事件注册两个不同的监听器
Emitter.register('user-login', logger.log, logger);
Emitter.register('user-login', alerter.alert, alerter);

// 当 'user-login' 事件被触发时,两个监听器都会响应
Emitter.fire('user-login', '用户 aoteman 已登录');
// 输出:
// [Logger]: 用户 aoteman 已登录
// [Alerter]: 准备弹窗显示 - 用户 aoteman 已登录

示例 3: 一次性监听器

有时你可能需要一个只响应一次的监听器。可以在回调函数内部调用 Emitter.remove 来实现这个效果。

class OneTimeListener {
  constructor() {
    Emitter.register('setup-complete', this.onSetupComplete, this);
  }

  onSetupComplete(config: object) {
    console.log('设置已完成,接收到配置:', config);
    console.log('此监听器将自动移除,不再响应未来的事件。');
    // 在回调内部移除监听
    Emitter.remove('setup-complete', this);
  }
}

const oneTime = new OneTimeListener();

Emitter.fire('setup-complete', { theme: 'dark', language: 'zh' });
// 输出:
// 设置已完成,接收到配置: { theme: 'dark', language: 'zh' }
// 此监听器将自动移除,不再响应未来的事件。

// 再次触发,将不会有任何输出
Emitter.fire('setup-complete', { theme: 'light', language: 'en' });

API

Emitter.register(name, callback, context)

注册一个事件监听器。

  • name: string: 事件名称。
  • callback: (...args: any[]) => void: 事件触发时执行的回调函数。
  • context: any: 回调函数的 this 上下文。

Emitter.fire(name, ...args)

触发一个事件,并向所有监听器传递参数。

  • name: string: 要触发的事件名称。
  • ...args: any[]: 传递给回调函数的可变参数。

Emitter.remove(name, context)

移除一个事件监听器。

  • name: string: 事件名称。
  • context: any: 要移除的监听器的上下文。必须与注册时提供的上下文相同。