0

私の Node アプリでは、次のような構成ファイルを用意します。

module.exports = {
    BUILD_DIR: '/some.path',
    OTHER_CONFIG: 42,
    // ...
};

私はまた、次のようなことを行ういくつかのテストを持っています

var appConfig = require('./path/to/appConfig');
appConfig.BUILD_DIR = 'tmp/some/path';
// and stuff done with appConfig

驚いたことに、これを行うと明らかにモジュールの状態が変更されます。それを必要とする次のテストではBUILD_DIR、「tmp/some/path」に設定されます。モジュールがrequire全体でこの種の状態を持っていることに気づきませんでした。テストでこの影響を取り除くにはどうすればよいですか? また、このモジュールの状態を変更できないようにするにはどうすればよいですか? 誰かがそれをインクルードする場合、他のコードがそれに書き込んだものではなく、常にそれが定義するものを取得する必要があります。

4

2 に答える 2

1

ここで説明する理由は次のとおりです。

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

(私のものを強調)

したがって、エクスポートするオブジェクトはキャッシュされ、それを使用するコード間で共有されます。

それが望ましくない場合は、代わりに関数をエクスポートできます。

module.exports = function() {
  return {
    BUILD_DIR: '/some.path',
    OTHER_CONFIG: 42,
    // ...
  };
};

そして、requireそれは次のようになります:

var appConfig = require('./path/to/appConfig')();
于 2013-10-01T12:30:15.627 に答える