2013-06-04 39 views
1

我试图将使用V8(D8)二进制文件构建的JS应用程序转换为节点。NodeJS运行所有包含在相同的范围/上下文

在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

回答

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函数)。

如果这是一个问题,您可能还需要添加一个条件来防止同一个文件被“加载”两次。

最后,即使你说你不想要,重新编写模块范例的代码很可能在长期运行中是值得的。我不会直接拒绝它。