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

是否可以在JavaScript(node.js)中导入变量?,javascript,node.js,Javascript,Node.js,我在app.js中有变量: var G = {}; module.exports = G; var DATA = G.DATA = 'DATA'; var F1 = G.F1 = function(val) { return val; }; var G = require('./app.js'); console.log(G.DATA); // -> DATA 通过这种方式,我可以在对象G下导出变量,同时,可以通过写入数据直接访问变量,而无需G.前缀 到目前为止还不错 现在,我

我在app.js中有变量:

var G = {};
module.exports = G;

var DATA = G.DATA = 'DATA';
var F1 = G.F1 = function(val)
{
  return val;
};
var G = require('./app.js');
console.log(G.DATA);  // -> DATA
通过这种方式,我可以在对象
G
下导出变量,同时,可以通过写入
数据
直接访问变量,而无需
G.
前缀

到目前为止还不错

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

var G = {};
module.exports = G;

var DATA = G.DATA = 'DATA';
var F1 = G.F1 = function(val)
{
  return val;
};
var G = require('./app.js');
console.log(G.DATA);  // -> DATA
这是可行的,但我也希望通过写入
DATA
直接访问变量,而不使用
G.
前缀,比如
console.log(DATA);//->数据

当然,我会喜欢的

var DATA=G.DATA
对于每个变量(属性)导出&必需模块
G
对象,但显然手动将每个变量添加到测试文件以对应
G
对象是一个繁琐的过程

有没有什么方法可以自动做到这一点

到目前为止,我是悲观主义者

JS
function
var
包含在自己的范围内,因此理论上,对于每个对象属性,都不可能有一个帮助函数来
var

谢谢

另外,我希望避免节点解决方案的任何
eval
VM
。我过去试过,但问题太多了

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

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

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

如果希望某些特定属性作为局部变量,通常会手动选择它们,如Python的“应用程序导入数据”F1中的
。在JS中,您将需要一个类似于您在问题中显示的问题。但是,有一个名为的语法特性,它将使这更流畅。您可以在中使用,或:

有没有什么方法可以自动做到这一点

是和否。你不应该这样做,但你可以——就像Python对app import*
中的
表示不满一样。举个例子,JavaScript也是如此:

[它]可能会向解释器中引入一组未知的名称 隐藏一些您已经定义的内容

请注意,通常情况下,从模块或 软件包是不受欢迎的,因为它经常导致可读性差的代码。 但是,可以使用它来保存交互式会话中的键入

在JavaScript中,您可以[1]:


[1] :,虽然-这是一个推荐用于优化的方法

这通常是一个坏主意。请解释为什么您想直接访问这些变量,这样我们可以建议一个更好的方法。好的,我的项目基本上是JS之上的一个解释器,比如
咖啡脚本
,在测试过程中,我希望有一个变量
DATA
作为
DATA
而不是
G.DATA
。到目前为止,我在同一个
app.js
文件中有一个测试代码,但如果可能的话,我想将对象中的变量(在本例中为
G
)导出到一个单独的文件-
test.js
。对象中没有变量,只有属性,它们是完全不同的东西。您仍然可以在test.js中为(k in G){console.log(k,G[k]);}
执行
(如果您的测试是显示G的属性值的话)。这个主意不好,但问题很好:-)谢谢您的详细指导。