Как избежать добавления экспорта модуля JavaScript ES6 в глобальную область для использования в обычных блоках скрипта?

1

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

Возможно, это правильная техника (и я нашел более старый вопрос, который в основном был таким же, как я), но мне все еще не кажется, что я должен загрязнять глобальное пространство имен, как это. Предполагая, что плохо, что еще я должен делать?

  • 0
    Если вы хотите, чтобы эта функция была доступна глобально, единственный способ добиться этого - поместить ее в глобальную область. Если я не понимаю ваш вопрос? Немного более приятный способ поместить вещи в глобальную область видимости состоит в том, чтобы иметь какой-то globals объект, который содержит все ваши глобальные переменные, вместо того, чтобы помещать фактические имена функций / свойств в window которое потенциально может вызвать конфликты. Таким образом, вы бы сказали, что globals.foo() вместо window.foo()
  • 0
    Поместите его в глобальное пространство имен, как до ES6?
Показать ещё 4 комментария
Теги:
es6-modules

1 ответ

1
Лучший ответ

Если вы хотите, чтобы функция была доступна глобально, единственный способ добиться этого - разместить ее в глобальной области (AKA - объект window).

Однако немного лучше использовать вещи в глобальной области видимости - это иметь какой-то объект globals объектов, который содержит все ваши глобальные переменные, вместо того, чтобы помещать имена функций/свойств непосредственно в объект window что может потенциально вызвать конфликты с другими сторонних библиотек.

Поэтому вы бы сказали globals.foo() вместо window.foo()

Ещё вопросы

Сообщество Overcoder
Наверх
Меню