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

IT技术 javascript node.js
2021-02-04 07:32:31

我有变量app.js

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

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

这样我就可以导出对象下的变量G,同时可以DATA不加G.前缀直接写访问变量

到现在为止还挺好。

现在,我想in进行测试app.jstest.js

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

这有效,但我也想直接访问变量DATA而不使用G.前缀,例如console.log(DATA); // -> DATA

当然,我可以这样做

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

有没有办法自动执行此操作?

到目前为止,我很悲观,因为

JSfunction包含var在自己的范围内,所以理论上没有办法var为每个对象属性提供一个辅助函数

谢谢。

附注。我想避免任何evalVM节点解决方案。我过去尝试过它们,但问题太多。

1个回答

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

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

访问导入module上的属性(使用自己选择的名称)是要走的路。这与 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");

有没有办法自动执行此操作?

是和否。你不应该这样做,但你可以 - 就像 Python 的皱眉from app import *引用他们所说的话,这对 JavaScript 来说同样适用:

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

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

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

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

[1]:虽然不是在 ES5.1严格模式中- 推荐用于优化

谢谢你的详细指导。
2021-03-30 07:32:31