是否有可能在JavaScript(node.js)中导入variables?
我有app.js
variables:
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.js
的testing :
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的eval
或VM
。 过去我曾经尝试过,而且问题太多了。
我可以为每个属性导出和需要的模块G对象分配一个局部variables,但显然,将每个variables手动添加到testing文件以对应G对象是一个繁琐的过程。
不,这是应该如何工作。 你 – 只有你 – 负责模块范围内存在的局部variables。 包含模块的“导出variables”不会改变你的代码。
访问导入模块上的属性(使用自选名称)是一种方法。 这与Python的import app
或import 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议优化