JS と Nodejs におけるイベント駆動型開発についての簡単な説明

JS と Nodejs におけるイベント駆動型開発についての簡単な説明

イベント駆動型とパブリッシュ・サブスクライブ型

イベント駆動型アーキテクチャは、パブリッシュ/サブスクライブ パターンまたはオブザーバー パターンと呼ばれるソフトウェア開発の一般的なパターンに基づいて構築されます。

イベント駆動型アーキテクチャには、主体と観察者という少なくとも 2 つの参加者が存在します。

被験者は FM ラジオのように動作し、被験者の発言を聞きたい視聴者に放送します。

観察者が 1 人しかいなくても 100 人いても、対象者が放送するメッセージがある限り、それは問題ではありません。

イベント駆動型、パブリッシュ/サブスクライブ型、およびオブザーバー パターンは実際には同じではありませんが、理想的には同じアプローチを使用します。つまり、1 つのエンティティがメッセージをブロードキャストし、他のエンティティがそれをリッスンします。

パブリッシュ/サブスクライブパターンは私と同じくらい古いものです。 1987 年頃から理論化が始まり、オブザーバー パターンは 1994 年に「Gang of Four」によって書かれた「Design Patterns」という本に登場しました。

ブラウザの JavaScript ではイベント駆動型プログラミングはどのように使用されますか?

エンジンの助けを借りて、JavaScript をブラウザで実行できます。

最も人気のある JavaScript エンジンは、Google Chrome と Node.js で使用される V8、Firefox で使用される SpiderMonkey、Safari/WebKit で使用される JavaScriptCore です。

豊富な環境に基づいて、JavaScript エンジンは言語を強化し、イベント駆動型の JavaScript プラットフォームも提供します。

実際、ブラウザ内の JavaScript は、イベント エミッター、つまりイベントを送信できるオブジェクトである HTML 要素と対話できます。

次の簡単な例、ボタン付きの HTML ドキュメントを考えてみましょう。

<!DOCTYPE html>
<html lang="ja">
<ヘッド>
    <メタ文字セット="UTF-8">
    <title>JavaScript における「イベント駆動型」とはどういう意味ですか?</title>
</head>
<本文>
<div>
    <button id="subscribe">購読</button>
</div>
</本文>
</html>

JavaScript がなければ、ボタンは機能しません。現在、HTML ボタンは HTMLButtonElement タイプの要素であり、すべての HTML 要素と同様に、すべての HTML 要素の共通の祖先である EventTarget に接続されています。

ブラウザのイベント ターゲットは、イベントを発行できるオブジェクトです。つまり、オブザーバー パターンのサブジェクトです。

ちょっとわかりにくいですか?覚えておいてください: テーマは FM ラジオなので、HTML 要素はすべてラジオ局のように動作します。

すぐに観察者が誰であるかがわかります。

ブラウザにおける主体と観察者

HTML 要素が主体である場合、観察者は誰でしょうか?リスナーとして登録された JavaScript 関数は、ブラウザ内のイベントに反応できます。

JavaScript を使用して HTML 要素を選択するには:

const btn = document.getElementById('subscribe');

そして、addEventListener を使用してリスナーを登録します。

const btn = document.getElementById('subscribe');
btn.addEventListener("クリック", 関数() {
    console.log("ボタンがクリックされました");
});

ここで、「クリック」はイベント、ボタンはサブジェクトまたは送信者、関数はリスナーまたはオブザーバーです。

要約すると:

HTML 要素はイベント エミッターです。

JavaScript でリスナーとして登録された関数はオブザーバーです。

これらのコンポーネントはすべて、小さなイベント駆動型アーキテクチャを構成します。コードをテストするには、次の HTML コンテンツをファイルに保存し (または Codepen で試し)、ボタンをクリックして、ブラウザ コンソールを確認します。

<!DOCTYPE html>
<html lang="ja">
<ヘッド>
    <メタ文字セット="UTF-8">
    <title>JavaScript における「イベント駆動型」とはどういう意味ですか?</title>
</head>
<本文>
<div>
    <button id="subscribe">購読</button>
