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

У меня есть переменные в app.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 объекты.

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

Пока что я пессимистична

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

Благодарю.

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

1 ответ

Решение

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

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

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

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

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

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

Да и нет. Вы не должны этого делать, но вы можете - как нахмурившийся Питон from app import *, Чтобы процитировать то, что они говорят, что в равной степени верно для JavaScript:

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

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

В JavaScript вы можете [1] использовать with Заявление:

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

[1]: Не в строгом режиме ES5.1, что рекомендуется для оптимизации

Другие вопросы по тегам