ホームページ  >  記事  >  ウェブフロントエンド  >  Node.js_node.js のいくつかの機能の詳細については、こちらをご覧ください。

Node.js_node.js のいくつかの機能の詳細については、こちらをご覧ください。

WBOY
WBOYオリジナル
2016-05-16 16:35:291209ブラウズ

Node.js は、プログラマーがスケーラブルなアプリケーションを迅速に構築できるように設計された新しいバックエンド言語です。 Node.js には多くの魅力的な機能があり、それに関するレポートが無数にあります。この記事では、ユーザーが Node.js をより深く理解できるように、EventEmitter、Streams、コーディング スタイル、リンティング、コーディング スタイルなどの機能を分析して説明します。

Chrome JavaScript ランタイム上に構築されたプラットフォームとして、JavaScript の知識はノード アプリケーションに適用できるようです。追加の言語拡張や変更を行わなくても、フロントエンド プログラミングの経験をバックエンド プログラミングに適用できます。

EventEmitter (イベントエミッター)

まず、EventEmitter モデルを理解する必要があります。イベントを送信し、消費者が関心のあるイベントをサブスクライブできるようにします。これは、コールバック配信パターンを非同期関数に拡張したものと考えることができます。特に、複数のコールバックが必要な場合は、EventEmitter の方が有利です。

たとえば、呼び出し元は「ファイルのリスト」リクエストをリモート サーバーに送信します。返された結果をグループ化し、グループごとにコールバックを実行することもできます。 EventEmitter モデルを使用すると、各グループに「ファイル」コールバックを送信し、すべての操作が完了したときに「終了」処理を実行できます。

EventEmitter を使用する場合、関連するイベントとパラメーターを設定するだけで済みます。

コードをコピーします コードは次のとおりです:

var EventEmitter = require('events').EventEmitter
var util = require('util');
function MyClass() {
if (!(MyClass のこのインスタンス)) new MyClass() を返します。
EventEmitter.call(this);
var self = これ; setTimeout(function timeoutCb() {
Self.emit('myEvent', 'hello world', 42); }, 1000); }
util.inherits(MyClass, EventEmitter);


MyClass コンストラクターは、トリガー遅延 1 秒とトリガー イベント myEvent を持つ時間トリガーを作成します。関連イベントを使用するには、on() メソッドを実行する必要があります:



コードをコピーします

コードは次のとおりです:

ここで、サブスクライブされた EventEmitter イベントは非同期イベントですが、時間がトリガーされると、リスナーのアクションが同期されることに注意してください。したがって、上記の myEvent イベントに 10 個のリスナーがある場合、イベント ループを待たずにすべてのリスナーが順番に呼び出されます。

EventEmitter のサブクラスが Emit('error') イベントを生成しても、それをサブスクライブするリスナーがいない場合、EventEmitter 基本クラスは例外をスローし、プロセス オブジェクトの実行時に uncaughtException がトリガーされます。


エラー

verror は基本クラス Error の拡張であり、printf 文字形式を使用して出力メッセージを定義できるようになります。

ストリーム

処理する必要がある非常に大きなファイルがある場合、理想的な方法は、ファイルがどれほど大きくても、時間が許す限り、その一部を読み取り、その一部を書き込むことです。ここではストリームの概念を使用する必要があります。ストリームは、Node で広く使用されているもう 1 つのモデルであり、EventEmitter の実装です。読み取り可能、書き込み可能、​​または全二重インターフェイスを提供します。これは、読み取り可能、書き込み可能、​​ドレイン、データ、終了、クローズなどの定期的な操作イベントを提供する抽象インターフェイスです。パイプラインを使用してこれらのイベントを効果的に統合できれば、より強力な対話型操作が実現されます。 .pipe() を使用することで、Note はパイプラインを介してバックプレッシャーと通信できます。バックプレッシャーとは、書き込み可能なもののみを読み取る、または読み取り可能なもののみを書き込むことを意味します。

たとえば、標準入力からローカル ファイルとリモート サーバーにデータを送信しています。

コードをコピー

コードは次のとおりです:


var fs = require('fs');

var net = require('net'); var localFile = fs.createWriteStream('localFile.tmp'); net.connect('255.255.255.255', 12345, function(client) { Process.stdin.pipe(client); process.stdin.pipe(localFile);
});

データをローカル ファイルに送信し、gunzip を使用してストリームを圧縮したい場合は、次のようにすることができます:

コードをコピーします コードは次のとおりです:

var fs = require('fs');
var zlib = require('zlib');