</div>
</本文>
<スクリプト>
    const btn = document.getElementById('subscribe');
    btn.addEventListener("クリック", 関数() {
        console.log("ボタンがクリックされました");
    });
</スクリプト>
</html>

次のセクションでは、Node.js で使用される同じ概念について説明します。

Node.js ではイベント駆動型プログラミングはどのように機能しますか?

Node.js は、ブラウザ外部 (コマンドライン ツールとサーバー側) で実行される V8 エンジンに基づく JavaScript 環境です。

Node.js で行う作業のほとんどはイベントベースです。常に送信者オブジェクトと、メッセージをリッスンするいくつかのオブザーバーが存在します。

Node.js には HTML 要素がないため、ほとんどのイベントはプロセス、ネットワークとのやり取り、ファイルなどから発生します。

Node.js のすべてのイベント エミッターには、少なくとも 2 つの引数を取る on と呼ばれるメソッドがあります。

  • 監視するイベントの名前
  • リスナー機能

実際の例を見てみましょう。このシンプルな Node.js サーバーを見てみましょう。

定数net = require("net");
const server = net.createServer().listen(8081, "127.0.0.1");
server.on("listening", 関数() {
  console.log("サーバーがリッスンしています!");
});
server.on("接続", 関数(ソケット) {
  console.log("クライアントが接続されました!");
  socket.end("こんにちはクライアント!");
});

このコードは、localhost のポート 8081 でリッスンするサーバーを作成します。サーバー オブジェクトでは、on メソッドを呼び出して 2 つのリスナー関数を登録します。

リスニング イベントはサーバーの起動直後に発生し、接続イベントはクライアントが 127.0.0.1:8081 に接続したときに発生します (試してみてください)。

この例では、サーバーがイベントの送信者、つまり件名です。一方、リスナー関数はオブザーバーです。

しかし、それらのオンメソッドはどこから来るのでしょうか?

EventEmitterを理解する

Node.js のすべてのイベント駆動型モジュールは、EventEmitter と呼ばれるルート クラスを拡張します。前の例では、net モジュールのネットワーク サーバーは EventEmitter を使用しました。

Node.js の EventEmitter には、on と emitting という 2 つの基本メソッドがあります。

ブラウザに対応させたい場合、EventEmitter はイベントを発行できる任意の HTML 要素と考えることができます。

ブラウザでイベントをリッスンするには、subject オブジェクトで addEventListener を呼び出します。

const btn = document.getElementById('subscribe');
btn.addEventListener("クリック", 関数() {
    console.log("ボタンがクリックされました");
});

対照的に、Node.js では次のようになります。

// 省略
server.on("listening", () => {
  console.log("サーバーがリッスンしています!");
});
// 省略

正確に言うと、EventEmitter には addListener メソッドもあります。 on はその別名です。

EventEmitter には、カスタム イベント (メッセージ) をブロードキャストするときに便利な emitting メソッドもあります。

EventEmitter を使用する場合は、「events」モジュールからインポートしてイベントを発行します。

const EventEmitter = require("イベント");
const エミッター = 新しい EventEmitter();
emittingter.on("customEvent", () => console.log("イベントが発生しました!"));
エミッター.emit("カスタムイベント");

Node.js でコードを実行すると、コンソールに「Got event」と表示されます。

JavaScript におけるオブザーバー/パブリッシュ/サブスクライブの他の例

JavaScript にはオブザーバー オブジェクトのネイティブ サポートはありませんが、言語にオブザーバー オブジェクトを追加する提案があります。

RxJS は、オブザーバー パターンを JavaScript に導入するライブラリです。

Redux は、JavaScript でのパブリッシュ/サブスクライブ パターンの実装です。 これは、状態の変化がすべてのリスニング オブザーバーに配信される非常に優れたイベント エミッターです。

最新のブラウザには、オブザーバー パターンの別の例である Intersection Observer API が付属しています。

Socket.IO はイベントを多用するライブラリです。

要約する

この記事から何か新しいことを学んでいただければ幸いです。多くの用語を学びますが、すべては約 30 年前に発明されたパブリッシュ サブスクライブというパターンに帰着します。

