código / módulos de descarga

Tengo curiosidad de saber si hay alguna forma de descargar un módulo después de usarlo. Tengo algunos casos en los que necesito usar módulos que traen gran cantidad de código, pero se usan con poca frecuencia (por ejemplo, como una herramienta de administración), pero dudo en usarlos porque después, presumiblemente, desperdiciarán la memoria que podría ser mejor. utilizado en otro lugar. ¿Hay alguna forma de descargarlos, ya sea explícitamente o permitiendo que el sistema lo haga cuando no se han utilizado por un tiempo?

Sí, es posible acceder al caché del módulo directamente:

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

Tenga en cuenta que si su código lleva una referencia a lo que fue expuesto por estos módulos de los que desea deshacerse, no se limpiará.

(Como Module._resolveFilename Module._cache : Debajo de la superficie, Module._resolveFilename y Module._cache son solo proxies para Module._resolveFilename y Module._cache respectivamente, siendo Module el módulo principal loader, es decir, require('module') .

Puede hacer algo como esto para “descargar” un módulo de nodo:

 /** * 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]; } } 

"Descargar" un módulo de nodo significa que está "borrando" su entrada del nodo requiere caché. El fragmento anterior borra transitoriamente un módulo de nodo de la memoria caché y todos los módulos asociados (módulos secundarios).

En mi caso, requería "index.js" que, al mismo tiempo, requería "/lib/.js". Quería probar la inicialización de "index.js" (y, por lo tanto, el único otro módulo requerido allí que era /lib/.js). Eliminar "index.js" de la memoria caché no era suficiente porque la caché mantenía una referencia separada a "/lib/.js" y eso causaba que el módulo "/lib/.js" no se cargara nuevamente desde su archivo.

El código anterior ciertamente podría eliminar de la memoria caché otros módulos de los que depende este módulo (esto es realmente lo que quería, pero es posible que no desee hacer esto para otros módulos como "fs", "ruta" o incluso "subrayado").

Siempre puede extender este método para aceptar una lista de módulos que no desea eliminar o un filtro que puede aplicar a la "ruta" del módulo resuelto. Puede decir: no elimine los módulos del nodo central (una lista de los nombres de los módulos del nodo central está disponible como un paquete npm: https://www.npmjs.com/package/node-core-module-names ) o no lo haga borre cualquiera de los paquetes bajo node_modules, etc. Esto podría ser un filtro dentro de la función, pero tiene la misma lógica.