Мне до сих пор удалось избежать хардкорного программирования JavaScript, но похоже, что это подходит к концу. В процессе подготовки к крупному новому проекту я пытаюсь задуматься о лучших практиках в 2018 году. Я много читал о различных модульных подходах и использовал некоторые из них, такие как модули на базе Dojo AMD. Размышляя о том, как создать свою собственную модульную архитектуру, похоже, что ES6 - это правильный путь для новой разработки. До сих пор я понимаю синтаксис импорта/экспорта и получил некоторые простые модули для работы. Но мой текущий метод загрузки модулей обратно в HTML и их использование просто "чувствует себя не так". Позвольте мне сварить то, что я работаю до сих пор.
Модуль foo.js
import (bar} from '/Scripts/bar.js'
export function foo() {
bar();
console.log("I'm in foo");
}
Модуль bar.js
export function bar() {
console.log("I'm in bar");
}
index.html
<head>
<script type="module">
import {foo} from "/Scripts/foo.js"
window.foo = foo; // save for later but "feels wrong"
</script>
</head>
<body>
<script>
// foo(); // doesn't work - foo by itself is only defined in the module scope
window.foo(); // unless "stashed" somewhere else
</script>
</body>
Возможно, это правильная техника (и я нашел более старый вопрос, который в основном был таким же, как я), но мне все еще не кажется, что я должен загрязнять глобальное пространство имен, как это. Предполагая, что плохо, что еще я должен делать?
Если вы хотите, чтобы функция была доступна глобально, единственный способ добиться этого - разместить ее в глобальной области (AKA - объект window
).
Однако немного лучше использовать вещи в глобальной области видимости - это иметь какой-то объект globals
объектов, который содержит все ваши глобальные переменные, вместо того, чтобы помещать имена функций/свойств непосредственно в объект window
что может потенциально вызвать конфликты с другими сторонних библиотек.
Поэтому вы бы сказали globals.foo()
вместо window.foo()
globals
объект, который содержит все ваши глобальные переменные, вместо того, чтобы помещать фактические имена функций / свойств вwindow
которое потенциально может вызвать конфликты. Таким образом, вы бы сказали, чтоglobals.foo()
вместоwindow.foo()