web-dev-qa-db-ja.com

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;
    });

よろしくお願いします...

40
Karthik

いいえ、require.jsでシングルトンを使用する理由は考えられません。

モジュール定義はシングルトンをエクスポートする必要があります。シングルトンなので、newを回避できる場合もあります。私はのようなものを使用します

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

モジュールの最初のrequireは、それをロードしてエクスポートします。シングルトンを必要とする他のいくつかのモジュールは、すでにエクスポートされたものを再利用します。

37
ggozad

これは後の段階で私を噛むために戻ってきますか?

私はここで受け入れられた回答のパターンから始めましたが、私の単一ページのJavaScriptアプリはメインスレッドと web worker に変化しました。

一部のモジュールをWebワーカーに移動したところ、奇妙な動作がありました。それを理解するのに長い時間がかかりましたが、requirejsモジュールの一部(つまりシングルトン)が2回ロードされていることに気付きました。

私が見つけたのは、メイントンと Webワーカーで実行されるモジュール にシングルトンモジュールが必要な場合、シングルトンモジュールがWebワーカーに2回目に読み込まれることです(など)実際にはシングルトンではありません)。 1つのコピーはメインスレッドにあり、もう1つのコピーはWebワーカーにあります。シングルトンが変数を格納する場合、2つのコピーが作成されます。

ワーカーとメインスレッドが別々のアドレススペースを持っているので、それはすべて理にかなっています(おそらくこれが私が反対票を投じた理由ですか?)。 requirejsに警告がないので誰かが同じ問題に遭遇するかもしれないので、ここに答えを投稿します。

解決策(私の場合)は、メインワーカースレッドとWebワーカースレッドの間でモジュールを混在させることではありませんでした。これは、JavaまたはC#などの環境では必ずしも問題ではない、大きな設計上の制約になる可能性があります。

8
Fuhrmanator