Глобальные переменные для узла.стандартные модули js?
Я знаю, что глобальные переменные-это плохо.
но если я использую модуль узла "util" в 40 файлах в моей структуре, не лучше ли просто объявить его как глобальную переменную, например:
util = require('util');
в индекс.js-файл вместо записи этой строки в 40 файлах?
потому что я часто использую те же 5-10 модулей в каждом файле, что бы сэкономить много времени вместо копирования вставить все время.
разве сухое не хорошо в этом случае?
6 ответов:
каждый модуль должен быть независимым. Требование не стоит ничего в любом случае после первого для каждого модуля.
а если вы хотите проверить только один модуль? У вас будет много проблем, потому что он не распознает некоторые "глобальные" требования, которые у вас есть в вашем приложении.
да, глобалы плохие, даже в этом случае. Глобалы почти всегда разрушают: тестируемость, инкапсуляцию и простоту обслуживания.
обновленный ответ Ян. 2012The
globalобъект теперь является глобальным внутри каждого модуля. Поэтому каждый раз, когда вы назначаете глобальную переменную (Без области видимости) внутри модуля, это становится частью
вы могли бы просто иметь общий модуль.
общие.js:
Common = { util: require('util'), fs: require('fs'), path: require('path') }; module.exports = Common;приложение.js:
var Common = require('./common.js'); console.log(Common.util.inspect(Common));
global.util = require('util');есть раздел о глобальных объектах в узел документация.
тем не менее, их следует использовать с осторожностью. Добавляя модули в глобальное пространство, вы уменьшаете тестируемость и инкапсуляцию. Но есть случаи, когда использование этого метода приемлемо. Например, я добавляю функции и объекты в глобальное пространство имен для использования в моих сценариях модульного тестирования.
меня смущают ответы в этой теме.
Я в состоянии сделать это...
File: test.js
global.mytest = { x: 3, y: function() { console.log('Works.'); } };File: test2.js
: сервер.jsconsole.log('Does this work?'); mytest.y();require('test.js'); require('test2.js');и это, кажется, работает как вопрос, необходимый. Первый require помещает объект mytest в глобальную область, затем второй require может получить доступ к этому объекту без каких-либо других квалификаторов.
Я пытался понять это (что привело меня к эта тема из поиска Google), и я хотел опубликовать то, что, кажется, работает для меня сейчас. Может быть, все изменилось с тех пор, как появились оригинальные ответы.
Я успешно использую
processобъект для передачи вокруг моего объекта конфигурации. Хотя теоретически он страдает от тех же проблем, что и упомянутые выше (инкапсуляция, тестируемость и т. д.), Он отлично работает при использовании только негосударственных модифицирующих свойств (хэш-таблица с примитивами, в основном).
Если вы обернете свои модули в блоки (например, функции anon), вы можете привязать их к локальному имени (через параметр или 'var'), а затем иметь любое произвольное длинное (возможно, "пакет" помечен) имя, которое вы хотите (если вам даже нужно глобальное на данный момент).
например, мои модули часто выглядят так:
;(function ($, $exp, other) { $(...) other.xyz() $exp.MyExportedObject = ...; })(jQuery, window, some_module.other_expression) // end moduleЯ использую jQuery с noConflict, это первое, а последнее показывает, что вы можете сделать это для любого выражения-глобального, требуемого, вычисленного, встроенного, любого... это же "оберточный" подход может быть использован для устранения всех (или почти всех) "специальных именованных" глобалов-глобалы должны существовать на каком-то уровне, однако удаление потенциальных конфликтов-очень большая победа.
Comments