É possível importar variables ​​em JavaScript (node.js)?

Eu tenho variables ​​em app.js :

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

Dessa maneira, posso exportar variables ​​sob o object G e, ao mesmo tempo, acessar a variável diretamente escrevendo DATA sem o prefixo G.

Por enquanto, tudo bem.

Agora, quero executar um teste para app.js no test.js :

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

Isso funciona, mas eu também quero acessar a variável diretamente escrevendo DATA sem o prefixo G. como console.log(DATA); // -> DATA console.log(DATA); // -> DATA

Certamente, eu poderia fazer como

var DATA = G.DATA; para cada exportação de variables ​​(propriedade) e object módulo G requerido, mas obviamente é um processo tedioso adicionar manualmente todas as variables ​​ao arquivo de teste para corresponder aos objects G

Existe alguma maneira de fazer isso automaticamente?

Até agora, sou pessimista desde

A function JS inclui var no próprio escopo, portanto, em teoria, não há como ter uma function auxiliar para var para cada propriedade de object.

Obrigado.

PS. Eu gostaria de evitar qualquer eval ou VM de solução de nó. Eu tentei eles no passado e muitos problemas.

Eu poderia atribuir variables ​​locais para cada exportação de propriedade e object G módulo requerido, mas obviamente é um processo tedioso adicionar manualmente todas as variables ​​ao arquivo de teste para corresponder aos objects G.

Não, é assim que funciona. Você – e somente você – está encarregado de quais variables ​​locais existem no escopo de seu módulo. Nenhuma alteração nas “variables ​​de exportação” de um módulo incluído deve quebrar seu código.

Acessar propriedades no módulo importado (com um nome auto-escolhido) é o caminho a percorrer. Isso é bastante equivalente ao import app import app as g ou ao import app do Python import app as g .

Se você quiser algumas propriedades particulares como variables ​​locais, você normalmente as escolherá manualmente, como no from app import DATA, F1 Python from app import DATA, F1 . No JS, você precisará de uma instrução var múltipla, como a que você mostrou na sua pergunta. No entanto, existe um recurso de syntax chamado designação de desestruturação que tornará isso mais fluido. Você pode usar isso em JavaScript 1.7+ (Gecko) , CoffeeScript ou EcmaScript 6 :

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

Existe alguma maneira de fazer isso automaticamente?

Sim e Não. Você não deve fazer isso, mas você pode – assim como o Python é desaprovado from app import * . Para citar o que eles dizem , o que é igualmente verdadeiro para o JavaScript:

[It] introduz um conjunto desconhecido de nomes no interpretador, possivelmente ocultando algumas coisas que você já definiu.

Note que, em geral, a prática de importar * partir de um módulo ou pacote é desaprovada, uma vez que freqüentemente causa código mal legível. No entanto, não há problema em usá-lo para salvar a digitação em sessões interativas.

Em JavaScript, você pode [1] usar o with -statement :

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

[1]: Não no modo estrito ES5.1 , embora – o que é recomendado para otimização