65

たとえば、モジュールが必要で、次のようにするとします。

var b = require('./b.js');
--- do something with b ---

次に、モジュール b を削除します (つまり、キャッシュをクリーンアップします)。どうすればそれができますか?

その理由は、ノード サーバーを再起動せずにモジュールを動的にロード/削除または更新したいからです。何か案が?

------- 詳細 -------- require.cache を削除するという提案に基づいて、まだ動作しません...

what I did are few things:
1) delete require.cache[require.resolve('./b.js')];
2) loop for every require.cache's children and remove any child who is b.js
3) delete b

ただし、bを呼び出すと、まだそこにあります! それはまだアクセス可能です。私がそうしない限り:

b = {};

それを処理する良い方法かどうかはわかりません。後で、b.js が変更されている間に ('./b.js') を再度必要とするためです。キャッシュされた古い b.js (削除しようとしました) が必要ですか、それとも新しい b.js が必要ですか?

----------- さらに発見 --------------

わかった。私はさらにテストを行い、コードをいじっています..ここに私が見つけたものがあります:

1) delete require.cache[]  is essential.  Only if it is deleted, 
 then the next time I load a new b.js will take effect.
2) looping through require.cache[] and delete any entry in the 
 children with the full filename of b.js doesn't take any effect.  i.e.
u can delete or leave it.  However, I'm unsure if there is any side
effect.  I think it is a good idea to keep it clean and delete it if
there is no performance impact.
3) of course, assign b={} doesn't really necessary, but i think it is 
 useful to also keep it clean.
4

5 に答える 5

131

これを使用して、キャッシュ内のエントリを削除できます。

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

require.resolve()./b.jsは、キャッシュ キーとして使用されるのフル パスを特定します。

于 2013-03-27T18:07:45.917 に答える
4

Vuex ストアの Jest テストでキャッシュをクリアしようとしてしばらく時間がかかりましたが、うまくいきませんでした。Jest には、require.cache を削除するための手動呼び出しを必要としない独自のメカニズムがあるようです。

beforeEach(() => {
  jest.resetModules();
});

そしてテスト:

let store;

it("1", () => {
   process.env.something = true;
   store = require("@/src/store.index");
});

it("2", () => {
   process.env.something = false;
   store = require("@/src/store.index");
});

両方のストアは異なるモジュールになります。

于 2020-07-20T09:38:16.223 に答える
0

これは、クライアント側のアプリケーションに役立つことがわかりました。必要に応じてコードをインポートし、完了したらガベージ コレクションを行いたいと考えていました。これはうまくいくようです。キャッシュについてはわかりませんが、参照がなくなって削除されたら、ガベージコレクションを取得する必要がmoduleあります。CONTAINER.sayHello

/* my-module.js */

function sayHello { console.log("hello"); }

export { sayHello };

/* somewhere-else.js */

const CONTAINER = {};

import("my-module.js").then(module => {

  CONTAINER.sayHello = module.sayHello;

  CONTAINER.sayHello(); // hello

  delete CONTAINER.sayHello;

  console.log(CONTAINER.sayHello); // undefined

});
于 2019-09-15T05:35:34.207 に答える
-1

キャッシュの無効化を処理する最も簡単な方法は、公開されたキャッシュ オブジェクトを実際にリセットすることです。キャッシュから個々のエントリを削除すると、子の依存関係を反復処理するのが少し面倒になります。

require.cache = {};

于 2016-08-01T22:06:29.700 に答える