2014-02-04 2 views
2

У меня есть переменные в app.js:Можно ли импортировать переменные в JavaScript (node.js)?

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

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

Таким образом, я могу экспортировать переменные в объекте G, и в то же время, может получить доступ к переменной непосредственно писать DATA без G. префикса.

Пока все хорошо.

Теперь я хочу, чтобы запустить тест для app.js в test.js:

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

Это работает, но я также хочу, чтобы получить доступ к переменной непосредственно писать DATA без G. префикса как console.log(DATA); // -> DATA

Несомненно, я мог бы сделать как

var DATA = G.DATA; для каждого экспорта переменных (свойства) & требуется модуль G, но, очевидно, это утомительный процесс добавления каждой переменной в тестовый файл вручную для соответствия объектам G.

Есть ли способ сделать это автоматически?

До сих пор, я pessmistic так

JS function охватывает var в собственной области, так что в теории нет никакого способа, чтобы иметь вспомогательную функцию, чтобы var для каждого объекта имущества.

Спасибо.

PS. Я хотел бы избежать любого решения eval или VM. Я пробовал их в прошлом и слишком много проблем.

+5

Это вообще плохая идея. – SLaks

+1

Пожалуйста, объясните, почему вы хотите получить доступ к этим переменным напрямую, поэтому мы можем предложить лучший подход. –

+0

Хорошо, мой проект в основном является интерпретатором поверх JS, например 'coffee-script', и я хочу иметь переменную' DATA' как 'DATA', а не' G.DATA' в процессе тестирования. Пока у меня есть тестовый код в том же файле 'app.js', но, если возможно, я хочу экспортировать переменные в Object (в данном случае' G') в отдельный файл - test.js'. –

ответ

7

я мог Назначьте локальные переменные для каждого экспорта свойство & требуемого объекта модуль G, но, очевидно, это трудоемкий процесс, чтобы добавить каждую переменную в тестовый файл вручную, чтобы соответствовать объекты G.

Нет, вот как это должно работать. Вы - и только вы - отвечаете за то, какие локальные переменные существуют в вашем объеме модуля. Никакие изменения в «экспортных переменных» включенного модуля не должны нарушать ваш код.

Доступ к свойствам импортированного модуля (с самовыбранным именем) - это путь. Это вполне эквивалентно Python import app или import app as g.

Если вы хотите, чтобы определенные свойства были локальными, вы обычно выбираете их вручную, как в Python's from app import DATA, F1. В JS вам понадобится multiple var statement, как тот, который вы указали в своем вопросе. Однако есть функция синтаксиса, называемая destructuring assignment, которая сделает это более жидким.Вы можете использовать это в JavaScript 1.7+ (Gecko), CoffeeScript или EcmaScript 6:

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

Есть ли способ сделать это автоматически?

Да и Нет. Вы не должны сделать это, но вы можете - так же, как в Python нахмурился-на from app import *. Приведу what they say, что в равной степени относится и к JavaScript:

[Он] вводит неизвестный набор имен в интерпретатор, возможно, скрывая некоторые вещи, которые вы уже определили.

Обратите внимание, что в целом практика импорта * с модуля или пакет не одобряется, поскольку он часто вызывает плохо читаемый код. Тем не менее, это нормально использовать для сохранения ввода в интерактивные сеансы.

В JavaScript вы можете [1]use the with-statement:

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

[1]: Not in ES5.1 strict mode, хотя - что рекомендуется для оптимизации

+0

Благодарим вас за подробную инструкцию. –

Смежные вопросы