是否有可能在JavaScript(node.js)中导入variables?

我有app.jsvariables:

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

通过这种方式,我可以将对象G下的variables导出,同时可以直接访问该variables,直接写入无G.前缀的DATA

到现在为止还挺好。

现在,我想在test.js运行app.jstesting

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

这个工作,但我也想访问variables直接写DATA没有G.前缀如console.log(DATA); // -> DATA console.log(DATA); // -> DATA

当然,我可以这样做

var DATA = G.DATA; 为每个variables(属性)导出&所需的模块G对象,但显然,将每个variables手动添加到testing文件以对应G对象是一个繁琐的过程。

有没有办法自动做到这一点?

到目前为止,我是悲观的

JS function var封装在自己的范围内,所以理论上无法为每个对象属性都赋予一个辅助函数var

谢谢。

PS。 我想避免任何节点解决scheme的evalVM 。 过去我曾经尝试过,而且问题太多了。

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

不,这是应该如何工作。 你 – 只有你 – 负责模块范围内存在的局部variables。 包含模块的“导出variables”不会改变你的代码。

访问导入模块上的属性(使用自选名称)是一种方法。 这与Python的import appimport app as g非常相当。

如果你想要一些特定的属性作为局部variables,你通常会手动select它们,就像在Python中from app import DATA, F1 。 在JS中,你将需要一个多重var语句,就像你在问题中显示的那样。 然而,有一个称为解构赋值的语法特征,这将使这更加stream畅。 您可以在JavaScript 1.7+(Gecko) , CoffeeScript或EcmaScript 6中使用它 :

 var {DATA, F1} = require("app.js"); 

有没有办法自动做到这一点?

是的,不,你不应该这样做,但你可以 – 就像Python from app import *一样皱起眉头。 引用他们的话 ,对于JavaScript也是如此:

它将一组未知的名字引入到解释器中,可能会隐藏你已经定义的一些东西。

请注意,一般来说,从模块或包导入*的做法是不被接受的,因为它经常导致代码的可读性差。 但是,可以使用它来保存交互式会话中的input。

在JavaScript中,您可以[1] 使用with -statement :

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

[1]: 不是在ES5.1的严格模式 ,但是 – 这是build议优化