从内存而不是从磁盘需要一个模块 - 这可能吗?

时间:2013-01-16 17:02:44

标签: node.js module require

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

这有可能吗?

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

基本上,如:

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'
}

并且模块中应该是本地的任何内容都保持在本地。

因此,您可以创建一个函数require2,例如:

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

无论如何,我对更好的想法感兴趣......: - )

PS:能够从流中要求会很棒: - )

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

已经回答here:

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

TL; DR是您使用node.js中的Modules包来编译字符串中的代码。