node.jsは、プログラマーがスケーラブルなアプリケーションを迅速に構築できるように設計された新しいバックエンド言語です。 node.jsには多くの魅力的な機能があり、それについて無数のレポートがあります。この記事では、EventeMitter、ストリーム、コーディングスタイル、糸くず、コーディングスタイルなどの機能を分析して説明し、ユーザーがnode.jsをより深く理解できるようにするのに役立ちます。
Chrome JavaScriptランタイムに基づいて構築されたプラットフォームとして、JavaScriptの関連する理解はノードアプリケーションに適用できるようです。追加の言語拡張または変更がなければ、フロントエンドプログラミングのエクスペリエンスをバックエンドプログラミングに適用できます。
eventemitter(イベント送信者)
まず、EventeMitterモデルを理解する必要があります。消費者に興味を持つイベントと同様に、イベントを送信できます。コールバックパスパターンの非同期関数への拡張機能と考えることができます。特に、複数のコールバックが必要な場合、EventeMitterはより利点があります。
たとえば、発信者は「リストファイル」要求をリモートサーバーに送信します。返された結果をグループ化し、各グループのコールバックを実行することをお勧めします。 EventeMitterモデルを使用すると、各グループに「ファイル」コールバックを送信し、すべての操作が完了したときに「終了」処理を実行できます。
EventeMitterを使用する場合は、関連するイベントとパラメーターを設定するだけです。
コードコピーは次のとおりです。
var eventemitter = require( 'events')。eventemitter;
var util = require( 'util');
functionmyclass(){
if(!(this instance of myclass))new myclass();
eventemitter.call(this);
var self = this;
setimeout(function timeoutcb(){
self.emit( 'myevent'、 'hello world'、42);
}、1000);
}
util.inherits(myclass、eventemitter);
MyClassコンストラクターは、1Sのトリガー遅延とMyEventのトリガーイベントでタイムトリガーを作成します。関連するイベントを使用するには、on()メソッドを実行する必要があります。
コードコピーは次のとおりです。
var myobj = new myclass();
var start = date.now();
myobj.on( 'myevent'、function myeventcb(str、num){
console.log( 'myEventトリガー'、str、num、date.now() - start);
});
ここでは、サブスクライブされたEventemitterイベントは非同期イベントであるが、時間がトリガーされると、リスナーのアクションが同期されることに注意する必要があります。したがって、上記のMyEventイベントに10人のリスナーがいる場合、すべてのリスナーがイベントループを待たずに順番に呼び出されます。
EventeMitterのサブクラスがEMIT(「エラー」)イベントを生成しますが、リスナーがそれを購読していない場合、EventeMitterベースクラスは例外をスローし、プロセスオブジェクトの実行時にcoughtexceptionイベントをトリガーします。
ヴェラー
Verrorは、Base Classエラーの拡張機能であり、PrintF文字形式を使用して出力メッセージを定義できます。
ストリーム
処理する必要がある非常に大きなファイルがある場合、理想的な方法は部分を読み、部分を記述することです。ファイルの大きさに関係なく、時間が許す限り、常に処理されます。これには、ストリーミングの概念が必要です。 Streamsは、ノード、ノード、EventeMitterの実装で広く使用されている別のモデルです。読み取り可能な、書き込み可能な、またはフルデュプレックスインターフェイスを提供します。これは抽象的なインターフェースであり、提供される定期的な操作イベントには、読み取り可能、手紙、排水、データ、終了、および閉じることが含まれます。パイプラインを使用してこれらのイベントを効果的に統合できる場合、より強力な相互作用が達成されます。
.pipe()を使用することにより、メモはパイプラインを介してバックプレッシャーと通信できます。逆圧力とは、書くことができるもののみ、または読み取ることができるもののみを意味します。
たとえば、STDINからローカルファイルとリモートサーバーにデータを送信しました。
コードコピーは次のとおりです。
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){
DOSOMTHING(FirstFile);
fs.readfile( 'secondfile'、 'utf8'、function secondcb(err、secondfile){
DOSOMTHING(SecondFile);
fs.readfile( 'thirdfile'、 'utf8'、function shuldcb(err、thirdfile){
DOSOMTHING(ThirdFile);
});
});
});
このパターンの問題は次のとおりです。
1.これらのコードの論理は非常に散らばっており、無秩序であり、関連する運用プロセスを理解するのは困難です。
2.エラーや例外は処理されません。
3. JSの閉鎖メモリリークは非常に一般的であり、診断と検出が困難です。
入力セットで一連の非同期操作を実行したい場合は、プロセス制御ライブラリを使用することはより賢明な選択です。 Vasyncはここで使用されます。
Vasyncは、非同期操作からのアイデアが生まれたプロセス制御ライブラリです。それを特別なものにしているのは、消費者が特定のタスクプロセスを表示して観察できることです。この情報は、特定のエラーのプロセスを研究するのに非常に役立ちます。
コーディングスタイル(プログラミングスタイル)
プログラミングスタイルは、しばしばカジュアルであるため、最も物議を醸すトピックです。誰もが自分の好みを持っています。個人やチームに合ったスタイルを見つけることが重要です。いくつかの伝統的な遺産は、ノード開発の旅をより良い場所にするかもしれません。
1。関数に名前を付けます
2。すべての関数に名前を付けるようにしてください。
3。閉鎖を避けてください
4.特定の関数で他の機能を定義しないでください。これにより、多くの予期しない閉鎖メモリリーク事故が減少します。
5。より小さな関数
V8 JITは強力なエンジンですが、小さくて薄い機能の方がV8と組み合わされます。さらに、私たちの機能がすべて小さくて絶妙な(約100行)場合、自分自身を読んで維持するときにも感謝します。
プログラムでスタイルをチェックする:スタイルの一貫性を維持し、チェックツールを使用してそれを強化します。 jsstyleを使用しています。
糸くず(コードチェック)
LINTツールは、実行せずにコードの静的分析を実行でき、潜在的なエラーとリスクを確認して、ケーススイッチのブレークステートメントが欠落しています。 Lintは、スタイルチェックと単に同等ではなく、主観的なスタイルの選択よりも客観的なリスク分析を目的としています。豊富なチェックアイテムを備えたJavaScriptlintを使用します。
ロギング(ロギング)
プログラミングとコーディングの場合、長期的なビジョンが必要です。特に、デバッグに使用するツールを検討してください。優れた最初のステップは、効果的なロギングを行うことです。情報を特定し、デバッグ中に特別な注意を払っているものと、実行時に分析と研究に使用されるものを確認する必要があります。直接node.jsロギングライブラリであるBunyanを使用することをお勧めします。データ出力形式はJSONです。詳細については、ここをクリックしてください。
クライアントサーバー
アプリケーションが処理機能を分散している場合、市場でより魅力的になります。同様のインターフェイスは、HTTP Restful APIまたは元のTCP JSONを使用して説明できます。これにより、開発者はノードでのエクスペリエンスと非同期ネットワーク環境、および分散およびスケーラブルなシステムを備えたストリームの使用を組み合わせることができます。
一般的なツール:
1。reptify
簡単に言えば、これは休憩サービスを構築するためのツールです。 BunyanとDtraceをサポートしながら、優れた視聴とデバッグサポートを提供します。
2。高速
FASTは、TCPを使用してJSONメッセージを処理する軽量ツールです。 DTRACEサポートが提供されているため、サーバークライアントのパフォーマンス特性をすばやく特定できます。
3。ワークフロー
ワークフローはRestifyに基づいて構築されており、一連のリモートサービスとAPIのビジネスプロセスを定義できます。例:エラーステータス、タイムアウト、再接続、混雑処理など。