Code / Module entladen

Ich bin neugierig, ob es eine gute Möglichkeit gibt, ein Modul nach der Verwendung zu entladen. Ich habe einige Fälle, in denen ich Module verwenden muss, die viel Code enthalten, aber sie werden nur selten verwendet (z. B. als Admin-Tool), aber ich zögere, sie zu verwenden, weil sie später nur Speicher verschwenden, der besser sein könnte an anderer Stelle verwendet. Gibt es eine Möglichkeit, sie zu löschen, entweder explizit oder indem dem System erlaubt wird, dies zu tun, wenn sie eine Zeit lang nicht benutzt wurden?

Ja, es ist möglich, direkt auf den Modul-Cache zuzugreifen:

var name = require.resolve('moduleName'); delete require.cache[name]; 

Beachten Sie, dass wenn Ihr Code einen Verweis auf das enthält, was von diesen Modulen, die Sie loswerden möchten, entfernt wurde, wird es nicht bereinigt.

(Als require.resolve : Unter der Oberfläche sind require.resolve und require.cache nur Proxies für Module._resolveFilename bzw. Module._cache , wobei Module der coremodullader ist, dh require('module') .)

Sie können so etwas tun, um ein Knotenmodul zu “entladen”:

 /** * Deletes a node module and all associated children * from node require cache * @param {string} moduleName The name of the module or * absolute/relative path to it */ function deleteModule(moduleName) { var solvedName = require.resolve(moduleName), nodeModule = require.cache[solvedName]; if (nodeModule) { for (var i = 0; i < nodeModule.children.length; i++) { var child = nodeModule.children[i]; deleteModule(child.filename); } delete require.cache[solvedName]; } } 

Das "Entladen" eines Knotenmoduls bedeutet, dass Sie seinen Eintrag aus dem Knoten "require cache" löschen. Das obige Snippet löscht ein Knotenmodul transitiv aus dem Cache und allen zugehörigen Modulen (Kindermodule).

In meinem Fall verlangte ich "index.js", das gleichzeitig "/lib/.js" erforderte. Ich wollte die Initialisierung von "index.js" testen (und daher das einzige andere Modul, das /lib/.js benötigt). Das Löschen von "index.js" aus dem Cache war nicht genug, da der Cache einen separaten Verweis auf "/lib/.js" verwaltete und dazu führte, dass das Modul "/lib/.js" nicht erneut aus seiner Datei geladen wurde.

Der Code oben kann sicherlich aus dem Cache andere Module löschen, von denen dieses Modul abhängt (das ist tatsächlich das, was ich wollte, ABER du willst das vielleicht nicht für andere Module wie "fs", "path" oder gar "underscore").

Sie können diese Methode immer erweitern, um eine Liste von Modulen zu akzeptieren, die Sie nicht löschen möchten, oder einen Filter, den Sie auf den "Pfad" des aufgetriggersen Moduls anwenden können. Sie können sagen: Löschen Sie keine coreknotenmodule (eine Liste der coreknotenmodulnamen ist als npm-Paket verfügbar: https://www.npmjs.com/package/node-core-module-names ) oder nicht Löschen Sie eines der Pakete unter node_modules, etc etc .. Dies könnte ein Filter innerhalb der function sein, aber es ist die gleiche Logik.