1

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

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

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

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

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

这是脚本的示例:

bootstrap.js:

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

环境.js:

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

配置.js:

var entity = readEntity(entityID);

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

4

1 回答 1

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

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

最后,即使您说您不想这样做,但从长远来看,为模块范例重写代码可能非常值得。我不会直接拒绝它。

于 2013-06-04T03:14:34.097 回答