2013-01-31 165 views
0

TL;问题底部的DR,用于那些不想阅读我所有垃圾的人。将代码转换为RequireJS

我目前的JavaScript模块化方法是简单地创建一个全局锚,比如“csc”(我的公司首字母缩写词),然后开始将模块添加到该锚上。

所以我会拥有一个全球性的结构,如:

csc. 
    Utils 
    Map 
     .Geolocation 
    Storage. 
      Cookie 
      DB 

而且每个文件都存储在目录结构:

csc.js 
csc.Utils.js 
csc.Map.js 
csc.Storage.js 

这样就无需加载我的整个代码库。

我试图转向使用RequireJS,但该库使用的方法似乎有点不同。为了保持我的命名空间结构,我可以在我的所有模块中定义模块,但仍然将它们粘贴到全局“csc”引用中。然而这似乎违背了Require的核心原则。

没有让他们全球性的,但是,我失去了我很好的命名空间,如“csc.Map.Geolocation”因为我现在有一堆独立的变量,就像这样:

require(['csc', 'csc.Utils', 'csc.Map'], function (csc, utils, map) { 
}); 

我脱光我的问题到本质,万一我可怕的以上描述并不足以:

有没有一种方法,也许是模块定义中,这三个变量恢复合并到在这个问题上所定义的结构?或者,我是否全力以赴,我是否应该坚持要求做事的方式? 我很喜欢遵循Require方法,但我也很喜欢将所有模块链接起来并命名空间的能力。

+1

AMD的主要优势之一是失去对命名空间的依赖。尝试拥抱它。没有技术理由继续使用它们。 –

回答

1

不要因为文档的示例路径层次结构而感到灰心,请注意,require并不严格执行任何特定的约定。您可以自由设计并遵循您自己的惯例。

UtilsMapStorage全部成为目录。他们执行基本动作应该被命名为在其各自的目录module.js,就像这样:

core.js 
Utils/ 
     module.js 
Map/ 
    module.js 
    geolocation.module.js 
Storage/ 
     module.js 
     cookie.module.js 
     db.module.js 

module.js文件包含并返回自己的孩子。下面是存储/ module.js的一个示例:

require(["Storage/cookie", "Storage/db"], function (cookie, db) { 
    var Storage = {}; 
    // do whatever you need with Storage 
    Storage.cookie = cookie 
    Storage.db = db 

    return Storage 
}); 

还要注意core.js文件中根。该文件将工作完全一样,

require(["Utils/module", "Storage/module", "Map/module"], function (utils, storage, map) { 
    var Core = {}; 
    // do whatever you need with Storage 
    Core.Utils = utils 
    Core.Storage = storage 
    Core.Map = map 

    return Core 
}); 

现在,需要core.js无论你将需要访问这些模块(每个文件基本)。是的,这将加载开发的所有相关文件,但是当您编译应用程序时,所有变量都将在匿名函数的范围内,并且不能通过窗口对象直接访问。

再一次,按照你认为合适的方式调整它,这是你自己的惯例。