node.js require() キャッシュ - 無効にすることは可能ですか? 質問する

node.js require() キャッシュ - 無効にすることは可能ですか? 質問する

node.js ドキュメントより:

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

このキャッシュを無効にする方法はありますか? つまり、ユニット テストの場合、各テストを新しいオブジェクトで実行したいのです。

ベストアンサー1

循環依存関係がある場合でも、 require.cache 内のエントリは問題なく常に安全に削除できます。削除すると、モジュール オブジェクト自体ではなく、キャッシュされたモジュール オブジェクトへの参照のみが削除されるため、循環依存関係の場合はこのモジュール オブジェクトを参照するオブジェクトがまだ存在するため、モジュール オブジェクトは GC されません。

次のような状況を想定します。

スクリプト a.js:

var b=require('./b.js').b;
exports.a='a from a.js';
exports.b=b;

スクリプトb.js:

var a=require('./a.js').a;
exports.b='b from b.js';
exports.a=a;

あなたがそうするとき:

var a=require('./a.js')
var b=require('./b.js')

以下が得られます:

> a
{ a: 'a from a.js', b: 'b from b.js' }
> b
{ b: 'b from b.js', a: undefined }

ここで、b.js を編集します。

var a=require('./a.js').a;
exports.b='b from b.js. changed value';
exports.a=a;

そして、やります:

delete require.cache[require.resolve('./b.js')]
b=require('./b.js')

以下が得られます:

> a
{ a: 'a from a.js', b: 'b from b.js' }
> b
{ b: 'b from b.js. changed value',
  a: 'a from a.js' }

===

上記は、node.js を直接実行する場合有効です。ただし、jestなど、独自のモジュール キャッシュ システムを持つツールを使用する場合、正しい記述は次のようになります。

jest.resetModules();

おすすめ記事