需要从内存,而不是从磁盘模块 – 这可能吗?

我想从内存中require一个Node.js模块,例如,因为它是在运行时生成的或从networkingstream接收的。

这可能吗?

你怎么能解决这个问题(当然,没有写入磁盘和从那里加载)?

基本上,诸如:

 var code = 'module.exports = { foo: "bar" };'; var obj = require(code); console.log(obj.foo); // => bar 

我目前唯一可以考虑的方法是使用eval函数,例如:

 var myModule = {}; eval( '(function (module) {' + ' var local = 5;' + ' module.exports = {' + ' foo: \'bar\'' + ' };' + ' module.exports.baz = \'baz\';' + '})(myModule)'); 

评估之后, myModule.exports包含导出的对象:

 { foo: 'bar', baz: 'baz' } 

任何应该在本地模块内部保持本地的东西。

因此,你可以创build一个函数require2 ,比如:

 var require2 = function (code) { var temp = {}; eval('(function (module) {' + code + '})(temp);'); return temp.exports; }; 

无论如何,我对更好的想法感兴趣… 🙂

PS:能够要求从一个stream将是真棒:-)

       

网上收集的解决方案 "需要从内存,而不是从磁盘模块 – 这可能吗?"

在没有更好的想法的情况下,我现在采用我已经在我的问题中已经描述的方法进行了一些调整,但总体思路是:

 var require2 = function (code) { var temp = {}; eval('(function (module) {' + code + '})(temp);'); return temp.exports; }; 

这已经在这里回答了:

但是,您可以在Github的require-from-string包中find更完整的实现。

TL; DR是使用node.js中的Modules包来编译string中的代码。