Доступ к экземплярам объектов во всех модулях ES6 с помощью свертки пакетов

#javascript #karma-runner #es6-modules #qunit #rollupjs

Вопрос:

Я немного застрял здесь и был бы признателен за некоторую помощь в этом вопросе.

Я разрабатываю часть веб-приложения. Код в основном написан в стиле ООП. Код состоит из модулей, каждый из которых содержит класс, экземпляр которого создается в объекте (Боковая панель, Топнав, панель поиска,…), в основном синглеты (не мой выбор, но поехали).

Модули собираются в комплекте с использованием rollup.js. Тесты выполняются через QUnit и Karma.

Проблема, с которой я сталкиваюсь, заключается в том, что мне нужно, чтобы некоторые объекты были глобально доступны — например, если mainmenu объект обнаруживает sidebar , что объект свернут, объект mainmenu выполняет свой метод mainmenu.doThis() или даже sidebar.doThat() .

 export class Sidebar {
    static initialize(ctx) {
        let elem = $('#sidebar-element', ctx);
        return new Sidebar(elem);
    }
    constructor(elem) {
        this.elem = elem;
        this.collapsed = false;

        this._toggle = this.toggle_this.bind(this);
        $('#button').on('click', this._toggle);
    }
    toggle_this() {
        this.collapsed = !this.collapsed;
    }
}
 

и в разных модулях:

 export class Mainmenu {
    static initialize(ctx) {
        let elem = $('#mm-element', ctx);
        return new Mainmenu(elem);
    }
    constructor(elem) {
        this.elem = elem;
        if( sidebar_instance.collapsed === true ) {
             do_that();
        }
    }
    do_that() {
        console.log('I did that!');
    }
}

 

Перед разделением на модули все экземпляры были сохранены в глобальном пространстве имен — так namespace.sidebar namespace.mainmenu вы его называете. Если объект не существовал, он определялся как null .

Мне интересно, каков подход «наиболее эффективной практики» к достижению чего-то подобного при использовании модулей ES6.

То, что я придумал до сих пор:

  • снова сохраните каждый объект в глобальном пространстве имен
  • сохраняйте только определенные свойства и методы, которые мне нужны в глобальном объекте
  • передайте объект в конструктор другого объекта (там их будет довольно много)

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