我正在尝试将使用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
答案 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
函数),否则确实有一种将范围限制为单个模块的好方法。
如果这是一个问题,你可能还想放入一个条件来防止同一个文件被“加载”两次。
最后,尽管你说你不想这样做,但从长远来看,重写代码模块的代码可能非常值得。我不会直接拒绝它。