ホームページ >ウェブフロントエンド >jsチュートリアル >私から Nodejs を学ぶ (3) --- Node.js module_javascript スキル

私から Nodejs を学ぶ (3) --- Node.js module_javascript スキル

WBOY
WBOYオリジナル
2016-05-16 16:47:001235ブラウズ

紹介と情報

Node.js の公式 API を通じて、Node.js 自体が多くのコア モジュール http://nodejs.org/api/ を提供していることがわかります。これらのコア モジュールはバイナリ ファイルにコンパイルされており、require('モジュール名) ') 取得します。コア モジュールの読み込み優先度が最も高くなります (これは、コア モジュールと同じ名前のモジュールがある場合に反映されます)

(今回は主にカスタムモジュールについて話します)

Node.js には、ファイル モジュールと呼ばれるタイプのモジュールもあります。これは、JavaScript コード ファイル (ファイル拡張子として .js)、JSON 形式のテキスト ファイル (ファイル拡張子として .json)、または編集されたファイルにすることができます。 C/C ファイル (ファイル拡張子として .node);

ファイル モジュールのアクセス方法は、require('/filename.suffix') require('./filename.suffix') requrie('../filename.suffix') を介してアクセスします。ファイル サフィックスは省略できます。 「/」で始まる場合は絶対パスでロードすることを意味し、「./」で始まる「../」で始まる場合は相対パスでロードすることを意味し、「./」で始まる場合は同じディレクトリ内のファイルをロードすることを意味します。 🎜>

前述したように、Nodejs は優先度の js ファイル > json ファイル >

をロードしようとします。

カスタムモジュールを作成する

カウンターを例に挙げます

私から Nodejs を学ぶ (3) --- Node.js module_javascript スキル

コードをコピーします コードは次のとおりです。
var OutputVal = 0;
var increment = 1; //Increment
/* 出力値を設定します*/
function seOutputVal (val) {
OutputVal = val;
}
/* 増分を設定します*/
function setIncrement(incrementVal){
increment = incrementVal;
}
/* Output*/
function printNextCount()
{
OutputVal = increment;
console.log(outputVal) ;
}
function printOutputVal() {
console.log(outputVal);
}
exports.seOutputVal = seOutputVal;
exports.setIncrement = setIncrement;
module.exports.printNextCount = printNextCount;
カスタム モジュールのサンプル ソース コード


この例の焦点は、外部アクセス用のインターフェイスを提供するエクスポートと module.exports です。効果を確認するために以下を呼び出してみましょう。

カスタムモジュールの呼び出し

私から Nodejs を学ぶ (3) --- Node.js module_javascript スキル

/*
Node.jsファイルがモジュールである場合、このファイルは Javascript コード、JSON、またはコンパイルされた C/C 拡張機能である可能性があります。
2 つの重要なオブジェクト:
require は外部からモジュールを取得します
エクスポートはモジュール インターフェイスを公開します
*/
var counter = require('./1_modules_custom_counter');
console.log('モジュール [1_modules_custom_counter] への最初の呼び出し');
counter.seOutputVal(10) //10 から始まるカウントを設定します
counter.setIncrement (10); ();
counter.printNextCount();
counter.printNextCount();
counter.printNextCount();
/*
同じモジュールを複数回呼び出す必要があります 繰り返しロードされません
*/
var counter = require('./1_modules_custom_counter');
console.log('モジュール [1_modules_custom_counter] への 2 回目の呼び出し');
counter.printNextCount( );
カスタムソースコードを呼び出すモード

実行すると、exports および module.exports を通じて公開されるすべてのメソッドにアクセスできることがわかります。

例でわかるように、require('./1_modules_custom_counter') を通じてモジュールを 2 回取得しましたが、printNextCount() メソッドは 2 回目の参照後に 60 から開始されました~~~

その理由は、node.js が requirerequire を通じて同じモジュールを複数回呼び出す場合、Node.js はファイル名に基づいてロードされたすべてのファイル モジュールをキャッシュするため、再ロードされないためです。 >

注: ファイル名によるキャッシュは実際のファイル名を参照し、受信パス形式が異なるだけで別のファイルとはみなされません。

私が作成した 1_modules_custom_counter ファイルには printOutputVal() メソッドがありますが、これはエクスポートや module.exports を介した外部パブリック アクセス メソッドを提供しません。

