NodeJSのモジュール原理

1740 ワード

最近ずっとNode JSを使っていますが、ネットでコードを見ました.Node JSモジュールのロードの原理を完璧に解釈しました.深く追究していくと、多くのものを解釈しています.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のモジュール化プログラムを行うことができます.もちろん、これはプロジェクトの複雑さを見て、すべてのシーンを適用するのではありません.