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.

19voto

fedorqui Punkte 249453

Die Lösungen sind zu verwenden:

delete require.cache[require.resolve(<path of your script>)]

Hier finden Sie einige grundlegende Erklärungen für diejenigen, die, wie ich, ein wenig neu in diesem Bereich sind:

Angenommen, Sie haben einen Dummy example.js im Wurzelverzeichnis Ihres Verzeichnisses:

exports.message = "hi";
exports.say = function () {
  console.log(message);
}

Dann werden Sie require() wie diese:

$ node
> require('./example.js')
{ message: 'hi', say: [Function] }

Wenn Sie dann eine Zeile wie diese zu example.js :

exports.message = "hi";
exports.say = function () {
  console.log(message);
}

exports.farewell = "bye!";      // this line is added later on

Und weiter in der Konsole, das Modul wird nicht aktualisiert:

> require('./example.js')
{ message: 'hi', say: [Function] }

In diesem Fall können Sie delete require.cache[require.resolve()] angegeben in Wuff's Antwort :

> delete require.cache[require.resolve('./example.js')]
true
> require('./example.js')
{ message: 'hi', say: [Function], farewell: 'bye!' }

Der Cache wird also bereinigt und die require() erfasst den Inhalt der Datei erneut und lädt alle aktuellen Werte.

5voto

SavoryBytes Punkte 33921

neu verkabeln eignet sich hervorragend für diesen Anwendungsfall, da Sie bei jedem Aufruf eine neue Instanz erhalten. Einfache Dependency Injection für Node.js Unit Testing.

rewire fügt den Modulen einen speziellen Setter und Getter hinzu, so dass Sie ihr Verhalten für bessere Unit-Tests ändern können. Sie können

Mocks für andere Module oder Globals wie process einfügen private Variablen durchsickern lassen Variablen innerhalb des Moduls außer Kraft setzen. rewire lädt die Datei nicht und wertet den Inhalt nicht aus, um den require-Mechanismus von Node zu emulieren. Vielmehr verwendet es Nodes eigenes require zum Laden des Moduls. Daher verhält sich Ihr Modul in Ihrer Testumgebung genau so wie unter normalen Umständen (mit Ausnahme Ihrer Änderungen).

Gute Nachrichten für alle Koffein-Süchtigen: rewire funktioniert auch mit Coffee-Script. Beachten Sie, dass CoffeeScript in diesem Fall in Ihren devDependencies aufgeführt sein muss.

4voto

Henry Tseng Punkte 2903

Ja, Sie können den Cache ungültig machen.

Der Cache wird in einem Objekt namens require.cache gespeichert, auf das Sie direkt über den Dateinamen zugreifen können (z. B. - /projects/app/home/index.js im Gegensatz zu ./home die Sie in einer require('./home') Anweisung).

delete require.cache['/projects/app/home/index.js'];

Unser Team hat das folgende Modul für nützlich befunden. Um bestimmte Gruppen von Modulen ungültig zu machen.

https://www.npmjs.com/package/node-resource

4voto

Krzysztof Wende Punkte 3188

Ich würde die Antwort von luff um eine weitere Zeile ergänzen und den Parameternamen ändern:

function requireCached(_module){
    var l = module.children.length;
    for (var i = 0; i < l; i++)
    {
        if (module.children[i].id === require.resolve(_module))
        {
            module.children.splice(i, 1);
            break;
        }
    }
    delete require.cache[require.resolve(_module)];
    return require(_module)
}

4voto

atomh33ls Punkte 25880

Ich bin mir nicht 100%ig sicher, was Sie mit "ungültig machen" meinen, aber Sie können das Folgende über der require Anweisungen, um den Cache zu leeren:

Object.keys(require.cache).forEach(function(key) { delete require.cache[key] })

Entnommen aus dem Kommentar von @Dancrumb aquí

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