node.js----基礎

26349 ワード

1.モジュールシステム
ノードのためにjsのファイルは互いに呼び出すことができます.jsは簡単なモジュールシステムを提供した.モジュールはノードです.jsアプリケーションの基本的な構成部分であり、ファイルとモジュールは一つ一つ対応しています.つまり、ノードです.jsファイルはモジュールであり、JavaScriptコード、JSON、またはコンパイルされたC/C++拡張である可能性があります.
モジュールの作成
Node.jsでは、モジュールを作成するのは簡単です.次のように'mainを作成します.js'ファイル、コードは以下の通りです.
var hello = require('./hello');
hello.world();

以上の例では、コードrequire('./hello')は、現在のディレクトリのhelloを導入する.jsファイル(./は現在のディレクトリ、node.jsのデフォルト接尾辞はjs).
            Node.jsはexportsとrequireの2つのオブジェクトを提供し、exportsはモジュール公開のインタフェースであり、requireは外部からモジュールのインタフェース、すなわち取得されたモジュールのexportsオブジェクトを取得するために使用される.
次にhelloを作成します.jsファイル、コードは以下の通りです.
exports.world = function() {
  console.log('Hello World');
}

以上の例ではhello.jsはexportsオブジェクトを介してworldをモジュールのアクセスインタフェースとしてmain.jsではrequire('./hello')でこのモジュールをロードし、helloに直接アクセスできます.jsのexportsオブジェクトのメンバー関数です.
モジュールにオブジェクトをカプセル化したい場合があります.フォーマットは次のとおりです.
module.exports = function() {
  // ...
}

例:
//hello.js 
function Hello() { 
	var name; 
	this.setName = function(thyName) { 
		name = thyName; 
	}; 
	this.sayHello = function() { 
		console.log('Hello ' + name); 
	}; 
}; 
module.exports = Hello;

これにより、このオブジェクトを直接取得できます.
//main.js 
var Hello = require('./hello'); 
hello = new Hello(); 
hello.setName('BYVoid'); 
hello.sayHello(); 

モジュールインタフェースの唯一の変化はmoduleを使用することである.exports=Helloがexportsに代わった.world = function(){}. モジュールを外部参照する場合、インタフェースオブジェクトは、元のexportsではなく、出力するHelloオブジェクト自体です.
サービス側のモジュールはどこにありますか?
コードにモジュールを使用していることに気づいたかもしれません.このように:
var http = require("http");

...

http.createServer(...);

Node.jsには「http」というモジュールが付属しており、私たちのコードで要求し、戻り値をローカル変数に割り当てます.
これは私たちのローカル変数をすべてのhttpモジュールが提供する共通の方法を持つオブジェクトに変えました.
Node.jsのrequireメソッドのファイル検索ポリシーは、次のとおりです.
なぜならjsには4種類のモジュール(オリジナルモジュールと3種類のファイルモジュール)が存在し、requireメソッドは極めて簡単であるにもかかわらず、内部のロードは非常に複雑であり、そのロード優先度もそれぞれ異なる.次の図に示します.
ファイルモジュールキャッシュからロード
オリジナルモジュールとファイルモジュールの優先度は異なりますが、既存のモジュールをファイルモジュールのキャッシュからロードするよりも優先されません.
オリジナルモジュールからロード
オリジナルモジュールの優先度は、ファイルモジュールキャッシュの優先度に次ぐ.requireメソッドは、ファイル名を解析した後、モジュールがオリジナルモジュールのリストにあるかどうかを優先的にチェックします.httpモジュールを例にとると、ディレクトリの下にhttp/httpが存在する.js/http.node/http.jsonファイル、require(「http」)はこれらのファイルからロードされず、オリジナルモジュールからロードされます.
オリジナルモジュールにもキャッシュ領域があり、キャッシュ領域から優先的にロードされます.キャッシュ領域がロードされていない場合は、オリジナルモジュールのロード方式を呼び出してロードおよび実行します.
ファイルからロード
ファイルモジュールのキャッシュに存在する、オリジナルモジュールではない場合、Node.jsはrequireメソッドから入力されたパラメータを解析し、ファイルシステムから実際のファイルをロードします.ロード中のパッケージとコンパイルの詳細は前節で説明しましたが、ここではファイルモジュールを検索するプロセスについて詳しく説明します.その中にもいくつかの詳細があります.
requireメソッドは、次のパラメータの伝達を受け入れます.
http、fs、pathなど、原生モジュール.
./modまたは../mod、相対パスのファイルモジュール.
/pathtomodule/mod、絶対パスのファイルモジュール.
mod、非原生モジュールのファイルモジュール.
2.Buffer(バッファ)
JavaScript言語自体は文字列データ型のみで、バイナリデータ型はありません.
ただし、TCPストリームやファイルストリームのような処理では、バイナリデータを使用する必要があります.だからNode.jsでは、バイナリデータを専用に格納するキャッシュ領域を作成するBufferクラスが定義されています.
Node.jsでは、Bufferクラスはノードカーネルとともにパブリッシュされるコアライブラリです.BufferライブラリはNodeです.jsは、Node.jsは、Nodeで必要に応じてバイナリデータを処理する.jsでI/O操作で移動したデータを処理する場合、Bufferライブラリを使用する可能性があります.元のデータはBufferクラスのインスタンスに格納されます.1つのBufferは整数配列に似ていますが、V 8スタックのメモリ以外の元のメモリに対応します.Bufferクラスは、バイナリデータを直接処理するためのグローバル変数タイプです.さまざまな方法で構築できます.
Bufferを作成する方法:
    (1)、Buffer.alloc(size[, fill[, encoding]])
