需要从内存,而不是从磁盘模块 – 这可能吗?
我想从内存中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中的代码。