シングルトンとして機能する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;
});
よろしくお願いします...
いいえ、require.jsでシングルトンを使用する理由は考えられません。
モジュール定義はシングルトンをエクスポートする必要があります。シングルトンなので、new
を回避できる場合もあります。私はのようなものを使用します
define(function (require) {
var singleton = function () {
return {
...
};
};
return singleton();
});
モジュールの最初のrequire
は、それをロードしてエクスポートします。シングルトンを必要とする他のいくつかのモジュールは、すでにエクスポートされたものを再利用します。
これは後の段階で私を噛むために戻ってきますか?
私はここで受け入れられた回答のパターンから始めましたが、私の単一ページのJavaScriptアプリはメインスレッドと web worker に変化しました。
一部のモジュールをWebワーカーに移動したところ、奇妙な動作がありました。それを理解するのに長い時間がかかりましたが、requirejsモジュールの一部(つまりシングルトン)が2回ロードされていることに気付きました。
私が見つけたのは、メイントンと Webワーカーで実行されるモジュール にシングルトンモジュールが必要な場合、シングルトンモジュールがWebワーカーに2回目に読み込まれることです(など)実際にはシングルトンではありません)。 1つのコピーはメインスレッドにあり、もう1つのコピーはWebワーカーにあります。シングルトンが変数を格納する場合、2つのコピーが作成されます。
ワーカーとメインスレッドが別々のアドレススペースを持っているので、それはすべて理にかなっています(おそらくこれが私が反対票を投じた理由ですか?)。 requirejsに警告がないので誰かが同じ問題に遭遇するかもしれないので、ここに答えを投稿します。
解決策(私の場合)は、メインワーカースレッドとWebワーカースレッドの間でモジュールを混在させることではありませんでした。これは、JavaまたはC#などの環境では必ずしも問題ではない、大きな設計上の制約になる可能性があります。