是否可以在JavaScript(node.js)中导入变量?

时间:2014-02-04 20:42:56

标签: javascript node.js

我在 app.js

中有变量
var G = {};
module.exports = G;

var DATA = G.DATA = 'DATA';
var F1 = G.F1 = function(val)
{
  return val;
};

通过这种方式,我可以在对象G下导出变量,同时可以直接写入DATA不带G.前缀的变量。

到目前为止一切顺利。

现在,我想在 app.js 中为test.js运行测试

var G = require('./app.js');
console.log(G.DATA);  // -> DATA

这样做有效,但我也希望直接使用DATA前缀G.来编写console.log(DATA); // -> DATA前缀var DATA = G.DATA;

当然,我可以这样做

每个变量(属性)导出和所需模块G对象的

G,但显然,手动将每个变量添加到测试文件以对应function对象是一个繁琐的过程。

有没有办法自动完成?

到目前为止,我很痛苦,因为

JS varvar括在自己的范围内,因此理论上没有办法为每个对象属性提供一个辅助函数eval

感谢。

PS。我想避免任何VM或{{1}}节点解决方案。我过去曾经尝试过,而且问题太多了。

1 个答案:

答案 0 :(得分:6)

  

我可以为每个属性导出和所需的模块G对象分配局部变量,但显然,手动将每个变量添加到测试文件以对应G对象是一个繁琐的过程。

不,这就是应该如何运作的。您 - 只有您 - 负责模块范围中存在的局部变量。包含模块的“导出变量”中的任何更改都不会破坏您的代码。

访问导入模块的属性(使用自选名称)是可行的方法。这与Python的import appimport app as g完全相同。

如果您想要某些特定属性作为局部变量,您通常会手动选择它们,就像在Python的from app import DATA, F1中一样。在JS中,您需要multiple var statement,就像您在问题中显示的那样。但是,有一个名为destructuring assignment的语法功能可以使其更加流畅。您可以在JavaScript 1.7+ (Gecko)CoffeeScriptEcmaScript 6

中使用此功能
var {DATA, F1} = require("app.js");
  

有没有办法自动完成?

是和否。你不应该这样做,但你可以 - 就像Python的皱眉from app import *一样。引用what they say,这同样适用于JavaScript:

  

[它]可能会在解释器中引入一组未知的名称   隐藏你已定义的一些东西。

     

请注意,一般来说,从模块或导入*的做法   包裹是不受欢迎的,因为它经常会导致代码难以理解。   但是,可以使用它来保存交互式会话中的输入。

在JavaScript中,您可以 [1] use the with-statement

with (require("app.js")) {
    …
}

[1]:Not in ES5.1 strict mode,但建议用于优化