3.Node学習:コアモジュールの一つ(util、events、fs)

7839 ワード

コアモジュールはいくつかの簡素化された効率的なライブラリからなり、基本的なAPIを提供している.
コアモジュールは全部内蔵しています.直接requireでいいです.
一.グローバルオブジェクト
ブラウザJavaScriptでは、グローバルオブジェクトはwindowであり、Node.jsではグローバルオブジェクトはglobalであり、すべてのグローバル変数(global自体を除く)はglobalオブジェクトの属性となります.
1.グローバル変数
以下の条件を満たす変数はグローバル変数になります.
最外層で定義された変数
グローバルオブジェクトの属性
未定義で直接値を付与する変数(varは使用しません)
注:node.jsでは、すべてのユーザーコードが現在のモジュールに属していますので、最外層で変数を定義することはできません.その作用領域は現在のモジュールの導出対象です.これは2つのモジュールの中の同名変数が衝突しない原因です.
注:したがって、node.jsにおいて、var宣言を使用する変数は常にグローバル変数であることは不可能です.したがって、varは常にグローバル変数の汚染を回避するために使用されます.
2.process対象
processはグローバルオブジェクト(globalオブジェクトの属性)であり、現在のNode.jsプロセス状態を説明するためのオブジェクトとして、オペレーティングシステムとの簡単なインターフェースを提供しています.
process.argv
コマンドラインのパラメータを含む配列を返します.(最初の要素は'node'で、2番目の要素は.jsファイルの名前(パスを含む)、次の要素は順にコマンドラインのパラメータです.)
process.stdout
標準的な出力フローは、consolie.logs()のパッケージです.
process.stdout.write();
process.stdin
標準入力ストリームは、最初は一時停止されています.標準入力からデータを読み出すには、ストリームを復元し、手動でストリームのイベント応答関数を作成する必要があります.
process.stdin.resume();
process.stdin.on('data', function(data) {
	process.stdout.write('    : ' + data.toString());
});
process.nextTick(calback)
イベントサイクルのためのタスクを設定します.Node.jsは次のイベントのループの応答時にコールバックを呼び出します.
3.ソロの対象
コンソール標準出力を提供するために使用します.
console.log();   //          

console.error();  //          

