一尘不染

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

javascript

我在中有变量 app.js

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

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

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

到目前为止,一切都很好。

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

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

这可行,但我也想直接写DATA没有G.前缀的变量来访问变量,例如console.log(DATA); // -> DATA

当然可以

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

有什么办法可以自动执行此操作?

到目前为止,我很悲观

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

谢谢。

PS。我想避免任何evalVM节点解决方案。我过去曾经尝试过,但问题太多了。


阅读 304

收藏
2020-05-01

共1个答案

一尘不染

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

不,这就是应该的工作方式。您-并且只有您-负责模块范围中存在哪些局部变量。所包含模块的“导出变量”中的任何更改均不应破坏您的代码。

访问导入模块上的属性(具有自选名称)是一种方法。这与Python import app或相当import app as g

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

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

有什么办法可以自动执行此操作?

是的,不是。您 不应该这样 做,但是可以-就像Python的皱眉一样from app import *。引用他们说的话,对于JavaScript同样如此:

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

请注意,通常不赞成*从模块或包中进行导入,因为这通常会导致可读性差的代码。但是,可以使用它来保存交互式会话中的键入。

with (require("app.js")) {
    …
}
2020-05-01