一定の長さのBufferを作成するには、パラメータsize、Bufferの長さが必要です.オプションのパラメータfill、Bufferの値を入力します.Encoding:UTF-8などの符号化フォーマット;
let buf = Buffer.alloc(10,2,'utf-8');
console.log(buf);  //
console.log(buf.length);  //10

    (2)、Buffer.from(array);
新しいarrayは、8バイトのBufferによって作成される.
let buf = Buffer.from([0x62, 0x75, 0x66, 0x66, 0x65, 0x72]);
console.log(buf);  //
console.log(buf.length);  //6
console.log(buf.toString());  //buffer

    (3)、Buffer.from(string[, encoding]);
与えられたJavaScript文字列stringを含むBufferを新規作成します.encodingパラメータstringの文字コードを指定します.
let buf = Buffer.from('zhangsan');
console.log(buf);  //
console.log(buf.length);  //8
console.log(buf.toString());  //zhangsan

書き込みキャッシュ:
    (1)、
buf.write(string[, offset[, length]][, encoding]) encodingの文字コードに従ってstringからbufoffsetの位置に書き込まれる.lengthパラメータは書き込みバイト数です.bufが文字列全体を保存するのに十分なスペースがない場合、stringの一部のみが書き込まれます.部分的に復号された文字だけは書き込まれません.
let buf = Buffer.alloc(10);
let len = buf.write('zae',3,2,'utf-8');  //      ,     ,     ,    
console.log(buf); //          2e     
console.log(len);  //2

キャッシュ領域データの読み込み:
    (1)、buf.toString([encoding[, start[, end]]]) encodingにより指定された文字符号化は、bufを1文字列に復号する.startおよびendは、bufの一部のみを復号するために入力され得る.
let buf = Buffer.alloc(10);
for(let i = 0;i<5;i++){
    //  97   'a'      ASCII  
    buf[i] = i+97;
}
console.log(buf.toString()); //abcde
console.log(buf.toString('utf-8',2,4));  //cd

BufferをJSONオブジェクトに変換するには:
    (1)、buf.toJSON();
は、bufのJSON形式を返します.Bufferインスタンスが文字列化されると、JSON.stringify()は関数を暗黙的に呼び出す.
let buf = Buffer.from([0x1, 0x2, 0x3, 0x4, 0x5]);
console.log(buf.toJSON()); //{ type: 'Buffer', data: [ 1, 2, 3, 4, 5 ] }

