0

TL; DR 在问题的底部,对于那些不想阅读我所有垃圾的人。

我目前的 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 做事的方式吗?我很想遵循 Require 方法,但我也喜欢让我的所有模块都可链接和命名空间的能力。

4

1 回答 1

1

不要对文档的示例路径层次结构感到气馁,请注意 require 并没有严格执行任何特定的约定。您可以自由设计和遵循自己的约定。

Utils, Map, 和Storage都成为目录。它们执行的基本操作应module.js在各自的目录中命名,如下所示:

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

这些module.js文件包括并返回他们的孩子。这是 Storage/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。是的,这将在 development 中一直加载所有涉及的文件,但是当你编译你的应用程序时,你的所有变量都将在匿名函数的范围内,并且不能通过 window 对象直接访问。

再次,根据您的需要进行调整,这是您自己的约定。

于 2013-01-31T23:19:08.243 回答