7

NodeJSでプロジェクトをビルドし始めて、疑問に思っていました

  • NodeJSは、同じモジュールを必要とするモジュールに対して、すでにロードされているモジュールを再利用しますか?
  • モジュールは、それらを必要とするモジュール間で同じ「状態」を維持しますか?
  • どちらかまたは両方が発生した場合のキャッチは何ですか?ループsetTimeout非同期コードに似た問題に直面していますか?

現在、4つのファイルでテストしました

  • common.js

    var i = 0;
    
    function add(v){i += v;}
    function view(){console.log(i);}
    
    module.exports = {
        add : add,
        view : view
    }
    
  • a.jsb.js

    exports.common = require('./common.js');
    
  • server.js

    var a = require('./a.js'),
        b = require('./b.js');
    
    function start(){
        http.createServer(function (req, res) {
    
            a.common.add(2);
            a.common.view();
    
            b.common.add(4);
            b.common.view();
    
            a.common.view();
    
    
            res.writeHead(200, {'Content-Type': 'text/plain'});
            res.end('Hello World\n');
        }).listen(config.port, config.address || '127.0.0.1');
        console.log('Server running');
    }
    

結果は私にそれがすることを示唆する結果を与えます:

2  - view() via a.js on favicon request
6  - view() via b.js on favicon request
6  - view() via a.js on favicon request
8  - view() via a.js
12 - view() via b.js
12 - view() via a.js

2つの別々のモジュールで必要な場合でも、モジュールを共有しているように見え、モジュール間およびリクエスト間で状態を維持しているようです。

4

2 に答える 2

5

Node.jsは、明らかなパフォーマンス上の理由からモジュールをキャッシュします。

Node.js Webサイトからのステートメント:

モジュールは、最初にロードされた後にキャッシュされます。これは、(とりわけ)require('foo')同じファイルに解決される場合、へのすべての呼び出しがまったく同じオブジェクトを返すことを意味します。

を複数回呼び出してrequire('foo')も、モジュールコードが複数回実行されることはありません。これは重要な機能です。これを使用すると、「部分的に完了した」オブジェクトを返すことができるため、サイクルが発生する場合でも推移的な依存関係をロードできます。モジュールにコードを複数回実行させる場合は、関数をエクスポートして、その関数を呼び出します。

于 2012-08-21T11:33:21.023 に答える
2

はい、すべてのモジュールは、最初にロードされた後にキャッシュされます。モジュールのキャッシュについて詳しくは、node.jsの公式ドキュメントをご覧ください。

于 2012-08-21T11:33:10.037 に答える