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

2 javascript node.js

我有变量app.js:

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

var DATA = G.DATA = 'DATA';
var F1 = G.F1?= function(val)
{
  return val;
};
Run Code Online (Sandbox Code Playgroud)

通过这种方式,我可以在对象下导出变量G,同时可以直接访问变量DATA而无需G.前缀.

到现在为止还挺好.

现在,我想运行一个测试app.jstest.js:

var G = require('./app.js');
console.log(G.DATA);  // -> DATA
Run Code Online (Sandbox Code Playgroud)

这有效,但我也想直接写入DATA没有G.前缀的变量console.log(DATA); // -> DATA

当然,我可以做到

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

有没有办法自动完成?

到目前为止,我从此感到悲观

JS function包含var在自己的范围内,因此理论上没有办法var为每个对象属性提供辅助函数.

谢谢.

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

Ber*_*rgi 7

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

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

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

如果你想要一些特定的属性作为局部变量,你通常会手动选择它们,就像在Python中一样from app import DATA, F1.在JS中,您需要一个多个var语句,就像您在问题中显示的语句一样.但是,有一种称为解构赋值的语法功能,这将使其更加流畅.您可以在JavaScript 1.7+(Gecko),CoffeeScriptEcmaScript 6中使用它:

var {DATA, F1} = require("app.js");
Run Code Online (Sandbox Code Playgroud)

有没有办法自动完成?

是和否.你不应该这样做,但你可以 - 就像Python的皱眉头一样from app import *.引用他们所说的内容,这同样适用于JavaScript:

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

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

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

with (require("app.js")) {
    …
}
Run Code Online (Sandbox Code Playgroud)

[1]:不是在ES5.1 严格模式下 - 建议用于优化