Carregar o módulo node.js da string na memory

Como eu exigiria () um arquivo se eu tivesse o conteúdo do arquivo como uma string na memory, sem gravá-lo no disco? Aqui está um exemplo:

// Load the file as a string var strFileContents = fs.readFileSync( "./myUnalteredModule.js", 'utf8' ); // Do some stuff to the files contents strFileContents[532] = '6'; // Load it as a node module (how would I do this?) var loadedModule = require( doMagic(strFileContents) ); 

 function requireFromString(src, filename) { var Module = module.constructor; var m = new Module(); m._compile(src, filename); return m.exports; } console.log(requireFromString('module.exports = { test: 1}')); 

olhe para _compile, _extensions e _load in module.js

A pergunta já foi respondida por Andrey, mas me deparei com uma falha que eu precisava resolver e que poderia ser de interesse para os outros.

Eu queria que o módulo na string memorizada fosse capaz de carregar outros módulos via require , mas o caminho do módulo foi quebrado com a solução acima (assim, por exemplo, a agulha não foi encontrada). Eu tentei encontrar uma solução elegante para manter os caminhos, usando alguma function existente, mas acabei com a fiação dos caminhos:

 function requireFromString(src, filename) { var m = new module.constructor(); m.paths = module.paths; m._compile(src, filename); return m.exports; } var codeString = 'var needle = require(\'needle\');\n' + '[...]\n' + 'exports.myFunc = myFunc;'; var virtMod = requireFromString(codeString); console.log('Available public functions: '+Object.keys(virtMod)); 

Depois disso, consegui carregar todos os módulos existentes do módulo de string. Quaisquer comentários ou melhores soluções muito apreciados!

O pacote require-from-string faz o trabalho.

Uso:

 var requireFromString = require('require-from-string'); requireFromString('module.exports = 1'); //=> 1 

Baseado nas soluções da Andrey Sidorov & Dominic, fiquei entristecido pelo fato de não poder exigir um módulo de string, então sugiro esta versão *.

Código:

 void function() { 'use strict'; const EXTENSIONS = ['.js', '.json', '.node']; var Module, path, cache, resolveFilename, demethodize, hasOwnProperty, dirname, parse, resolve, stringify, virtual; Module = require('module'); path = require('path'); cache = Module._cache; resolveFilename = Module._resolveFilename; dirname = path.dirname; parse = path.parse; resolve = path.resolve; demethodize = Function.bind.bind(Function.call); hasOwnProperty = demethodize(Object.prototype.hasOwnProperty); Module._resolveFilename = function(request, parent) { var filename; // Pre-resolution filename = resolve(parse(parent.filename).dir, request); // Adding extension, if needed if (EXTENSIONS.indexOf(parse(filename).ext) === -1) { filename += '.js'; } // If the module exists or is virtual, return the filename if (virtual || hasOwnProperty(cache, filename)) { return filename; } // Preserving the native behavior return resolveFilename.apply(Module, arguments); }; Module._register = function(request, parent, src) { var filename, module; // Enabling virtual resolution virtual = true; filename = Module._resolveFilename(request, parent); // Disabling virtual resolution virtual = false; // Conflicts management if (hasOwnProperty(cache, filename)) { error = new Error('Existing module "' + request + '"'); error.code = 'MODULE_EXISTS'; throw error; } // Module loading cache[filename] = module = new Module(filename, parent); module.filename = filename; module.paths = Module._nodeModulePaths(dirname(filename)); module._compile(stringify(src), filename); module.loaded = true; return module; }; stringify = function(src) { // If src is a function, turning to IIFE src return typeof src === 'function' ? 'void ' + src.toString() + '();' : src; }; }(); void function() { var Module, parentModule, child; Module = require('module'); // Creating a parent module from string parentModule = Module._register('parent', process.mainModule, ` module.exports = { name: module.filename, getChild: function() { return require('child'); } }; `); // Creating a child module from function Module._register('child', parentModule, function() { module.exports = { name: module.filename, getParent: function() { return module.parent.exports; } }; }); child = require('child'); console.log(child === child.getParent().getChild()); }(); 

Uso:

 void function() { var Module, parentModule, child; Module = require('module'); // Creating a parent module from string parentModule = Module._register('parent', process.mainModule, ` module.exports = { name: module.filename, getChild: function() { return require('child'); } }; `); // Creating a child module from function Module._register('child', parentModule, function() { module.exports = { name: module.filename, getParent: function() { return module.parent.exports; } }; }); child = require('child'); console.log(child === child.getParent().getChild()); }(); 

* Como você pode ver, ele contém um formatador de function que fornece uma maneira de criar alguns módulos a partir de funções.

Eu acho que a melhor maneira de abordar isso seria ter um parâmetro que você poderia definir depois …

como dentro do arquivo: myUnalteredModule.js

 exports.setChanges = function( args )... 

Então você poderia fazer:

  var loadedModule = require( 'myUnalteredModule' ); loadedModule