Плохо ли использовать модуль requireJS в качестве одиночного? - PullRequest
40 голосов
/ 16 марта 2012

Я планирую использовать следующий шаблон, чтобы использовать модуль на основе 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;
    });

Заранее большое спасибо ...

Ответы [ 2 ]

37 голосов
/ 18 марта 2012

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

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

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

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

8 голосов
/ 13 октября 2015

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

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

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

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

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

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

...