node.js----基礎
26349 ワード
1.モジュールシステム
ノードのためにjsのファイルは互いに呼び出すことができます.jsは簡単なモジュールシステムを提供した.モジュールはノードです.jsアプリケーションの基本的な構成部分であり、ファイルとモジュールは一つ一つ対応しています.つまり、ノードです.jsファイルはモジュールであり、JavaScriptコード、JSON、またはコンパイルされたC/C++拡張である可能性があります.
モジュールの作成
Node.jsでは、モジュールを作成するのは簡単です.次のように'mainを作成します.js'ファイル、コードは以下の通りです.
以上の例では、コードrequire('./hello')は、現在のディレクトリのhelloを導入する.jsファイル(./は現在のディレクトリ、node.jsのデフォルト接尾辞はjs).
Node.jsはexportsとrequireの2つのオブジェクトを提供し、exportsはモジュール公開のインタフェースであり、requireは外部からモジュールのインタフェース、すなわち取得されたモジュールのexportsオブジェクトを取得するために使用される.
次にhelloを作成します.jsファイル、コードは以下の通りです.
以上の例ではhello.jsはexportsオブジェクトを介してworldをモジュールのアクセスインタフェースとしてmain.jsではrequire('./hello')でこのモジュールをロードし、helloに直接アクセスできます.jsのexportsオブジェクトのメンバー関数です.
モジュールにオブジェクトをカプセル化したい場合があります.フォーマットは次のとおりです.
例:
これにより、このオブジェクトを直接取得できます.
モジュールインタフェースの唯一の変化はmoduleを使用することである.exports=Helloがexportsに代わった.world = function(){}. モジュールを外部参照する場合、インタフェースオブジェクトは、元のexportsではなく、出力するHelloオブジェクト自体です.
サービス側のモジュールはどこにありますか?
コードにモジュールを使用していることに気づいたかもしれません.このように:
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を作成する方法:
(1)、Buffer.alloc(size[, fill[, encoding]])
一定の長さのBufferを作成するには、パラメータsize、Bufferの長さが必要です.オプションのパラメータfill、Bufferの値を入力します.Encoding:UTF-8などの符号化フォーマット;
(2)、Buffer.from(array);
新しい
(3)、Buffer.from(string[, encoding]);
与えられたJavaScript文字列
書き込みキャッシュ:
(1)、
buf.write(string[, offset[, length]][, encoding])
キャッシュ領域データの読み込み:
(1)、buf.toString([encoding[, start[, end]]])
BufferをJSONオブジェクトに変換するには:
(1)、buf.toJSON();
は、
バッファマージ:
(1)、Buffer.concat(list[, totalLength]); .戻り:
バッファ比較:
(2)、Buffer.compare(buf1, buf2);
3.Stream(ストリーム):
Streamは抽象的なインタフェースであり,ノードには多くのオブジェクトがこのインタフェースを実現している.たとえば、httpサーバに対してリクエストを開始するrequestオブジェクトはStreamであり、stdout(標準出力)である.
Node.js、Streamには4つのストリームタイプがあります.
Readable-読み取り可能な操作.
Writable-書き込み可能な操作.
Duplex-読み書き可能な操作.
Transform-オペレーションはデータに書き込まれ、結果が読み出されます.
すべてのStreamオブジェクトはEventEmitterのインスタンスです.よく使用されるイベントは次のとおりです.
Data-データが読み取り可能になったときにトリガーされます.
end-読み取り可能なデータがない場合にトリガーされます.
Error-受信および書き込み中にエラーが発生した場合にトリガーされます.
finish-すべてのデータが最下位システムに書き込まれたときにトリガーされます.
ストリームからデータを読み込むには、次の手順に従います.
inputを作成します.txtファイル
書き込みストリーム:
パイプフロー:
パイプは、入力ストリームに出力ストリームを流すメカニズムを提供します.通常、あるストリームからデータを取得し、別のストリームに渡すために使用されます.
上の写真のように、私たちは書類を水を入れたバケツにたとえて、水は書類の中の内容で、私たちは1本のパイプ(pipe)で2つのバケツを接続して、1つのバケツから別のバケツに水を流入させて、このようにゆっくりと大きな書類の複製過程を実現しました.
次の例では、あるファイルの内容を読み取り、別のファイルに書き込むことにします.
チェーンフロー:
チェーンは、出力ストリームを別のストリームに接続し、複数の対のストリーム操作チェーンを作成するメカニズムです.チェーンフローは、一般的にパイプ操作に使用されます.
次に、パイプとチェーンでファイルを圧縮して解凍します.
実行すると圧縮ファイルが表示されます
4.デバッグ:
デバッグ方法: console.log ブレークポイントデバッグ:node debuggerまたはnode inspectorまたはvscode テスト駆動開発
ノードのために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
からbuf
のoffset
の位置に書き込まれる.length
パラメータは書き込みバイト数です.buf
が文字列全体を保存するのに十分なスペースがない場合、string
の一部のみが書き込まれます.部分的に復号された文字だけは書き込まれません.let buf = Buffer.alloc(10);
let len = buf.write('zae',3,2,'utf-8'); // , , ,
console.log(buf); // 2, e
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);
buf1
とbuf2
を比較し、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');
// utf8。
readerStream.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.デバッグ:
デバッグ方法: