2016-11-23 6 views
0

Я пытался создать быструю систему pub-sub, основанную на localStorage. Этот процесс заставил меня понять, что мое понимание того, как работают модули ES6, является неполным.Модули ES6 - глобальные переменные

const subscribers = {}; 
export default { 
    subscribe (key, callback) { 
    if (!Array.isArray(subscribers[key])) { 
     subscribers[key] = [callback]; 
    } else { 
     subscribers[key] = [...subscribers[key], callback]; 
    } 
    }, 
    publish (key, value) { 
    window.localStorage[key] = value; 
    subscribers[key].forEach(cb => cb(value)); 
    } 
}; 

Я импортировал этот модуль всякий раз, когда хотел подписаться/опубликовать ключ в localStorage. Проблема в том, что объект-подписчик получает повторный инициализацию каждый раз, когда модуль импортируется.

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

Спасибо.

+0

Поскольку браузеры в настоящее время не поддерживают модули, какую систему упаковки вы используете? –

+0

Webpack + Babel + ES6 Modules –

+0

Можете ли вы показать, как вы его используете? Все импорты должны иметь одно и то же состояние модуля (и, когда я тестирую его в буфере памяти). –

ответ

1

Это недосмотр на моем конце.

Я сделал опечатку при импорте этого модуля (капитализации), я указал неправильное имя файла.

Существует еще один модуль с равным именем, когда случай игнорируется. Это может привести к непредвиденному поведению при компиляции в файловой системе с другими case-semantic. Переименуйте модуль, если ожидается несколько модулей, или используйте одинаковый корпус, если ожидается один модуль.

Это привело к повторному инициализации модуля.

Пожалуйста, исправьте меня, если я ошибаюсь, но я считаю, что модуль будет выполняться только один раз для всего приложения при импорте в первый раз.

Спасибо.

Смежные вопросы