我正在尝试将使用 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);
环境.js:
function writeEntity(entity) { ... }
entityID += 1;
配置文件:
var entity = readEntity(entityID);
D8 信息: http://www.sandeepdatta.com/2011/10/using-v8-javascript-shell-d8.html
最佳答案
注册一个全局的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
函数)。
如果担心的话,您可能还想加入一个条件来防止同一文件被“加载”两次。
最后,即使您说过您不想这样做,但从长远来看,为了便于管理,重写模块范式的代码可能是非常值得的。我不会直接拒绝它。
关于javascript - NodeJS 在相同的范围/上下文中运行所有包含,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16908495/