console.trace();  //             
二.utilモジュール
utilモジュールは、Core JavaScript機能があまりにもシンプルでないことを補うために、常用関数のセットを提供する.
utilモジュールを使用する前に、このモジュールをロードします.
var util = require(‘util’);   //    
1.util.inhers()
この方法は対象間原型継承を実現する.
最初のパラメータは構造関数です.
二つ目のパラメータは継承が必要なコンストラクタです.
注:第一のコンストラクタは、第二のコンストラクタのプロトタイプの属性を継承することができます.
JavaScriptのオブジェクト指向特性は、プロトタイプに基づいており、JavaScriptは対象継承の言語レベル特性を提供しておらず、プロトタイプコピーによって実現されます.
function Base(){
	this.name="china";
	this.age= 2014;
	this.sayHello=function(){
		console.log(this.name);
	};
}
Base.prototype.job="code";
function Sub(){
	this.name="shandong";
}
util.inherits(Sub,Base);
var s = new Sub();
console.log(s.name);  //shandong
console.log(s.age);    //undefined
console.log(s.job);    //code 
なお、Subはベースに定義された属性のみを継承しています.
2.util.inspect()
この方法は、任意のオブジェクトを文字列に変換します.
最初のパラメータは、変換するオブジェクトを表す必要があります.
第二のパラメータ、オプション、ブール値は、より多くの隠し情報を出力するかどうかを表します.
第3のパラメータは、再帰的な階層(nullとして指定され、オブジェクト全体を巡回します.)
第四のパラメータは、オプションとして、ブール値が、コンソールでハイライト表示されるかどうかを表します.
この方法で文字列を変換すると、オブジェクトのtoString()メソッドを呼び出しません.
3.util.isAray()
オブジェクトが配列であるかどうかを判断します.
4.util.isRegExp()
オブジェクトが正規表現であるかどうかを判断します.
5.util.isDate()
Dateタイプを判断する
6.util.isError()
Errタイプを判断する
三.eventsモジュール
Node.jsはイベント駆動であり、eventsは一意のインターフェースを提供し、eventsモジュールはユーザーコードとNode.js下層イベントサイクルとの相互作用だけでなく、ほぼすべてのモジュールに依存している.
以前はブラウザで、イベントはDOMとBOMに由来していましたが、NodeにはDOMとBOMは存在しませんので、自分でEventEmitterタイプを作って、イベントの基本機能を実現しました.
eventsモジュールは一つのオブジェクトのみを提供します.events.EventEmitter.EventEmitterの核心はイベント送信とイベントモニター機能のパッケージです.
var EventEmitter= require("events").EventEmitter;
var event= new EventEmitter();  //EventEmitter    ,        
1.on()方法とaddListener()方法
この二つの方法はイベントモニターの機能を実現しています.
最初のパラメータは、必ず待ち受けイベント名文字列です.
二つ目のパラメータは、必須、コールバック関数です.
emitter.on("eventName",function(){
});
注:同じイベント名は、いくつかのイベントモニターをバインドすることができます.イベント送信時に、このイベントに登録されたイベントモニターが順次起動される.
2.ワンス()の方法
ワンス()はイベントの傍受を実現し、パラメータは同じですが、ワンマンモニターのみ登録しました.
emitter.once("eventName",function(){
});
3.emit()の方法
emit()はイベントをトリガする機能を実現しました.
最初のパラメータは、トリガされるイベント名文字列(傍受に対応するイベント名)が必要です.
2〜n番目のパラメータ、オプション、コールバック関数のパラメータ
emitter.emit("eventName");
もう一つの特殊なイベントであるerrorは、「エラー」という意味が含まれていて、異常が発生した時には常にerrorイベントを送信します.
注:errorイベントは、明示的な傍受は不要です.
注:トリガerrorイベントは、コールバック関数が必要です.そうでないと、プログラムが崩壊します.
var events = require('events'); 
var emitter = new events.EventEmitter(); 
emitter.emit('error' , function(){ });
4.removeListener()方法
RemoveListener()は指定されたイベントモニターを削除する機能を実現しました.
最初のパラメータは、必ずイベント名文字列で、傍受のイベント名に対応します.
二つ目のパラメータは、必ず、コールバック関数(モニター)
5.removeAllListeners()方法
RemoveAllListener()は、すべてのイベントモニターを削除する機能を実現しました.
オプションで、イベント名文字列は、待ち受けのイベント名に対応します.
注:ほとんどの場合、私たちは直接events.EventEmitterを使用しないで、対象の中でそれを継承します.(fs、httpを含めて、イベント応答をサポートするコアモジュールはすべてEventEmitterのサブクラスです.)
なぜこのようにしますか?原因は2つあります
まず、あるエンティティ機能を有するオブジェクトが、イベントの意味に合致することを実現し、イベントの傍受および送信は、オブジェクトの方法であるべきである.
次にJavaScriptの対象となるメカニズムは原型に基づいており、サポート部分は複数引き継ぎ、EventEmitterを継承することで、対象元の継承関係を混乱させない.
四.fsモジュール
fsモジュールはファイル操作のパッケージであり、ファイルの読み込み、書き込み、名前変更、削除、ディレクトリ、リンクなどの操作を提供しています.
注:他のモジュールとは異なり、fsモジュールのすべての動作は非同期バージョンと同期バージョンの両方を提供しています.
var fs = require(“fs”);    //    
1.fs.readFile()
非同期でファイルを読み込み、戻り値なし
最初のパラメータは、読み込むファイルパスとファイル名を示す必要があります.
第二のパラメータは、任意で、どの文字で解析ファイルを符号化しますか?
第三のパラメータは、オプションとして、コールバック関数を表し、二つのパラメータを受信します.第一のパラメータはエラー情報でなければなりません.第二のパラメータはファイル内容を表します.
fs.readFile('test.txt' , 'utf-8' , function(err,data){
	if(err){
		console.error(err);
	}else{
		console.log(data);
	}
});
console.log('end');   //   'end',       
注:符号化方式を指定しなくてもいいですが、そうするとバイナリデータが読み取られます.これは一般的に私達が欲しいものではないので、符号化方式を指定してから読み取ったすべての文字列を覚えてください.
注:Node.jsの非同期プログラミングインターフェースの習慣は関数の最後のパラメータをコールバック関数としており、通常は関数は一つのコールバック関数しかありません.コールバック関数は実際のパラメータの中で最初にerrであり、残りのパラメータは他の戻り値の内容である.エラーが発生していない場合、errの値はnullまたはundefinedとなります.エラーが発生した場合、errは通常、Errオブジェクトの例である.
2.fs.readFileSync()
読み取りファイルを同期させると、ブロックされて、読み込んだ内容に戻ります(またはエラー).
最初のパラメータは、必ず読み込むファイル名を表します.
第二のパラメータは、任意で、どの文字で解析ファイルを符号化しますか?
var con = fs.readFileSync('test.txt' , 'utf-8');
console.log(con);
結び目
同期版で読み取った内容は関数で値を返します.エラーが発生した場合は通常のエラーとしてエラーを返します.
非同期版の多くは戻り値がないが、最後のパラメータとしてフィードバック関数が必要である.また、コールバック関数の最初のイメージは、リターンのエラー情報です.非同期動作が正しく実行され、リターンされると、このエラーイメージはnullまたはundefinedとなる.また、読み取った内容はコールバック関数の2番目のパラメータとして使用されます.
同期バージョンは処理が完了するまでプロセスをブロックします.
非同期バージョンはブロックされていませんが、実行順序を保証することはできません.順序通りに実行するためには、コールバック関数で次のステップを完了する必要があります.
3.fs.readFile()
非同期でファイルを読み込み、戻り値なし
4.fs.readFileSync()
5.fs.open()
非同期でファイルを開く
最初のパラメータは、開くファイル名を示す必要があります.
二つ目のパラメータは、開いている方式を示す必要があります.
r:読み取りモードでファイルを開く
r+:読み書きモードでファイルを開く
w:書き込みモードでファイルを開き、ファイルが存在しない場合は作成します.
w+:読み書きモードでファイルを開きます.ファイルが存在しない場合は作成します.
a:ファイルを追加モードで開きます.ファイルが存在しない場合は作成します.
a+:追加モードを読み込み、ファイルを開きます.ファイルが存在しない場合は作成します.
第三のパラメータは、オプションとして、ファイルの権限を表します.
第四のパラメータは、オプションとして、コールバック関数を表し、二つのパラメータを受信します.第一のパラメータはエラー情報でなければなりません.第二のパラメータはファイル記述子を表します.
var fs = require('fs');
fs.open("./test.txt",'r',function(err,des){
	console.log(des)
});
小さいファイルのコピー例
var fs = require('fs');

function copy(src, dst) {
    fs.writeFileSync(dst, fs.readFileSync(src));
}

function main(argv) {
    copy(argv[0], argv[1]);
}

main(process.argv.slice(2));
6.より多くのAPIは公式文書を参照する.
http://nodejs.org/api/fs.html
五.Bufferモジュール
六.Streamモジュール
小さいファイルをコピーしても大丈夫ですが、このように一度にすべてのファイルの内容をメモリに読み取ってからディスクに一気に書き込むのは、大きなファイルをコピーするのに適していません.メモリがパンクします.大きな書類については、コピーが完成するまで、少ししか読めません.上のプログラムは次のように改造する必要があります.
var fs = require('fs');

function copy(src, dst) {
    fs.createReadStream(src).pipe(fs.createWriteStream(dst));
}

function main(argv) {
    copy(argv[0], argv[1]);
}

main(process.argv.slice(2));
以上のプログラムはfs.reate ReadStreamを使用してソースファイルの読み取り専用データストリームを作成し、fs.reate WriteStreamを使用して一つのターゲットファイルのデータストリームのみを作成し、pipe方法で二つのデータストリームを接続しました.つながった後の出来事を抽象的に言うと、水はホースに沿って桶から別の桶に流れてきます.