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

标签 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);

环境.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/

相关文章:

angularjs - MongoDB - InsertOne() 获取 InsertID

javascript - Angular如何向 Node 发送get请求

javascript - 具有属于给定插件实例的 "local"变量的 jQuery 插件

javascript - 为什么没有在内容脚本中应用某些 CSS?

javascript - 来自 API 的 Promise.all 拒绝

javascript - BottomNavigationView 的菜单未选择

javascript - 如果选中复选框,请按 Enter 键提交表单

node.js - 所有未全局安装的npm包都不能直接执行

c++ - 通过 id 访问 QML 槽中的嵌套对象(从 C++ 调用)

c - 如何将局部结构传递给函数?