将requireJS模块用作单例是不好的做法吗?

Kar*_*hik 40 javascript 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;
    });
Run Code Online (Sandbox Code Playgroud)

非常感谢...

ggo*_*zad 37

不,我想不出反对使用带有require.js的单身人士的原因.

您的模块定义应导出单例.你做的方式很好,因为它是一个单身,你也可以避免new.我喜欢用的东西

define(function (require) {
    var singleton = function () {
        return {
            ...
        };
    };
    return singleton();
});
Run Code Online (Sandbox Code Playgroud)

require模块的第一个将加载并导出它.需要你的单身人士的其他一些模块将只重用已经导出的模块.

  • 因为它是一个单例,所以对象文字是合适的.没有构造函数,原型和所有你需要的东西,如果这不是一个单一的... (4认同)
  • 谢谢你的回答.然而,我不清楚避免"新"的好处是什么?或者,我应该问,为什么在上述情况下避免"新"更好?无论如何模块只加载一次,所以*new*只执行一次!?你能评论一下吗? (2认同)
  • 为什么不简单地返回{/*code*/},因为你已经在define中有一个闭包,并且可以在那里放置私有? (2认同)

Fuh*_*tor 8

这会在稍后阶段回来咬我吗?

我从这里开始使用已接受答案的模式,但是我的单页JavaScript应用程序变成了一个主线程和一个Web工作者,因为它进行了大量的计算并且页面没有响应.

当我将一些模块移动到Web工作者时,出现了奇怪的行为.我花了很多时间来弄明白,但我意识到我的一些requirejs模块(即单身人士)被加载了两次.

我发现如果主线程中需要单例模块以及在web worker中运行的模块中,单例模块将在web worker中第二次加载(因此它不是真正的单例).一个副本位于主线程中,另一个副本位于Web工作线程中.如果你的单件存储变量,你将有两个副本.

这一切都有意义,因为工作者和主线程有单独的地址空间(也许这就是为什么我有一个downvote?).我在这里发布答案是因为有人可能遇到同样的问题,因为requirejs中没有警告.

解决方案(在我的例子中)不是在main和web worker线程之间混合模块.这可能是一个很大的设计约束,在Java或C#等环境中不一定是个问题.