NodeJS在相同的范围/上下文中运行所有包含

时间:2013-06-04 01:37:56

标签: javascript node.js scope v8

我正在尝试将使用V8(D8)二进制文件构建的JS应用程序转换为Node。

在V8中,您可以简单地load('path/to/file.js');,它将包含与当前上下文相同范围的文件。

包含的文件包含许多全局变量和函数。我真的不想重写所有这些(数百个文件,数千行)来使用Node的模块模式。

他们还需要在全局范围内读取和写入变量。

那么如何在Node中包含一个文件,但是在相同的范围/上下文中。

以下是脚本示例:

bootstrap.js:

var entityID = 12345;
load("environment.js");
function readEntity(id) { ... }
load("config.js");
writeEntity(entity);

environment.js:

function writeEntity(entity) { ... }
entityID += 1;

config.js:

var entity = readEntity(entityID);

D8信息: http://www.sandeepdatta.com/2011/10/using-v8-javascript-shell-d8.html

1 个答案:

答案 0 :(得分:2)

将全局load函数注册为程序中的第一个代码:

var fs = require('fs');

global.load = function (file) {
    var body = fs.readFileSync(file, {encoding:'utf8'});
    eval.call(global, body);
};

从代码中的任何位置调用load('./file.js');将导致文件作为全局范围的一部分加载。即使您为eval.call()提供了不同的范围,代码似乎仍然是全局的。我不确定除非你直接就地调用eval(而不是通过load函数),否则确实有一种将范围限制为单个模块的好方法。

如果这是一个问题,你可能还想放入一个条件来防止同一个文件被“加载”两次。

最后,尽管你说你不想这样做,但从长远来看,重写代码模块的代码可能非常值得。我不会直接拒绝它。