バッファマージ:
    (1)、Buffer.concat(list[, totalLength]);
  • listを統合するBufferまたはUint8Arrayのインスタンスの配列
  • totalLength合併時のlist中のBuffer例の全長
  • .
  • 戻り:
  • let buf1 = Buffer.alloc(10);
    let buf2 = Buffer.alloc(10);
    let buf3 = Buffer.alloc(10);
    let buf4 = Buffer.concat([buf1,buf2,buf3]);
    console.log(buf4.length);  //30

    バッファ比較:
        (2)、Buffer.compare(buf1, buf2); buf1buf2を比較し、Bufferのインスタンス配列の並べ替えに一般的に使用される.呼び出しbuf1.compare(buf2)に相当します.
    let buffer1 = new Buffer('ABC');
    let buffer2 = new Buffer('ABCD');
    let result = Buffer.compare(buffer1,buffer2);
    console.log(result);  //-1
    if(result < 0) {
        console.log(buffer1 + "   " + buffer2 + "  ");
    }else if(result === 0){
        console.log(buffer1 + "   " + buffer2 + "  ");
    }else {
        console.log(buffer1 + "   " + buffer2 + "  ");
    }

    3.Stream(ストリーム):
    Streamは抽象的なインタフェースであり,ノードには多くのオブジェクトがこのインタフェースを実現している.たとえば、httpサーバに対してリクエストを開始するrequestオブジェクトはStreamであり、stdout(標準出力)である.
    Node.js、Streamには4つのストリームタイプがあります.
    Readable-読み取り可能な操作.
    Writable-書き込み可能な操作.
    Duplex-読み書き可能な操作.
    Transform-オペレーションはデータに書き込まれ、結果が読み出されます.
    すべてのStreamオブジェクトはEventEmitterのインスタンスです.よく使用されるイベントは次のとおりです.
    Data-データが読み取り可能になったときにトリガーされます.
    end-読み取り可能なデータがない場合にトリガーされます.
    Error-受信および書き込み中にエラーが発生した場合にトリガーされます.
    finish-すべてのデータが最下位システムに書き込まれたときにトリガーされます.
    ストリームからデータを読み込むには、次の手順に従います.
    inputを作成します.txtファイル
    var fs = require("fs");
    var data = '';
    
    //      
    var readerStream = fs.createReadStream('input.txt');
    
    //       utf8readerStream.setEncoding('UTF8');
    
    //       --> data, end, and error
    readerStream.on('data', function(chunk) {
        data += chunk;
    });
    
    readerStream.on('end',function(){
        console.log(data);
    });
    
    readerStream.on('error', function(err){
        console.log(err.stack);
    });
    
    console.log("      ");

    書き込みストリーム:
    var fs = require("fs");
    var data = '    ';
    
    //  output.txt  
    var writerStream = fs.createWriteStream('output.txt');
    
    //    utf8       
    writerStream.write(data,'UTF8');
    
    //       
    writerStream.end();
    
    //       --> data, end, and error
    writerStream.on('finish', function() {
        console.log("");
    });
    
    writerStream.on('error', function(err){
        console.log(err.stack);
    });
    
    console.log("      ");
    実行すると自動的にoutputが作成されます.txtファイル
    パイプフロー:
    パイプは、入力ストリームに出力ストリームを流すメカニズムを提供します.通常、あるストリームからデータを取得し、別のストリームに渡すために使用されます.
    上の写真のように、私たちは書類を水を入れたバケツにたとえて、水は書類の中の内容で、私たちは1本のパイプ(pipe)で2つのバケツを接続して、1つのバケツから別のバケツに水を流入させて、このようにゆっくりと大きな書類の複製過程を実現しました.
    次の例では、あるファイルの内容を読み取り、別のファイルに書き込むことにします.
    var fs = require("fs");
    
    //        
    var readerStream = fs.createReadStream('input.txt');
    
    //        
    var writerStream = fs.createWriteStream('output.txt');
    
    //       
    //    input.txt  output.txt    
    readerStream.pipe(writerStream);
    
    console.log("      ");

    チェーンフロー:
    チェーンは、出力ストリームを別のストリームに接続し、複数の対のストリーム操作チェーンを作成するメカニズムです.チェーンフローは、一般的にパイプ操作に使用されます.
    次に、パイプとチェーンでファイルを圧縮して解凍します.
    var fs = require("fs");
    var zlib = require('zlib');
    
    //    input.txt     input.txt.gz
    fs.createReadStream('input.txt')
        .pipe(zlib.createGzip())
        .pipe(fs.createWriteStream('input.txt.gz'));
    
    console.log("");

    実行すると圧縮ファイルが表示されます
    4.デバッグ:
    デバッグ方法:
  • console.log
  • ブレークポイントデバッグ:node debuggerまたはnode inspectorまたはvscode
  • テスト駆動開発