Подтвердить что ты не робот

Неправильно ли использовать модуль requireJS в качестве одноэлементного?

Я планирую использовать следующий шаблон, чтобы использовать модуль на основе requireJS, чтобы действовать как одиночный. Обратите внимание, что classA возвращает экземпляр типа 'classA', тогда как остальные классы classB, classC и main возвращают тип класса из модуля. Все это классы, основанные на классе MooTools.

Идея состоит в том, чтобы использовать classA как глобально доступный синглтон, методы - это просто наполнители. Любые мысли, если это приемлемый шаблон для использования?

Будет ли это возвращаться, чтобы укусить меня на более позднем этапе? Я еще не пытался запускать r.js в проекте, поэтому я немного волнуюсь и ищу некоторые рекомендации.

    // classA.js
    define([], function() {
        var classA = new Class({

            initialize: function (regionId) {
                // perform some Initialization.
                this.data = null;
            },

            doSomething: function(param) {
                // some thing.
                this.data = param;
            }
        };

        return new classA();
    });

    // classB.js
    define(["classA"], function(classA) {
        var classB = new Class({

            initialize: function (regionId) {
                // perform some Initialization.
            },

            doSomethingElse: function() {
                // some thing.
                classA.doSomething("Go back to Work Now!");
            }
        };

        return classB;
    });


    // classC.js
    define(["classA"], function(classA) {
        var classB = new Class({

            initialize: function (regionId) {
                // perform some Initialization.
            },

            doSomethingElse: function() {
                // some thing.
                classA.doSomething("Time to Play!");
            }
        };

        return classC;
    });


    // main.js
    define(["classA", "classB", "classC"], function(classA, classB, classC) {
        var main = new Class({

            initialize: function (regionId) {
                // perform some Initialization.
                this.b = new classB();
                this.c = new classC();
            },

            doEverything: function() {
                // some thing.
                this.b.doSomethingElse();
                classA.doSomething("Nap Time!");
            }
        };

        return main;
    });

Спасибо большое заблаговременно...

4b9b3361

Ответ 1

Нет, я не могу придумать причину против использования синглтонов с require.js.

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

define(function (require) {
    var singleton = function () {
        return {
            ...
        };
    };
    return singleton();
});

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

Ответ 2

Будет ли это возвращаться, чтобы укусить меня на более позднем этапе?

Я начал с шаблона принятого ответа здесь, но одностраничное приложение JavaScript превратилось в основной поток и веб-работник потому что он делал много расчетов, и страница не реагировала.

Когда я переместил некоторые из модулей в веб-рабочего, было странное поведение. Мне потребовалось много времени, чтобы понять это, но я понял, что некоторые из моих модулей requirejs (а именно, синглтоны) загружаются дважды.

То, что я узнал, было то, что если в основном потоке требуется модуль singleton, а также в модулях, которые выполняются в веб-работнике, модуль singleton будет загружен второй раз в веб-работнике (и поэтому он не является синглом). Один экземпляр находится в основном потоке, другой - в веб-работнике. Если ваш singleton хранит переменные, у вас будет две копии.

Все имеет смысл, так как рабочий и основной поток имеют отдельные адресные пространства (возможно, именно поэтому я получил downvote?). Я отправляю ответ здесь, потому что кто-то может столкнуться с той же проблемой, что и предупреждение в requirejs.

Решение (в моем случае) заключалось в том, чтобы не смешивать модули между потоком основного и веб-рабочего. Это может быть большим конструктивным ограничением, которое не обязательно является проблемой в таких средах, как Java или С#.