process.stdin.pipe(zlib.createGunzip()).pipe(fs.createWriteStream('localFile.tar'));

ストリームについて詳しく知りたい場合は、ここをクリックしてください。

制御フロー

JS にはファーストクラスのオブジェクト、クロージャ、その他の機能概念があるため、コールバック権限を簡単に定義できます。これはプロトタイプを作成するときに非常に便利で、必要に応じて論理権限を統合できます。ただし、扱いにくい組み込み関数も簡単に使用できるようになります。

たとえば、一連のファイルを順番に読み取り、特定のタスクを実行したいとします。

コードをコピー コードは次のとおりです:

fs.readFile('firstFile', 'utf8', function firstCb(err, firstFile) {
doSomething(firstFile);
fs.readFile('秒ファイル', 'utf8', 関数 SecondCb(err, SecondFile) {
doSomething(2 番目のファイル);
fs.readFile('thirdFile', 'utf8', function thirdCb(err, thirdFile) {
doSomething(第三ファイル);
});
});
});

このモデルの問題は次のとおりです:

1. これらのコードのロジックは非常に分散していて無秩序であり、関連する操作プロセスを理解するのが困難です。
2. エラーまたは例外処理はありません。
3. JS におけるクロージャ メモリ リークは非常に一般的ですが、診断と検出が困難です。

入力セットに対して一連の非同期操作を実行したい場合は、フロー制御ライブラリを使用するのが賢明な選択です。ここでは Vasync が使用されます。

vasync は、非同期操作から発想を得たプロセス制御ライブラリです。その特徴は、消費者が特定のタスクの処理を表示および観察できることです。この情報は、エラーの発生過程を検討するのに非常に役立ちます。

コーディングスタイル

プログラミング スタイルはカジュアルなものが多いため、最も物議を醸すトピックであると言えます。ニンジンとキャベツ、人それぞれ好みがあります。重要なのは、個人とチームの両方に適したスタイルを見つけることです。いくつかの伝統的な継承により、ノード開発の行程が改善される可能性があります。

1. 関数に名前を付けます
2. すべての関数に名前を付けてみます。
3. 閉鎖を避ける
4. 関数内に他の関数を定義しないでください。これにより、予期しないクロージャのメモリ リーク事故の多くを減らすことができます。
5. 関数の追加と縮小

V8 JIT は強力なエンジンですが、より小さく合理化された機能は V8 とより良く統合されます。さらに、私たちの関数が小さくて精巧なもの (約 100 行) であれば、それを読んで保守するときに自分自身に感謝するでしょう。

プログラムによるスタイルのチェック: スタイルの一貫性を維持し、検査ツールを使用してそれを強制します。 jsstyleを使用しています。

リンティング (コード検査)

Lint ツールは、コードを実行せずにコードの静的分析を実行し、潜在的なエラーやリスク (case 切り替え時の Break ステートメントの欠落など) をチェックできます。 Lint は単にスタイル チェックに相当するものではなく、主観的なスタイル選択ではなく、客観的なリスク分析を目的としています。チェック項目が豊富なjavascriptlintを使用しています。

ロギング

プログラムやコーディングを行うときは、長期的な視点を持つ必要があります。特に、デバッグにどのツールを使用するかを検討してください。優れた最初のステップは、効果的なロギングです。デバッグ中に特に注意を払う価値があるもの、実行時の分析と調査に何が使用されるのかを確認するために、情報を特定する必要があります。直接 Node.jsロギング ライブラリ である Bunyan を使用することをお勧めします。データ出力形式は JSON です。詳細については、ここをクリックしてください。

クライアントサーバー

アプリケーションに分散処理機能があれば、市場での魅力はさらに高まります。同様のインターフェイスは、HTTP RESTFul API または生の TCP JSON を使用して記述することができます。これにより、開発者は、Node エクスペリエンスを非同期ネットワーキング環境と組み合わせたり、分散型のスケーラブルなシステムでストリームを使用したりすることができます。

よく使用されるツール:

1. 修正します

簡単に言えば、これは REST サービスを構築するためのツールです。優れた表示とデバッグ処理のサポートを提供し、Bunyan と DTrace をサポートします。

2. 速い

fast は、TCP を使用して JSON メッセージを処理する軽量ツールです。 DTrace サポートを提供し、サーバー クライアントのパフォーマンス特性を迅速に特定できるようにします。

3. ワークフロー

ワークフローはrestifyに基づいて構築されており、一連のリモートサービスとAPIのビジネスプロセスを定義できます。例: エラーステータス、タイムアウト、再接続、輻輳処理など。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。