descarregamento de código / módulos

Estou curioso para saber se existe uma boa maneira de descarregar um módulo depois de usá-lo. Eu tenho alguns casos onde eu preciso usar módulos que trazem muito código, mas eles são usados ​​raramente (digamos como uma ferramenta de administração), mas eu hesito em usá-los porque depois eles presumivelmente desperdiçam memory que poderia ser melhor usado em outro lugar. Existe alguma maneira de descarregá-los, seja explicitamente ou permitindo que o sistema faça isso quando eles não foram usados ​​por um tempo?

Sim, é possível acessar o cache do módulo diretamente:

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

Observe que, se seu código contiver uma referência ao que foi exposto por esses módulos que você deseja eliminar, ele não será limpo.

(Como um aparte: Sob a superfície, require.resolve e require.cache são apenas proxies para Module._resolveFilename e Module._cache respectivamente, com Module sendo o carregador do módulo principal, ou seja, require('module') .)

Você pode fazer algo assim para “descarregar” um módulo do nó:

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

"Descarregando" um módulo de nó significa que você está "excluindo" sua input do nó requer cache. O fragment acima exclui transitivamente um módulo de nó do cache e todos os módulos associados (módulos filhos).

No meu caso, eu estava exigindo "index.js" que, ao mesmo tempo, exigia "/lib/.js". Eu queria testar a boot de "index.js" (e, portanto, o único outro módulo sendo necessário lá que era /lib/.js). A exclusão de "index.js" do cache não foi suficiente porque o cache manteve uma referência separada a "/lib/.js" e fez com que o módulo "/lib/.js" não fosse carregado novamente de seu arquivo.

O código acima pode certamente excluir do cache outros módulos dos quais este módulo depende (isso é realmente o que eu queria, mas você pode não querer fazer isso para outros módulos como "fs", "path" ou mesmo "sublinhado").

Você sempre pode estender esse método para aceitar uma lista de módulos que você não deseja excluir ou um filtro que você poderia aplicar ao "caminho" do módulo resolvido. Você pode dizer: não excluir módulos do nó principal (uma lista de nomes de módulos do nó principal está disponível como um pacote npm: https://www.npmjs.com/package/node-core-module-names ) ou não delete qualquer um dos pacotes em node_modules, etc etc .. Isso poderia ser um filtro dentro da function, mas é a mesma lógica.