はじめに
node.jsの公式APIを通じて、node.js自体が多くのコアモジュールhttp://nodejs.org/api/を提供していることがわかります。これらのコアモジュールはバイナリファイルにコンパイルされ、( 'モジュール名')を要求することで取得できます。コアモジュールの優先度が最も高くなります(同じ名前のモジュールとコアモジュールがある場合に反映されます)
(今回は主にカスタムモジュールについて話します)
node.jsには、ファイルモジュールであるタイプのモジュールもあります。ファイルモジュールは、JavaScriptコードファイル(ファイルサフィックスとして.js)、JSON形式のテキストファイル(ファイル接尾辞として。
ファイルモジュールアクセスメソッドは、require( '/filename.suffix')require( './ filename.suffix')requrie( '../ filename.suffix')を介してアクセスされ、ファイルの接尾辞は省略できます。 「/」から始めるには、「./」から始まり、「../」から始まる絶対パスがロードされ、「./」から始まることは、同じレベルのディレクトリのファイルをロードすることを意味します。
前述のファイルサフィックスは省略できます。NodeJSがロードしようとする優先jsファイル> jsonファイル> nodeファイル
カスタムモジュールを作成します
例としてカウンターを取ります
コードコピーは次のとおりです。
var outputval = 0; //出力値
var increment = 1; //インクリメント
/*出力値を設定*/
function seoutputval(val){
outputval = val;
}
/*増分を設定*/
関数setincrement(incrementval){
Increment = incrementVal;
}
/*出力*/
関数printnextcount()
{
outputval += increment;
console.log(outputval);
}
関数printoutputval(){
console.log(outputval);
}
exports.seoutputval = seoutputval;
exports.setincrement = setIncrement;
module.exports.printnextcount = printnextcount;
カスタムモジュールサンプルソースコード
この例の焦点は、エクスポートとモジュールのエクスポートです。外部アクセスインターフェイスを提供します。効果を確認するためにそれを呼びましょう。
カスタムモジュールを呼び出します
コードコピーは次のとおりです。
/*
node.jsファイルはモジュールであり、JavaScriptコード、JSON、またはコンパイルされたC/C ++拡張機能です。
2つの重要なオブジェクト:
必要なのは、外部からモジュールを取得することです
エクスポートはモジュールインターフェイスを公開します
*/
var counter = require( './ 1_modules_custom_counter');
console.log( 'モジュールへの最初の呼び出し[1_modules_custom_counter]');
counter.seoutputval(10); // 10からのカウントを設定します
counter.setincrement(10); //増分を10に設定します
counter.printnextcount();
counter.printnextcount();
counter.printnextcount();
counter.printnextcount();
/*
同じモジュールへの呼び出しが複数回繰り返し読み込まれません
*/
var counter = require( './ 1_modules_custom_counter');
console.log( 'Second Call Module [1_Modules_custom_counter]');
counter.printnextcount();
カスタムモードコールソースコード
それを実行して、エクスポートとモジュールを通じて一般に公開された両方の方法がアクセスできることを見つけてください!
例でわかるように、( './ 1_Modules_custom_counter')を要求することでモジュールを2回取得しますが、2番目の参照の後、printnextcount()メソッドを呼び出します。
その理由は、node.jsがrequererquirequireを介して同じモジュールを複数回呼び出し、繰り返し読み込まないためです。 node.jsは、ファイル名に従ってすべてのロードされたファイルモジュールをキャッシュするため、リロードされません。
注:ファイル名を介したキャッシュは、実際のファイル名を指しますが、着信パスが異なるため、異なるファイルとは見なされません。
私が作成した1_modules_custom_counterファイルには、exportまたはmodule.exportsを介してパブリックアクセス方法を提供しないprintoutputval()メソッドがあります。
1_modules_loadファイルに直接アクセスするとどうなりますか?
答えは次のとおりです。TypeRROR:Object#<Object>にはメソッド「printoutputval」がありません
エクスポートとモジュールの違い
上記の例を通じて、エクスポートとモジュールの両方がアクセスできます!両方が効果を達成できるので、少し違いがなければなりません~~~例を見てみましょう!
コードコピーは次のとおりです。
var counter = 0;
exports.printnextcount = function(){
カウンター += 2;
console.log(counter);
}
var iseq =(exports === module.exports);
console.log(iseq);
2_MODULES_DIFF_EXPORTS.JSファイルソースコード
新しい2_modules_diff_exports_load.jsファイルを作成して呼び出します
コードコピーは次のとおりです。
var counter = require( './ 2_modules_diff_exports');
counter.printnextcount();
呼び出し後、実行結果は上の図に示されています
2_modules_diff_exports_load.jsファイル(var iseq =(exports === module.exports);)、returned trueにISEQの値を出力します
PS:3つの等しい兆候があることに注意してください。自分で情報を探しているものがわからない場合!
急いで結論を出さないで、これら2つのJSファイルを対応するモジュールのコードに変更します。Exports
コードコピーは次のとおりです。
//変更された2_Modules_diff_exports.jsソースコードは次のとおりです
var counter = 0;
module.exports = function(){
カウンター += 10;
this.printnextcount = function()
{
console.log(counter);
}
}
var iseq =(exports === module.exports);
console.log(iseq);
コードコピーは次のとおりです。
//修正された2_Modules_diff_exports_load.jsファイルソースコードは次のとおりです
var counter = require( './ 2_modules_diff_exports');
var counterobj = new counter();
counterobj.printnextcount();
呼び出し後、実行結果は上の図に示されています
2_modules_diff_exports_load.jsファイル(var iseq =(exports === module.exports);)にISEQの値を出力します。
PS:counter.printnextcount()を使用しないでください。アクセスするには、エラープロンプトのみが取得されます
APIは説明を提供します
http://nodejs.org/api/modules.html
エクスポートはモジュールへの参照であることに注意してください。エクスポートは、増強のみに適しています。コンストラクターなどの単一のアイテムをエクスポートする場合は、代わりにモジュールを直接使用する必要があります。
エクスポートは、Module.Exportsへのアドレス参照にすぎません。 nodejsは、module.exportsのポインターのみをエクスポートします。エクスポートポインターが変更された場合、エクスポートがmodule.exportsを指していないため、再びエクスポートされません。
他の理解を参照してください:
http://www.hacksparrow.com/node-js-exports-vs-module-exports.html
http://zihua.li/2012/03/use-module-xports-or-exports-in-node/
module.exportsは実際のインターフェイスであり、エクスポートは単なる補助ツールです。コールへの最終的な返品は、エクスポートの代わりにmodule.exportsです。
エクスポートによって収集されたすべてのプロパティとメソッドは、module.xportsに割り当てられます。もちろん、これには前提条件があります。つまり、module.Exports自体には属性や方法がありません。
module.exportsにすでにいくつかのプロパティとメソッドがある場合、エクスポートによって収集された情報は無視されます。
エクスポートとモジュール。ExportsOverride
上記は基本的にエクスポートとモジュールの関係と違いを理解していますが、exports and module.exportsが両方のprintnextcount()メソッドに存在する場合、結果は何ですか?
結果を呼び出します
結果からわかるように、エラーはありません。つまり、このように定義できることを意味しますが、最終的にはexports上書きエクスポート
結果はエラープロデュースされませんが、このように使用すると、開発には必然的にいくつかの問題があります。
1.モジュールを定義しないことが最善です。エクスポートとエクスポートは個別に
2.NodeJS開発者は、モジュールを推奨しています。オブジェクトをエクスポートし、エクスポートして複数のメソッドと変数をエクスポートします。
他の...
APIには他にも提供されている方法があるので、詳細は説明しません。上記の例に基づいて、出力するとすぐに自分でそれを知ることができます。
module.id
型文字列のモジュール識別子を返します。これは通常、完全に解析されたファイル名です
module.filename
文字列タイプの完全に解析されたファイル名を返します
module.loaded
ブールタイプを返し、負荷が完了したかどうかを示します
module.Parent
モジュールを参照するモジュールを返します
module.children
このモジュールで参照されるすべてのモジュールオブジェクトの配列を返します