Можно ли импортировать переменные в 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, что рекомендуется для оптимизации