2016-08-30 89 views
4

为了让我的库更具可移植性,我一直在阅读AMD和CommonJS。我首先注意到的一件事就是他们使用目录结构的方式,并且旨在为每个文件创建一个模块。从我可以告诉他们的'命名空间'与目录树一致。然而,我自己的代码使用全局对象作为命名空间,然后在我的各种文件中,无论目录如何,我都向这个对象添加类。如何在JavaScript中使用名称空间对象以及AMD?

(function (Twifty) { 
    // Add objects to the Twifty namespace 
    return Twifty; 
}(Twifty || {})); 

在升级过程中,我试图支持AMD和CommonJs。有很多关于如何做到这一点的文章,但我无法围绕AMD define函数打包。这里是我正在转变上面的代码:

(function (root, factory) { 

    // Define the namespace if it doesn't exist 
    var Twifty = root.Twifty || {}; 

    'use strict'; 
    if (typeof define === 'function' && define.amd) { 
     // AMD is used - Register as an anonymous module. 
     define([], factory); 
    } else if (typeof exports === 'object') { 
     // CommonJS is used - Twifty is a namespace and doesn't need to be required 
     factory(Twifty); 
    } else { 
     // Neither AMD nor CommonJS used. Use global variables. 
     if (!document) { 
      throw 'twifty-map requires a DOM object'; 
     } 
     root.Twifty = factory(Twifty); 
    } 

}(this, function(Twifty) { 
    // Add objects to the Twifty namespace 
    return Twifty; 
})); 

的问题是与AMD define。工厂需要一个Twifty对象,但由于它不是一个模块,我不能将它作为依赖项添加。我该如何处理?

移除名称空间并不是真的有用,因为这会破坏依赖它的任何代码。

对不起,如果这是一个微不足道的问题。

+0

当你的库被加载为AMD模块时,是否有任何原因'root.Twifty'应该存在?看到,使用AMD的原因之一就是防止在全球范围内拥有一切。由于歇斯底里的原因,一些被设计为加载为AMD库的旧库默认情况下泄漏到全局空间中(例如jQuery)。通常这是因为有第三方扩展(例如jQuery插件),否则无法工作,因为扩展创建时,扩展的库不支持AMD。对于新图书馆,你真的**应该避免泄漏到全球空间。 – Louis

+0

@路易这是有道理的。从我所了解的情况来看,这个对象被传递而不是被附加。但是,我仍然回到创建'Twifty'对象的相同问题。代码应该支持AMD,但不会被卡住。 IE,如果使用标准的'