モジュールは Node.js アプリケーションの基本コンポーネントです。ファイルとモジュールは 1 対 1 に対応しています。Nodejs モジュールはファイルであり、このファイルは JavaScript コード、JSON、またはコンパイルされた「C/」です。 C」拡張子を使用すると、参照モジュールを「require('file path')」ステートメントで使用できます。
このチュートリアルの動作環境: Windows7 システム、nodejs バージョン 12.19.0、Dell G3 コンピューター。
Node.js ファイルが相互に呼び出せるようにするために、Node.js は単純なモジュール システムを提供します。
モジュールは Node.js アプリケーションの基本コンポーネントであり、ファイルとモジュールは 1 対 1 に対応します。言い換えれば、Node.js ファイルはモジュールであり、JavaScript コード、JSON、またはコンパイルされた C/C 拡張機能である可能性があります。
nodejs の場合、ファイルはモジュールであり、インターフェイスをエクスポートしたり、他のモジュールの組み込みを要求したりできます。
// module1.js exports.func1 = function(){ console.log('func1 from module1 called'); }
Module1 は、exports オブジェクトを通じて関数 func1 をモジュールのパブリック アクセス インターフェイスとして使用します。
//module2.js var in_module1 = require('./module1.js'); in_module1.func1(); exports.func2 = function(){ console.log('func2 from module2 called'); }
module2 には module1 in が必要です。この時点で、in_module1 は module1 のエクスポート オブジェクトと同等です。 in_module1 を使用して func1 を呼び出す場合、これは module1 のエクスポート オブジェクトを通じて func1 を呼び出すことと同じです。
同時に、module2 の独自の関数 func2 は、モジュールのエクスポート オブジェクトを通じて module2 のパブリック インターフェイスとしても機能します。
// module3.js var in_module2 = require('./module2.js'); in_module2.func2();
同様に、module3 には module2 が必要です。このとき、in_module2 は module2 のエクスポート オブジェクトに相当します。
実行結果は次のとおりです。
rlan@rlan-LA:~/nodejs/nodetest$ node module2.js func1 from module1 called rlan@rlan-LA:~/nodejs/nodetest$ node module3.js func1 from module1 called func2 from module2 called
nodejs がモジュールをインポートすると、モジュールのパブリック インターフェイスが取得されるだけでなく、次のようなファイル内の他のステートメントも参照されます。 ##module1 .js が
// module2.js console.log('this is in module2'); var in_module1 = require('./module1.js'); in_module1.func1(); exports.func2 = function(){ console.log('func2 from module2 called'); }
rlan@rlan-LA:~/nodejs/nodetest$ node module1.js this is in module1 rlan@rlan-LA:~/nodejs/nodetest$ node module2.js this is in module2 - module2 self this is in module1 - require module1 func1 from module1 called - module2 self
これで、 module2 が module1 をロードし、 module3 が module2 をロードします。 module3 が module1 を再度ロードするとどうなりますか?
// module3.js var in_module1 = require('./module1.js'); var in_module2 = require('./module2.js'); in_module1.func1(); in_module2.func2();
このとき、 module3 は最初に module1 をロードし、次に module2 をロードし、 module2 自体が module1 の部分をロードします。実行結果は
rlan@rlan-LA:~/nodejs/nodetest$ node module3.js this is in module1 - require module1 this is in module2 - require module2 func1 from module1 called - require module2 func1 from module1 called - module3 self func2 from module2 called - module3 self
になります。 module3 の要求順序が調整されている場合を見てください:
// module3.js var in_module2 = require('./module2.js'); var in_module1 = require('./module1.js'); in_module1.func1(); in_module2.func2();
実行結果は次のとおりです:
rlan@rlan-LA:~/nodejs/nodetest$ node module3.js this is in module2 - require module2 this is in module1 - require module2 func1 from module1 called - require module2 func1 from module1 called - module3 self func2 from module2 called - module3 self
nodejs は同じモジュールが別のモジュールで繰り返しロードされないように何らかのメカニズムを使用しているようです。そのため、
this is in module1
この行module3.js では 2 回読み込まれているように見えますが、1 回しか表示されません。
それでは、ループ読み込みがある場合はどうなるのでしょうか?次に、module1 に module2 を要求させます:
// module1.js console.log('this is in module1'); var in_module2 = require('./module2.js'); exports.func1 = function(){ console.log('func1 from module1 called'); }
// module2.js console.log('this is in module2'); var in_module1 = require('./module1.js'); in_module1.func1(); exports.func2 = function(){ console.log('func2 from module2 called'); }
実行結果は次のとおりです:
rlan@rlan-LA:~/nodejs/nodetest$ node module1.js this is in module1 this is in module2 /home/rlan/nodejs/nodetest/module2.js:4 in_module1.func1(); ^ TypeError: in_module1.func1 is not a function at Object.<anonymous> (/home/rlan/nodejs/nodetest/module2.js:4:12) at Module._compile (module.js:410:26) at Object.Module._extensions..js (module.js:417:10) at Module.load (module.js:344:32) at Function.Module._load (module.js:301:12) at Module.require (module.js:354:17) at require (internal/module.js:12:17) at Object.<anonymous> (/home/rlan/nodejs/nodetest/module1.js:3:18) at Module._compile (module.js:410:26) at Object.Module._extensions..js (module.js:417:10) rlan@rlan-LA:~/nodejs/nodetest$ node module2.js this is in module2 this is in module1 func1 from module1 called
nodejs は、それ自体をロードする動作を妨げているようです。 module2 を実行すると、動作は結果と同じです。 module1 が module2 をロードしていません。同じですが、エラーは報告されません。 module1 を実行しているときに、 module2 に移動して require module1 ステートメントを無視すると、 module2 が module1 の func1 を呼び出してしまい、プログラムがおかしくなってしまいました。
要約すると、nodejs でモジュールを繰り返しロードする (またはそれ自体をロードする) ネストされた require ステートメントは正しく実行できません。
[推奨学習:「
nodejs チュートリアル以上がNodejsモジュールとは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。