Node.js Events モジュール

Java FileNode.js 組み込みモジュール


Node.js はイベント駆動型の JavaScript ランタイム環境であり、eventsevents モジュールは Node.js がイベント駆動アーキテクチャを実現する中核です。開発者はカスタムイベントを作成・発火・監視でき、疎結合なコード構造を実現できます。

簡単に言うと、eventsevents モジュールは、異なる部分(オブジェクト)が互いに直接メソッドを呼び出さずに通信できる仕組みを提供します。


コアコンセプト

EventEmitter クラス

eventsこのモジュールの核となるのはEventEmitterEventEmitter クラスであり、イベントを発生させることができるほぼすべての Node.js オブジェクトはこのクラスから継承されています。

例

const EventEmitter = require('events');

基本的な使い方

1. EventEmitter インスタンスを作成

const myEmitter = new EventEmitter();

2. イベントを発火する

myEmitter.emit('event');
3. イベントを監視する
myEmitter.on('event', () => {
  console.log('イベントが発火しました!');
});

よく使うメソッドの詳細説明

on(eventName, listener)

指定したイベントのリスナー配列の末尾にリスナーを追加します。

例

myEmitter.on('greet', (name) => {
  console.log(`Hello, ${name}!`);
});

myEmitter.emit('greet', 'Alice'); // 出力: Hello, Alice!

once(eventName, listener)

一度だけ発火する単発リスナーを追加します。

例

myEmitter.once('welcome', () => {
  console.log('初めての訪問へようこそ!');
});

myEmitter.emit('welcome'); // 出力: 初めての訪問へようこそ!
myEmitter.emit('welcome'); // 出力されない

emit(eventName[, ...args])

指定したイベントに登録された各リスナーを同期呼び出しし、登録順に実行します。

例

myEmitter.on('sum', (a, b) => {
  console.log(a + b);
});

myEmitter.emit('sum', 2, 3); // 出力: 5

removeListener(eventName, listener)

指定したイベントのリスナー配列から1つのリスナーを削除します。

例

const callback = () => console.log('イベント発火');
myEmitter.on('event', callback);
myEmitter.removeListener('event', callback);

removeAllListeners([eventName])

すべてのリスナー、または指定したイベントのすべてのリスナーを削除します。

例

myEmitter.removeAllListeners('event');

高度な機能

エラー処理

EventEmitter インスタンスは 'error' イベントを特別に処理します。'error' イベントにリスナーが登録されていない場合、'error' イベントが発火するとエラーがスローされ、Node.js プロセスが終了します。

例

myEmitter.on('error', (err) => {
  console.error('エラーが発生:', err.message);
});

myEmitter.emit('error', new Error('エラーが発生しました!'));

リスナー情報の取得

例

// 指定したイベントのリスナー数を取得
myEmitter.listenerCount('event');

// 指定したイベントのリスナー配列を取得
myEmitter.listeners('event');

最大リスナー数の設定

デフォルトでは、各イベントには最大10個のリスナーを登録でき、それを超えると警告が発せられます。

例

myEmitter.setMaxListeners(20); // 20に設定

実際の応用例

カスタムイベントクラスの作成

例

const EventEmitter = require('events');

class MyClass extends EventEmitter {
  constructor() {
    super();
    this.value = 0;
  }
 
  increment() {
    this.value++;
    this.emit('incremented', this.value);
  }
}

const myInstance = new MyClass();
myInstance.on('incremented', (value) => {
  console.log('値が増加:', value);
});

myInstance.increment(); // 出力: 値が増加: 1
myInstance.increment(); // 出力: 値が増加: 2

シンプルなイベントバスの実装

例

const EventEmitter = require('events');

class EventBus extends EventEmitter {}
const bus = new EventBus();

// コンポーネントA
bus.on('message', (msg) => {
  console.log('コンポーネントAが受信:', msg);
});

// コンポーネントB
bus.emit('message', 'Hello from B');

ベストプラクティス

  1. 命名規則:イベント名は小キャメルケース(camelCase)またはハイフン区切り(kebab-case)を使用すべきです。
  2. メモリリークの回避:不要になったリスナーはすぐに削除します
  3. エラー処理:常に 'error' イベントにリスナーを追加します
  4. 適度に使用する:イベントを使いすぎないようにしましょう。単純な関数呼び出しの方が直接的で効果的な場合があります。

まとめ

Node.js のeventsevents モジュールはイベント駆動プログラミングの基礎であり、EventEmitterEventEmitter クラスを通じて、カスタムイベントを簡単に作成・管理できます。このモジュールを習得することは、効率的で疎結合な Node.js アプリケーションの開発に不可欠です。単純な通知メカニズムから複雑なアプリケーションアーキテクチャまで、eventsevents モジュールは強力なサポートを提供します。

Java FileNode.js 組み込みモジュール

その他の拡張