NodeJSのモジュール原理
1740 ワード
最近ずっとNode JSを使っていますが、ネットでコードを見ました.Node JSモジュールのロードの原理を完璧に解釈しました.深く追究していくと、多くのものを解釈しています.Jsモジュール化プログラミング、クローズドの本当の強さなど.余談はさておき、このコードを見てみましょう.
私たちがrequireを通じてJsのモジュール化プログラムを実現できるのは、閉包の存在のおかげです.クローズドは、伝達関数呼び出しが終了し、関数オブジェクトに戻った後も、例のnameのようにローカル変数にアクセスすることができます.データベースConnectionオブジェクト、またはサービスServiceオブジェクトであれば、exportsを通じて、他のJsファイルで使用することができます.コードはファイルから完全に分離されます.
この例では、サーバーだけでなく、ブラウザクライアントでもNodeの原理を学ぶことができ、Jsのモジュール化プログラムを行うことができます.もちろん、これはプロジェクトの複雑さを見て、すべてのシーンを適用するのではありません.
// - hello.js
void function() {
var mapping = {}, cache = {};
window.define = function(id, func) {
mapping[id] = func
};
window.require = function(id) {
if (!/\.js$/.test(id)) {
id += ".js"
}
if (cache[id]) {
return cache[id]
} else {
return cache[id] = mapping[id]()
}
}
}();
define("js/module/hello.js", function(exports) {
exports = {}; var name = 'Hello Module'
exports.sayHi = function() {
alert("Hi, this is "+ name +" !")
};
return exports
});
// - main.js
var hello = require('js/module/hello');
hello.sayHi();
コードを少し書き換えました.もっとはっきり見えるように、このコードはグローバルオブジェクトwindowに結び付けられています.defineとrequire、Nodeコードを書いた人はきっと慣れないと思います.モジュールが必要な時、requireを使ってそれをロードします.元のモジュールはhttp、expressなどです.自分で書いたJsファイルモジュールを相対パスでロードすることもできます.Nodeはモジュールローディングを実現する時、優先的にnode_を探します.modulesディレクトリを繰り返して探して、最後に環境変数によってnodeをインストールするディレクトリでグローバルモジュール検索を実行します.Nodeがモジュールを見つけた後、初めてのローディングは比較的遅くなりますが、一旦ローディングするとキャッシュされます.ここで作ったcacheとmapのような役割をして、再検索はもっと速くなります.したがって、Nodeはrequireを使用してモジュールをロードします.最初はブロック式で、キャッシュした後は非同期的にブロックされます.私たちがrequireを通じてJsのモジュール化プログラムを実現できるのは、閉包の存在のおかげです.クローズドは、伝達関数呼び出しが終了し、関数オブジェクトに戻った後も、例のnameのようにローカル変数にアクセスすることができます.データベースConnectionオブジェクト、またはサービスServiceオブジェクトであれば、exportsを通じて、他のJsファイルで使用することができます.コードはファイルから完全に分離されます.
この例では、サーバーだけでなく、ブラウザクライアントでもNodeの原理を学ぶことができ、Jsのモジュール化プログラムを行うことができます.もちろん、これはプロジェクトの複雑さを見て、すべてのシーンを適用するのではありません.