1_modules_load ファイルに直接アクセスして実行するとどうなりますか?

答えは次のとおりです: TypeError: オブジェクト # にはメソッド 'printOutputVal' がありません

exports と module.exports の違い

上記の例の後は、exports および module.exports パブリック メソッドを通じてアクセスできるようになります。どちらも効果は得られるので、多少の違いはあるはずです~~~ 例を見てみましょう!

私から Nodejs を学ぶ (3) --- Node.js module_javascript スキル

コードをコピーします コードは次のとおりです。
var counter = 0; .printNextCount = function (){
counter = 2;
console.log(counter);
}
var isEq = (exports === module.exports);
console.log (isEq) ;
2_modules_diff_exports.js ファイルのソース コード


新しい 2_modules_diff_exports_load.js ファイルを作成して名前を付けましょう

私から Nodejs を学ぶ (3) --- Node.js module_javascript スキル

var Counter = require('./2_modules_diff_exports ');
Counter.printNextCount();


呼び出し後の実行結果は上記のようになります

2_modules_diff_exports_load.js ファイル ( var isEq = (exports === module.exports); ) の isEq の値を出力し、返された true

PS: 等号が 3 つあることに注意してください。よくわからない場合は、自分で情報を確認してください。

結論を急がずに、これら 2 つの JS ファイルを module.exports の対応するコードに変更してください

// 変更された 2_modules_diff_exports.js ソース コードは次のとおりです
var counter = 0;
module.exports = function(){
counter = 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();

私から Nodejs を学ぶ (3) --- Node.js module_javascript スキル

呼び出し後の実行結果は上記のようになります

2_modules_diff_exports_load.js ファイル ( var isEq = (exports === module.exports); ) の isEq の値を出力したところ、 false が返されました。これは、以前に取得した結果と矛盾しています。

PS: Counter.printNextCount() を使用してアクセスしないでください。エラー メッセージが表示されるだけです

API は説明を提供します

http://nodejs.org/api/modules.html

エクスポートは module.exports への参照であるため、コンストラクターなどの単一の項目をエクスポートする場合は、代わりに module.exports を直接使用する必要があることに注意してください。
エクスポートは単なる module.exports です。アドレス参照。 Nodejs は module.exports のポイントのみをエクスポートします。exports ポインターが変更された場合、exports は module.exports をポイントしなくなったことを意味するため、エクスポートされなくなります

他の理解を参照してください:

http://www.hacksparrow.com/node-js-exports-vs-module-exports.html

http://zihua.li/2012/03/use-module-exports-or-exports-in-node/

module.exports は実際のインターフェースであり、exports はその補助ツールにすぎません。最終的に呼び出しに返されるのは、exports ではなく module.exports です。
エクスポートによって収集されたすべての属性とメソッドは Module.exports に割り当てられます。もちろん、これには前提があります。つまり、module.exports 自体にはプロパティやメソッドがありません。
module.exports にすでにいくつかのプロパティとメソッドがある場合、exports によって収集された情報は無視されます。

exports と module.exports は

をカバーします

上記でも、基本的には、exports と module.exports の関係と違いを理解していますが、printNextCount() メソッドに対して、exports と module.exports が同時に存在する場合、結果はどうなりますか?

私から Nodejs を学ぶ (3) --- Node.js module_javascript スキル

通話結果

私から Nodejs を学ぶ (3) --- Node.js module_javascript スキル

結果からエラーが報告されていないことがわかり、この方法で定義できることを示していますが、最終的には module.exports がエクスポートをオーバーライドします

結果はエラーを報告しませんが、この方法で使用すると開発中に必ず問題が発生するため、

1. module.exports とexports を個別に定義しないことをお勧めします

2. NodeJs 開発者は、module.exports を使用してオブジェクトをエクスポートし、exports

を使用して複数のメソッドと変数をエクスポートすることをお勧めします。

その他...

API には他にもメソッドが用意されているので、詳細は説明しません。上記の例に基づいて、出力すればすぐにわかります。

モジュール.id

文字列型のモジュール識別子 (通常は完全に解析されたファイル名) を返します

モジュール.ファイル名

完全に解析された文字列型のファイル名を返します

Module.loaded

ロードが完了したかどうかを示すブール型を返します

module.parent

このモジュールを参照するモジュールを返します

module.children

このモジュールによって参照されるすべてのモジュール オブジェクトの配列を返します

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。