Calendarとしてはちょっとマニアックだったので、没になった方もアップします。ブログエントリの大掃除中です。Node.jsを使うならEventEmitterを知っとくべし、という記事とかありますが、EventEmitter使ってるといくつか疑問に当たりますよね。EventEmitterおさらいEventEmitterの基本的な機能をおさらいしておくと、EventEmitterというのは、イベントという単位で処理を行えるようにするためのモジュールで、イベントの受発信を行うことで非同期プログラミングを行いやすくするもの。emitでイベントを発行onで発行したイベントを受信removeListenerでイベントを消すことができるonceで一回だけイベントを受信することができるで、こんな感じで使いますよね。onceに対してemitする。onceだと2回emitしても受信されない。shown.");EventEmitterでよくある質問んで、EventEmitterでよくある質問としては、イベントを追加する時はonなのにイベントを除去するときはなんでoffじゃなくてremoveListenerなの?イベントにワイルドカード使えないの?これらの質問は僕もよくNode.jsの初心者から受けます。機能を追加する件に関して質問に回答すると、「現時点ではeventsのAPIはfreezeされてるので、Node.jsとしてはよっぽどの理由がない限り作る予定はない。removeListenerのaliasとしてoffを最初から追加しなかった理由は分かりませんが、そこまでcallしないと思われてたんじゃないかなと思います。ワイルドカードもコアモジュールがはじめから用意するほど必要かと言われると疑問があります。これらの要望が存在することも確か。offやワイルドカードを使いたかったらEventEmitter2を使いましょう。EventEmitter2の特徴offでremoveListenerできるワイルドカード対応ネームスペースでフィルタすることができる。onceで1回だけ受信、manyを指定すると回数がn回と指定できるBrowserでも使える。(bower対応してる)EventEmitterよりも性能が良いAPIとしては、こんな感じですかね。EventEmitter2でwildcard使うならオプションをtrueにする。wildcardを使える。*で全部のイベントを受信するものも作れる。これとおなじものはonAnyでも作れる。ちなみにEventEmitterと互換性があるのでremoveListenerでも消せる。onceに対してemitする。onceだと2回emitしても受信されない。manyに対してemitする。emitの時にもwildcardが使える。この場合、name.*とname.wildcardの2つが発火する。*");EventEmitter2注意点んで、ここでEventEmitter2を継承して使う時の注意点なんですが、EventEmitter2はコンストラクタでwildcardオプションやnamespaceのdelimiterをオプションとして取りうるので、以下のようにしておく必要があります。ここだけ通常のEventEmitterとは違うので注意。optsを指定できるようにする必要がある。EventEmitter);browserで使えるEventEmitter2の特徴としてbrowserでも使えるように拡張している点が挙げられます。amdが定義されていたらEventEmitterを定義する。Node.jsとかCommonJSでloadできるようにする。Browserのグローバル変数であるwindowに定義する。}という感じにBrowserでも利用できるようになっています。取ってくるときもbower対応しているので、以下の要領で取ってこれるかと。eventemitter2EventEmitterよりも性能が良いEventEmitterよりも性能が良いとされています、実際に自分の環境で10万ループ位回してDate.nowで検証してもそこまで有意差はありませんでした。EventEmitter2のbenchmarkスクリプトを使った時は以下の様な結果になりました。EventEmitter2なんと、EventEmitter2の方が6倍程度高速という結果になりました。ソースコードの中を読むと分かりますが、そこまで特別な事をしている訳ではなく、割りと愚直に関数呼び出しを減らしたりとチューニングが施されてます。realtime好きエンジニア、socket.ioのコミッタとしても有名な3rd-Eden作成のEventEmitter3というさらにチューニングされたものがありました。そのベンチを回すと、EventEmitter3はよりチューニングされていて、EventEmitter2よりももう少しだけ早いです。メソッドコールした時には有意差が出ますがその時の有意差は通常のアプリケーションにおいてはそこまでの差は出ません。通常のEventEmitterの方が使われているので変なバグを踏む可能性は低いですし、色んな配慮がされています。EventEmitter2やEventEmitter3の方がOSSとしてコミットしやすく、Nodeのコアモジュールとは分離されているので何かの問題があった時にリリースサイクルが早くなる可能性がある、とは思います。利点や不利点を踏まえて使いましょう。言えることは、offやワイルドカードを使いたいならEventEmitter2、EventEmitterの速度がシビアに求められる状況ならEventEmitter3を使うといいと思います。利用するならコアモジュールのEventEmitterと比較して安定していない可能性があることも考慮して使いましょう。1.0がリリースアウトされました。(2)リンクヘルプはてなブログお知らせはてなブログをはじめよう!yosuke_furukawaさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。