Неправильно ли использовать модуль 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;
});
Спасибо большое заблаговременно...
Ответы
Ответ 1
Нет, я не могу придумать причину против использования синглтонов с require.js.
В вашем определении модуля должен быть экспортирован синглтон. То, как вы это делаете, прекрасно, так как это односторонний вы также можете избежать new
. Я использую что-то вроде
define(function (require) {
var singleton = function () {
return {
...
};
};
return singleton();
});
Первый require
к модулю будет загружать и экспортировать его. Некоторый другой модуль, требующий вашего синглтона, будет просто повторно использовать уже экспортированный.
Ответ 2
Будет ли это возвращаться, чтобы укусить меня на более позднем этапе?
Я начал с шаблона принятого ответа здесь, но одностраничное приложение JavaScript превратилось в основной поток и веб-работник потому что он делал много расчетов, и страница не реагировала.
Когда я переместил некоторые из модулей в веб-рабочего, было странное поведение. Мне потребовалось много времени, чтобы понять это, но я понял, что некоторые из моих модулей requirejs (а именно, синглтоны) загружаются дважды.
То, что я узнал, было то, что если в основном потоке требуется модуль singleton, а также в модулях, которые выполняются в веб-работнике, модуль singleton будет загружен второй раз в веб-работнике (и поэтому он не является синглом). Один экземпляр находится в основном потоке, другой - в веб-работнике. Если ваш singleton хранит переменные, у вас будет две копии.
Все имеет смысл, так как рабочий и основной поток имеют отдельные адресные пространства (возможно, именно поэтому я получил downvote?). Я отправляю ответ здесь, потому что кто-то может столкнуться с той же проблемой, что и предупреждение в requirejs.
Решение (в моем случае) заключалось в том, чтобы не смешивать модули между потоком основного и веб-рабочего. Это может быть большим конструктивным ограничением, которое не обязательно является проблемой в таких средах, как Java или С#.