使用requireJS模块作为单例是不好的做法?

我打算使用以下模式来使用基于requireJS的模块作为单例。 请注意, classA返回types为“classA”的实例,而类classB,classC和main的其余部分则返回模块中类的types。 所有这些都是基于MooTools类的类。

这个想法是使用classA作为全局可用的单例,这些方法只是填充。 任何想法,如果这是一个可以接受的模式使用?

这会在稍后阶段回来咬我吗? 我还没有尝试在项目上运行r.js,所以我有点担心,并寻求一些build议。

// 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,因为它进行了大量的计算,页面没有响应。

当我将一些模块移入networking工作者时,出现了一些奇怪的现象。 我花了很多时间弄清楚,但是我意识到我的一些requirejs模块(即单例)被加载了两次。

我发现,如果在主线程中需要单例模块,而且在web worker中运行的模块中 ,单例模块将在web worker中第二次加载(所以它不是一个单例模块)。 一个副本在主线程中,另一个在web工作者中。 如果你的单身人士存储variables,你将有两个副本。

这一切都是有道理的,因为工作者和主线程有不同的地址空间(也许这就是为什么我得到了一个downvote?)。 我在这里发布答案,因为有人可能遇到相同的问题,因为在requirejs没有警告。

解决scheme(在我的情况下)不是混合主和web工作线程之间的模块。 这可能是一个很大的devise约束,在Java或C#等环境中不一定是问题。