このパターンはオブザーバーとも呼ばれ、現在 JavaScript と Node.js で使用されているイベント駆動型アーキテクチャの基礎となります。

もう一度言いますが、イベント駆動型、パブリッシュ/サブスクライブ型、およびオブザーバー パターンは同一ではありません。イベント駆動型アーキテクチャはパブリッシュ/サブスクライブ型の上に構築され、オブザーバー パターンは DOM や Node.js イベントよりも豊富です。

しかし、彼らは皆同じ​​家族の一員です。

上記は、JS と Nodejs におけるイベント駆動の詳細についての簡単な説明です。JS と Nodejs におけるイベント駆動の詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • ネイティブ JS を使用してタッチスライド監視イベントを実装する方法
  • JavaScript WebAPI、DOM、イベント、操作要素例の詳しい説明
  • JavaScript におけるイベント バブリング メカニズムの詳細な分析
  • jsのイベントループ機構の解析
  • JSブラウザイベントモデルの詳細な説明
  • Vue.js フロントエンドフレームワークにおけるイベント処理の概要
  • 一般的なイベントを処理するための JavaScript の使用に関する詳細な説明
  • JavaScript イベント ループのケース スタディ

<<:  MySQL SQL ステートメント分析とクエリ最適化の詳細な説明

>>:  フロントエンドとバックエンドを分離した nginx 構成を展開するための完全な手順

推薦する

docker に openjdk をインストールして jar パッケージを実行する方法

画像をダウンロード docker プル openjdkデータボリュームの作成java_appデータボ...

Vueプロジェクトのフロントエンドを最適化およびパッケージ化するための必須のボーナスアイテム

目次序文1. ルーティングの遅延読み込み1. ルートの遅延読み込みが必要なのはなぜですか? 2. ル...

IDEA の Docker プラグインを介して Springboot プロジェクトを公開する方法の詳細なチュートリアル

1. Dockerfileを書く(1)プロジェクト名を右クリックして新しいテキストファイルを作成し、...

Nginx は https ウェブサイト構成コード例を実装します

https ベースポート 443。これはキーと呼ばれるものに使用されます。これらのことを理解せずにで...

Tomcat で複数の war パッケージを展開する方法と手順

1 背景JDK1.8-u181とTomcat8.5.53がインストールされました。インストール後、環...

MySQL列挙型のテスト例

プロジェクトを開発しているとき、支払い済み、支払済み、クローズ済み、返金済みなどの注文ステータスなど...

iframe src 割り当ての問題 (サーバー側)

今日この問題に遭遇しました。サーバー側でiframeのsrc値を再割り当てし、iframeにIDを追...

純粋な HTML ページを送信し、パラメータを渡し、ID を確認する方法

プロジェクトにはアンケートが必要ですが、クライアントはアンケートのタイトルが純粋なHTMLタグでなけ...

ウェブメッセージボード機能を実現するjs

この記事の例では、Webメッセージボードを実装するためのjsの具体的なコードを参考までに共有していま...

Centos7 で yum を使用して Mysql5.7.19 をインストールする詳細な手順

Centos7 の yum ソースには、mysql の代わりに mariaDB が使用されているため...

MySQL 8.0.13 解凍版のインストールと設定方法のグラフィックチュートリアル

1. インストール1. MySQLをダウンロードするダウンロードアドレス: リンクアドレスブラウザで...

仮想スクロールを簡単に実装するためのVueサンプルコード

目次序文ローリング原理成し遂げるソースコード参照する序文モバイル Web ページの日常的な開発では、...

Flex プログラム Firefox で中国語を入力すると文字化けするバグ

Firefox の下位バージョンでは中国語の文字を入力できず、上位バージョンでは文字化けした文字が表...

HTML webpackプラグインの使用に関する簡単な分析

html-webpack-pluginプラグインを使用してページを開始すると、htmlページをメモリ...

JavaScript のショートカットのヒント

目次1. 配列を結合する2. 配列をマージする(最初に) 3. 配列の複製4. 構造化分解割り当て5...