385 Stimmen

node.js require() cache - möglich, ungültig zu machen?

Aus der node.js-Dokumentation:

Module werden nach dem ersten Laden zwischengespeichert. Das bedeutet (unter anderem), dass bei jedem Aufruf von require('foo') genau das gleiche Objekt zurückgegeben wird, wenn es in dieselbe Datei aufgelöst wird.

Gibt es eine Möglichkeit, diesen Cache ungültig zu machen? d.h. für Unit-Tests möchte ich, dass jeder Test auf ein neues Objekt arbeitet.

4voto

YairTawil Punkte 3488

requireUncached mit relativem Pfad:

const requireUncached = require => module => {
  delete require.cache[require.resolve(module)];
  return require(module);
};

module.exports = requireUncached;

requireUncached mit relativem Pfad aufzurufen:

const requireUncached = require('../helpers/require_uncached')(require);
const myModule = requireUncached('./myModule');

3voto

bentael Punkte 1917

Ich konnte den Code nicht sauber in den Kommentar einer Antwort einfügen. Aber ich würde die Antwort von @Ben Barkay verwenden und dies in die require.uncache Funktion.

    // see https://github.com/joyent/node/issues/8266
    // use in it in @Ben Barkay's require.uncache function or along with it. whatever
    Object.keys(module.constructor._pathCache).forEach(function(cacheKey) {
        if ( cacheKey.indexOf(moduleName) > -1 ) {
            delete module.constructor._pathCache[ cacheKey ];
        }
    }); 

Angenommen, Sie haben ein Modul angefordert, es dann deinstalliert, dann dasselbe Modul neu installiert, aber eine andere Version verwendet, die ein anderes Hauptskript in ihrer package.json hat, dann wird das nächste require fehlschlagen, weil dieses Hauptskript nicht existiert, weil es in Module._pathCache

2voto

Kyuuhachi Punkte 561

Wenn Sie möchten, dass ein Modul einfach nie gecached wird (manchmal nützlich für die Entwicklung, aber denken Sie daran, es zu entfernen, wenn Sie fertig sind!), können Sie einfach delete require.cache[module.id]; im Inneren des Moduls.

2voto

unsynchronized Punkte 4729

Hier ist meine Version von diese Antwort die dafür sorgt, dass eine Datei nicht geladen wird, wenn sie (z. B.) Syntaxfehler aufweist

function reacquire(module) {
const fullpath  = require.resolve(module);
const backup = require.cache[fullpath];
delete require.cache[fullpath];

 try {
   const newcopy = require(module);
   console.log("reqcquired:",module,typeof newcopy);
   return newcopy;
 } catch (e) {
    console.log("Can't reqcquire",module,":",e.message);
    require.cache[fullpath] = backup;
    return backup;
 }

}

1voto

Aqib Mumtaz Punkte 4828

Das folgende zweistufige Verfahren funktioniert bei mir einwandfrei.

Nach dem Wechsel Model Datei i-e 'mymodule.js' dynamisch, müssen Sie das vorkompilierte Modell in Mungo-Modell und laden Sie sie dann mit require-reload

Example:
        // Delete mongoose model
        delete mongoose.connection.models[thisObject.singular('mymodule')]

        // Reload model
        var reload = require('require-reload')(require);
        var entityModel = reload('./mymodule.js');

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X