6

require(...)node.js 中的参数是文件名。如果我在字符串中有一个模块源代码 code,我可以以某种方式从该字符串调用require(code)和加载函数吗?

4

2 回答 2

2

我把它放到一个函数中以供重用。它基于随机哈希在 os temp 目录中创建一个文件,需要它,然后将其删除。

var fs     = require('fs'),
    os     = require('os'),
    crypto = require('crypto');

function requireString(moduleString) {
  var token           = crypto.randomBytes(20).toString('hex'),
      filename        = os.tmpdir() + '/' + token + '.js',
      requiredModule  = false;

  // write, require, delete
  fs.writeFileSync(filename, moduleString);
  requiredModule = require(filename);
  fs.unlinkSync(filename);

  return requiredModule;
}

然后你可以这样做:

var carString = "exports.start = function(){ console.log('start'); };",
    car       = requireString(carString);

console.log("Car:", car);

我认为这仍然是一种解决方法,但使用起来更方便。

于 2013-06-13T11:16:10.650 回答
1

解决方法可能是将模块源代码写入临时文件./tmp-file.jsrequire('./tmp-file')然后删除该文件。

这可能不是最优的,因为您要么必须同步阻塞和写入文件,要么将需要该模块的所有内容放在异步写入的回调中。

异步文件写入的工作示例(要点 - 还包括同步文件写入):

var http = require('http');
var fs = require('fs');

var helloModuleString = "exports.world = function() { return 'Hello World\\n'; }";
fs.writeFile('./hello.js', helloModuleString, function (err) {
  if (err) return console.log(err);
  var hello = require('./hello');

  http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end(hello.world());
  }).listen(1337, '127.0.0.1');

  console.log('Server running at http://127.0.0.1:1337/');
});

结果是:

$ curl 127.0.0.1:1337
> Hello World
于 2012-08-23T16:21:36.057 回答